【问题标题】:writing lisp emacs key binding and cannot specify the <delete> character编写 lisp emacs 键绑定并且不能指定 <delete> 字符
【发布时间】:2010-08-22 15:11:44
【问题描述】:

由于某种原因,我得到了默认的 M-del 键绑定,用于反向杀词映射到匹配括号的扫描并且重置不起作用,所以我试图在 lisp 中设置全局键绑定。所以我在 ~/.emacs.d/init.el 中写了 lisp 命令:

(global-set-key (kbd "M-h") 'backward-kill-word)

(global-set-key (kbd "M-") ‘backward-kill-word)

我用 C-x C-e 尝试了它们,它们都给出了 'backward-kill-word 输出,但只有第一个键绑定工作“M-h”,另一个被忽略,M-del 仍在尝试奇怪的扫描动作。删除键在其他地方的 emacs 中有效,因此似乎“删除”没有映射到 lisp 中的物理键(并且反斜杠仅在该词被注释掉时才显示在此文本中)。知道要使用什么关键字或特殊字符吗? 最好的。

(我查找了可能已覆盖此命令但找不到它们的库)

【问题讨论】:

    标签: emacs keyboard-shortcuts elisp


    【解决方案1】:

    在某些系统上,delete 键被定义为 C-d 的别名。这是通过 GNU Emacs function-key-map 和 GNU Emacs 23 上的 local-function-key-map 来完成的。(我在 X 下的 Debian 和 Ubuntu 10.04 上观察到了这种行为。)这种翻译的目的是将编码模式的人与终端错综复杂:想要隐藏删除命令的模式只需要重新绑定C-d,而不是想知道它是否应该重新绑定delete(是删除左还是删除右?)或deletechar或其他东西。

    如果有delete 的全局或本地绑定,它会将这个转换隐藏到C-d。但是,如果您按ESC delete,如果ESC delete 没有全局或本地绑定,则第二个键将转换为C-d。此翻译优先于将ESC delete 解释为M-delete。所以ESC delete 等同于C-M-d

    这可以说是 Emacs 的一个 bug:ESC delete 的效果应该和M-delete 一样,而且ESC delete 没有理由运行down-list 与删除无关。

    有几种可能的修复方法;我不知道哪个最好。应该适用于任何版本的 Emacs 的是

    (global-set-key [?\e delete] 'backward-kill-word)
    

    【讨论】:

    • (global-set-key [escape delete] 'backward-kill-word) 把它放到 ~/.emacs.d/ 的 init.el 文件中就可以了!!!!跨度>
    • 现在就开始... 使用 (global-set-key [escape delete] 'backward-kill-word) 现在尝试其他元键命令,如 Mw 或 Mb 被翻译成 escape w 或 escape b 未定义... :_(
    • 避免冲突的解决方案是将错误的绑定重新映射回正确的绑定!! (global-set-key (kbd "M-C-d") 'backward-kill-word)
    • @Vass: C-M-d 是一个完美的结合。错误是它被复制到ESC delete。但是我的解决方法确实犯了一个错误。我认为(global-set-key [?\e delete] 'backward-kill-word) 适用于任何版本。
    • 哦,哇,你是对的!!!太棒了,我没想到。我认为,由于您之前的行进行了刷新覆盖,因此这也不起作用,但确实如此。我认为您只能将 init.el 中的绑定重新映射回所需的默认绑定。请修改您的答案以包含此 (global-set-key [?\e delete] 'backward-kill-word) 另一个我在未来乞求它。但是为什么这个工作而不是你以前的工作?有什么本质区别?
    【解决方案2】:

    kbd 的真正好处在于,您在其中键入的内容与 Emacs 显示的字符串相同。所以,试试下面的

    C-h k M-<\delete>       (to use your syntax)
    

    M-x describe-key M-<\delete>
    

    Emacs(对我来说)回应:

    M-DEL(翻译自 ) 运行命令backward-kill-word, 这是一个交互式编译的 Lisp `simple.el' 中的函数。

    绑定到 ,M-DEL。

    (反向杀词 arg)

    ....

    您可以看到表明您想要的密钥的表示形式是M-DELM-delete

    要达到你想要的目标还有很长的路要走

    (global-set-key (kbd "M-delete") 'backward-kill-word)
    

    当然,如果你的 .emacs 中有一些东西覆盖了它,上面的方法也无济于事。您需要找到包含的库并停止使用它(或自定义其行为)。

    【讨论】:

    • 嗨,谢谢,Mx describe-key 和 Ch k M-del 为我提供了“向下列表”的 CMd 映射:CMd(翻译自 )运行命令向下 - list 是 `lisp.el' 中的一个交互式编译的 Lisp 函数。它绑定到 、C-M-d、ESC 。 (down-list &optional arg) 向下移动一级括号。使用 arg,多次执行此操作。否定论点意味着向后移动但仍会下降一个水平。 - 我没有覆盖它,我认为你是对的,因为当我尝试覆盖其他功能时,我得到了错误。那么如何找到包含的库呢?
    • 我到处寻找可以找到 emacs .el 文件的地方,但在哪里找不到库...
    【解决方案3】:

    您可能希望以交互方式调用global-set-key 以查看它如何解释元删除。还可以尝试local-set-key 以确保奇怪的绑定不是特定于模式的。

    【讨论】:

    • 这种情况是否只发生在元删除或其他键序列中?尝试以 &lt;emacs&gt; --no-site-file --no-init-file 启动 emacs。首先检查元删除是否按预期工作。如果是这样,请依次删除每个选项以识别导致此问题的 init 文件。我想知道这是否会有所帮助,因为您甚至可以在本地设置密钥,但值得一试。
    • 感谢回复评论,Gilles上面的答案很有见地!
    【解决方案4】:

    在找不到包含冲突的库后,我找到了这个网页 http://www.cs.cmu.edu/cgi-bin/info2www?%28emacs%29Rebinding

    以交互方式更改键绑定...

    `M-x 全局设置键 KEY CMD ' 全局定义 KEY 运行 CMD....

    通常,C-z' is bound to the function suspend-emacs'(不使用 X Window 系统时),但您可以 更改C-z' to invoke an interactive subshell within Emacs, by binding it toshell'如下:

     M-x global-set-key <RET> C-z shell <RET>
    

    `global-set-key' 读取键后的命令名称。在你之后 按 键,会出现这样的消息,以便您确认 您正在绑定所需的密钥:

     Set key C-z to command:...
    

    现在通过执行返回标准默认值

    M-x global-set-key M-del ...

    后向杀戮词 但这是暂时的,必须在每次重新加载时完成,有什么方法可以使它永久化? 将命令放入 init.el 不会覆盖其他效果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      相关资源
      最近更新 更多