Emacs中针对特定文件创建按键绑定

3

在Emacs中,是否可以定义特定于文件的按键绑定? 我认为可以创建一个小模式,并在打开特定文件时加载它,但对于仅有一个按键绑定来说,这似乎过于繁琐。


(global-set-key [f5] (lambda ()(interactive)(如果(等于(buffer-name)“* scratch *”)(message“恭喜-您正在在缓冲区%s中执行F5”(buffer-name)))))或者,您可以使用buffer-file-name然后是文件路径。 您也可以使用文件扩展名--例如,(if ...(file-name-extension input-filename) - lawlist
4个回答

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)))

然后,根据Barmar的回答:

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

请注意,次要模式映射比本地映射具有优先级。

6

文件本地变量部分使用eval::

;;; Local Variables:
;;; eval: (local-set-key ...)

1
这不仅仅是为当前的 major-mode 设置绑定吗?那么其他使用此模式的缓冲区也会得到相同的绑定? - abo-abo
嗯,你说得对,本地键映射通常由同一主模式中的所有缓冲区共享。基本思路仍然正确:编写一些代码,在当前缓冲区中进行绑定,并在“本地变量”部分中放置对其的调用。 - Barmar

5

我猜你做错了些事情。如果你有一个特定的文件缓冲区,适合绑定某个键,那么请为其定义一个专门的模式,并在该模式的按键映射中绑定该键。让该模式继承你喜欢的任何其他模式。

例如:

(define-derived-mode my-file-mode org-mode "My file mode")
(define-key 'my-file-mode-map (kbd "SPC") #'org-toggle-checkbox)

您没有描述任何有关上下文的内容:您如何访问此文件(使用C-x C-f或其他方式)?为什么只有这个文件 - 有什么特别之处?按键用于什么?所以很难给您提供任何有用的建议。
如果您真的想让某个按键在特定文件中发挥不同作用,那么也许可以定义一个命令来访问该文件(以您想要访问的任何方式),然后在其所有文本上创建叠加层,并使用叠加层属性keymap在每个位置添加您的绑定。当然,这听起来相当愚蠢,但就目前而言,您的问题也是如此。
Emacs使用缓冲区。缓冲区具有模式。在这种情况下,文件意义不大。一旦访问了文件,您要处理它的缓冲区
这就是为什么@Barmar试图以缓冲区及其模式方式进行回答。您显然不希望这适用于给定的模式,除非我猜测该模式特定于那个文件。在这种情况下,请定义适用于该文件(仅)的模式。
请澄清您的问题,也许我们将能够提供更多帮助。
(听起来像是一个XY问题。)

如果您能解释一下如何实现您所提到的内容,那么您的回答会更有用。听起来不错,我愿意尝试,但我不太熟悉创建模式和修改按键映射。 - M. Toya
2
我的主要建议是直接陈述你的问题,例如提供更多上下文,而不是询问如何做你认为解决方案应该是什么(请参见XY问题链接)。我之所以建议这样做,是因为我感觉你并不需要你认为你需要的东西。无论如何,关于使用具有属性“keymap”的叠加层,请参阅Elisp手册,节点“叠加层属性”。但我猜@phils的答案是更好的方法。 - Drew

2
设置一个小模式并在打开特定文件时自动加载它实际上比我想象的要简单。模式文件大致如下:
(define-minor-mode magic-mode
  "Provide functions to do magic."
  :lighter " !!!"
  :keymap (let ((map (make-sparse-keymap)))
            (define-key map (kbd "M-z") 'xyzzy)
            map)
)


(defun xyzzy()
  "Use at your own risk"
  (message "Nothing happens.")
  )



(provide 'magic-mode)

需要将它放置在 .emacs 会查找的某个地方,并在 .emacs 中添加以下行:

(require magic-mode)

最后,应该在文件末尾添加以下块,使用特定命令:
;; Local Variables:
;; eval: (magic-mode)
;; End:

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