【问题标题】:Remapping Emacs Commands重新映射 Emacs 命令
【发布时间】:2012-04-03 10:28:30
【问题描述】:

我想在matlab-mode 中将forward-sexp 重新映射为matlab-forward-sexp

目前我这样做:

(define-key matlab-mode-map [remap forward-sexp] 'matlab-forward-sexp-safe)

但是当我在 matlab 模式下输入 M-x forward-sexp 时,我仍然会得到旧的行为。为什么?只有当我通过键盘快捷键调用forward-sexp 时它才有效吗?

当我输入 C-h f forward-sexp 时,一切似乎都正常:

forward-sexp is an interactive compiled Lisp function in `lisp.el'.

It is remapped to `matlab-forward-sexp-safe', which is bound to C-M-f,
<C-M-right>, ESC <C-right>.

(forward-sexp &optional ARG)



For more information check the manuals.

Move forward across one balanced expression (sexp).
With ARG, do it that many times.  Negative arg -N means
move backward across N balanced expressions.
This command assumes point is not in a string or comment.

This function is advised.

After-advice `ctx-flash'.

[back]

【问题讨论】:

    标签: emacs elisp key-bindings remap


    【解决方案1】:

    如果你真的想改变函数的行为,可以使用forward-sexp-function

    您可能还想查看 Emacs-24 的 octave-mode,它使用 SMIE 进行解析,使 forward-sexp 自动跳过实际的 Octave 句法元素,而不仅仅是 parens/brackets/braces。

    【讨论】:

    • SMIE 是什么意思?解析基础架构?
    【解决方案2】:

    是的,[remap] 语法明确用于键绑定。当绑定调用旧函数时,重新映射会导致它调用新函数。但是,这不会改变任何一个函数的定义——它们仍然可以直接调用。

    详情见M-:(info "(elisp) Remapping Commands")RET

    最近在 Emacs 24 中的一个变化已经澄清了这个帮助文本,所以现在它的内容如下:

    forward-sexp 是 `lisp.el' 中的交互式编译 Lisp 函数。

    它的键被重新映射到“matlab-forward-sexp-safe”。如果没有这种重新映射, 它会绑定到 C-M-f, ,ESC 。 .

    【讨论】:

    • +1 @Nordlöw:还要注意您用于重新映射的函数的名称:(define-key ...)。这已经提示您重新映射仅适用于键盘快捷键。
    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2010-10-05
    • 2011-03-28
    相关资源
    最近更新 更多