是否可以在emacs中定义文件特定的键绑定? 我想有可能创建一个次要模式,并在特定文件打开时加载它,但只有一个键绑定似乎有点过分。
答案 0 :(得分:7)
如果您将代码合并到local-set-key
和Buffer-locally overriding minor-mode key bindings in Emacs,那么您最终可能会遇到以下情况:
(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:
请注意,次模式地图优先于本地地图。
答案 1 :(得分:5)
在File Local Variables部分使用eval:
:
;;; Local Variables:
;;; eval: (local-set-key ...)
答案 2 :(得分:2)
闻起来你做错了 - 这是我的猜测。如果您有一个适合给定键绑定的特定文件缓冲区,则为其定义一个模式并将该键绑定在该模式的键映射中。让模式继承你喜欢的任何其他模式。
你没有真正描述你的上下文:你如何访问这个文件(C-x C-f
别的东西)?,为什么只有这个文件 - 它有什么特别之处?关键用的是什么?所以很难给你任何有用的建议。
如果你真的想要对这个特定文件采取不同的键操作,那么可以定义一个访问该文件的命令(但是你想要访问它),然后在其所有文本上创建一个叠加层,并使用叠加层属性keymap
可以在任何地方添加绑定。这当然听起来很愚蠢,但就像现在一样,你的问题也是如此。
Emacs使用缓冲区。缓冲区处于模式。文件在这种情况下没什么意义。访问文件后,其缓冲区就是您要使用的内容。
这就是@Barmar试图回答缓冲区及其模式的原因。您显然不希望这是针对给定模式的,除非我认为该模式特定于该文件。在这种情况下,请定义一个仅(仅)应用于该文件的模式。
澄清您的问题,也许我们将能够为您提供更多帮助。
(听起来这可能是XY problem。)
答案 3 :(得分:1)
设置次要模式并在打开特定文件时自动加载它实际上比我想象的要简单。
模式文件是这样的:
(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: