emacs中特定于文件的密钥绑定

Alf*_* M. 3 emacs key-bindings

是否可以在emacs中定义文件特定的键绑定?我想有可能创建一个次要模式,并在特定文件打开时加载它,但只有一个键绑定似乎有点过分.

phi*_*ils 7

如果您将代码local-set-keyEmacs中的缓冲区本地覆盖次模式键绑定相结合,那么您最终可能会遇到以下情况:

(defun my-buffer-local-set-key (key command)
  (interactive "KSet key buffer-locally: \nCSet key %s buffer-locally to command: ")
  (let ((oldmap (current-local-map))
        (newmap (make-sparse-keymap)))
    (when oldmap
      (set-keymap-parent newmap oldmap))
    (define-key newmap key command)
    (use-local-map newmap)))
Run Code Online (Sandbox Code Playgroud)

然后,根据Barmar的回答:

;; Local Variables:
;; eval: (my-buffer-local-set-key (kbd "C-c C-c") 'foo)
;; End:
Run Code Online (Sandbox Code Playgroud)

请注意,次模式映射优先于本地映射.


Bar*_*mar 5

使用eval:文件中的局部变量部分:

;;; Local Variables:
;;; eval: (local-set-key ...)
Run Code Online (Sandbox Code Playgroud)


Dre*_*rew 5

听起来你好像做错了事——这是我的猜测。如果您有一个特定的文件缓冲区,给定的键绑定适合该缓冲区,则专门为其定义一个模式,并将该键绑定到该模式的键映射中。让该模式继承您喜欢的任何其他模式。

例如:

(define-derived-mode my-file-mode org-mode "My file mode")
(define-key 'my-file-mode-map (kbd "SPC") #'org-toggle-checkbox)
Run Code Online (Sandbox Code Playgroud)

你并没有真正描述有关你的上下文的任何内容:你如何访问这个文件(C-x C-f其他东西)?,为什么只有这个文件 - 它有什么特别之处?钥匙有什么用?所以很难给你任何有用的建议。

如果您确实想让某个键对这个特定文件有不同的作用,那么可以定义一个访问该文件的命令(但是您想要访问它),然后在其所有文本上创建覆盖,并使用覆盖属性来keymap添加你的束缚无处不在。这当然听起来很愚蠢,但就目前情况而言,你的问题也是如此。

Emacs 使用缓冲区。缓冲区处于mode状态。文件在这种情况下没有什么意义。一旦文件被访问,它的缓冲区就是您想要使用的内容。

这就是为什么@Barmar 试图根据缓冲区及其模式来回答。您显然不希望这是给定模式的,除非我猜该模式特定于该一个文件。在这种情况下,定义(仅)适用于该文件的模式。

澄清您的问题,也许我们能够为您提供更多帮助。

(听起来这可能是一个XY 问题。)

  • 我的主要建议是直接陈述您的问题,例如,提供更多上下文,而不是询问如何做您认为解决方案应该做的事情(请参阅 XY 问题链接)。我建议这样做是因为我感觉你并不需要你认为你需要的东西。无论如何,要使用带有属性“keymap”的覆盖,请参阅 Elisp 手册,节点“覆盖属性”。但我的猜测是 @phils 的答案是更好的方法。 (2认同)