在Emacs中禁用包的按键绑定覆盖

4
这似乎是我不理解的一些基本的Emacs配置问题。
网站上预安装了Emacs 24.3。在一个Verilog文件中,按下M-s会绑定到p4-current-file "edit"(Perforce操作),类似地,M-e被绑定到p4-current-file "sync"。所有都很好。
问题出在VHDL文件中,M-s做同样的事情,但是M-e被绑定到“vhdl-end-of-statement”。我想让它像在Verilog中那样执行“p4 edit”。
似乎vhdl-mode覆盖了M-e键函数,我找不到如何永久更改它的方法。如果我做local-unset-key并取消M-e,我得到了期望的结果,M-e执行p4 edit,但是当我重新启动Emacs时,M-e再次执行“vhdl-end-of-statement”。
如何永久将M-e更改为执行“p4 edit”?我不精通Lisp,但希望得到如何更改此设置的指示。 谢谢。

请注意,在许多主要模式中,M-e 将被设置为某个等效于语句结尾/句子结尾的内容。长期来看,您可能会发现重新绑定您的 Perforce 绑定更容易些。 - Squidly
在 VHDL 模式代码中查找它使用的键位映射 - 可能是 vhdl-mode-map。在该键位映射中定义 M-e 为您想要的命令。如果必要(例如,如果模式映射在开始时未定义),您可以将该 define-key 表达式放在模式钩子上,以便每当模式打开时都会生效。 - Drew
MrBones,谢谢你的建议,我会这样做的,这也是更改Perforce绑定的最简单的解决方案(请参见下文)。 - avshae
Drew,感谢你的帮助。我似乎无法进入“vhdl-mode-map”,你能否给出详细的说明?在emacs安装目录中有一个文件emacs/24.3/lisp/progmodes/vhdl-mode.elc,可能是vhdl绑定定义的地方。它是公共的,所以我不能更改它,但也许我可以将vhdl-mode定义复制到本地文件中,让emacs从本地文件中读取定义,这样我就可以进行修改了? - avshae
1个回答

5

要从模式按键映射中移除覆盖绑定,使Emacs回到通常使用的状态,通常需要执行以下操作:

(eval-after-load "vhdl-mode"
  '(progn
    (define-key vhdl-mode-map (kbd "M-e") nil) ;; unbind M-e
    (define-key vhdl-mode-map (kbd "M-a") nil))) ;; unbind M-a

如MrBones所评论的那样,这些自定义快捷键并不是很理想。 在Emacs中,M-sM-e都有标准用途(前者通常是一个前缀绑定,其中包含许多有用的功能),如果可能的话,您应该考虑将这些绑定移动到其他按键上。
(我的印象是,“预安装在站点上”的版本已经设置了这些绑定? 如果是这样,那么这只是给维护该版本的人的一个注意事项...)

感谢Phils,Perforce绑定在我的.emacs文件中,我可以编辑它们。我决定遵循你和MrBones的建议,将Perforce绑定更改为ESC M-e、ESC M-s等。eval-after-load看起来很有用,先把它保存下来以备不时之需 :-)。根据我对Drew的评论,并为了加深我对此的理解,我该如何修改vhdl-mode-map?(vhdl-mode.elc) - avshae
您可以使用我上面展示的技巧来修改 vhdl-mode 的键映射,该键映射是 vhdl-mode 的按键映射。 eval-after-load 确保您的代码在该键映射存在之前不会尝试修改它。我已经添加了一个 progn 封装和一个额外的示例代码,以展示如何进行多个操作。如果您想要在该键映射中绑定某个命令的话,只需将 nil 替换为 'some-command 即可。 - phils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接