emacs中特定于文件的键绑定

问题描述 投票:3回答:4

是否可以在emacs中定义文件特定的键绑定?我想有可能创建一个次要模式,并在打开特定文件时将其加载,但仅进行一次键绑定似乎显得过分。

emacs key-bindings
4个回答
7
投票

如果将代码组合到local-set-keyBuffer-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:

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


5
投票

eval:部分中使用File Local Variables

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

2
投票

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

例如:

(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其他内容??),为什么只访问此文件-它有什么特殊之处?密钥有什么用?因此很难给您任何有用的建议。

如果您确实要对此特定文件采取一些不同的键操作,则可以定义一个命令来访问该文件(无论您要如何访问它),然后在其所有文本上创建一个叠加层,并使用overlay属性keymap将绑定添加到任何地方。当然,这听起来很愚蠢,但就目前而言,您的问题也是如此。

Emacs与buffers一起使用。缓冲区位于modes中。在这种情况下,文件意义不大。访问文件后,您要使用其buffer

这就是@Barmar尝试根据缓冲区及其模式进行回答的原因。您显然不希望此模式适用于给定的模式,除非我猜想该模式特定于该文件。在这种情况下,请定义一种模式(仅适用于该文件)。

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

(这样的声音可能是XY problem。]


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:
© www.soinside.com 2019 - 2024. All rights reserved.