Alf*_* M. 3 emacs key-bindings
是否可以在emacs中定义文件特定的键绑定?我想有可能创建一个次要模式,并在特定文件打开时加载它,但只有一个键绑定似乎有点过分.
如果您将代码local-set-key与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)))
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)
请注意,次模式映射优先于本地映射.
使用eval:在文件中的局部变量部分:
;;; Local Variables:
;;; eval: (local-set-key ...)
Run Code Online (Sandbox Code Playgroud)
听起来你好像做错了事——这是我的猜测。如果您有一个特定的文件缓冲区,给定的键绑定适合该缓冲区,则专门为其定义一个模式,并将该键绑定到该模式的键映射中。让该模式继承您喜欢的任何其他模式。
例如:
(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 问题。)
| 归档时间: |
|
| 查看次数: |
790 次 |
| 最近记录: |