【问题标题】:disable package key-binding override in Emacs在 Emacs 中禁用包键绑定覆盖
【发布时间】:2015-01-30 19:31:07
【问题描述】:

这似乎是一些我不明白的基本 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 编辑”。

似乎 vhdl-mode 覆盖了 M-e 键功能,我找不到如何永久更改它。如果我执行 local-unset-key 并取消设置 M-e,我会得到想要的结果,M-e 会进行 p4 编辑,但是当我重新启动 Emacs 时,M-e 会再次执行“vhdl-end-of-statement”。

如何更改 M-e 以永久执行“p4 编辑”?我不精通 Lisp,但很乐意获得如何更改这一点的说明。 谢谢。

【问题讨论】:

  • 请注意,在许多主要模式中,M-e 将设置为相当于语句结尾/句子结尾。您可能会发现在日志运行中重新绑定您的 perforce 绑定更容易。
  • 查看它使用的键盘映射的 VHDL 模式代码 - 它可能是 vhdl-mode-map。在该键盘映射中定义 M-e 为您想要的命令。如有必要(例如,如果一开始未定义模式映射),您可以将 define-key sexp 放在模式挂钩上,以便在打开模式时生效。
  • MrBones,感谢您的建议,我会这样做,这也是更改 perforce 绑定的最简单解决方案(见下文)
  • 德鲁,感谢您的帮助。我似乎无法进入“vhdl-mode-map”,您能否提供详细说明?在 emacs 安装目录中有一个文件 emacs/24.3/lisp/progmodes/vhdl-mode.elc,可能就是定义 vhdl 绑定的地方。它是公开的,所以我无法更改它,但也许我可以将 vhdl 模式定义复制到本地文件,让 emacs 从我可以修改的本地文件中读取定义?

标签: emacs elisp perforce


【解决方案1】:

要从模式键映射中删除覆盖绑定,以便 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 cmets,这些并不是非常理想的自定义绑定。 MsMe 在 Emacs 中都有标准用法(前者通常是一个前缀绑定,一堆有用的东西挂起),如果可能你应该考虑移动这些绑定到其他键。

(我的印象是“现场预装”版本已经有了这些绑定?在这种情况下,对于维护它的人来说,这更像是一个注释......)

【讨论】:

  • 感谢 phils,perforce 绑定是我的 .emacs 文件中的 global-set-key,我可以编辑它们。我决定听从您和 MrBones 的建议,将 perforce 绑定更改为 ESC M-e、ESC M-s 等。eval-after-load 看起来很有用,以备不时之需 :-)。根据我对 Drew 的评论,为了增强我的理解,我该如何修改 vhdl-mode-map? (vhdl-mode.elc)
  • 您使用我上面展示的技术来修改vhdl-mode-map 中的绑定,这是vhdl-mode 的键映射。 eval-after-load 确保您的代码在键盘映射存在之前不会尝试修改它。我在代码中添加了一个progn 包装器和一个额外的示例,以展示如何执行多项操作。如果您希望将一个键绑定到该键映射中的某个命令,您只需将nil 替换为'some-command
猜你喜欢
  • 2013-03-31
  • 2010-10-15
  • 2016-04-05
  • 1970-01-01
  • 2011-07-16
  • 2012-09-18
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
相关资源
最近更新 更多