为特定的Emacs模式设置自定义键绑定

时间:2011-03-31 12:45:29

标签: emacs key-bindings

虽然我知道如何在Emacs中设置全局密钥绑定,但我发现很难将Google的代码转换为本地(特定于模式的)密钥绑定。例如,我在.emacs

中有此代码
;; PDFLaTeX from AucTeX
(global-set-key (kbd "C-c M-p")
        (lambda ()
          (interactive)
          (shell-command (concat "pdflatex " buffer-file-name))))

我不想全局设置它。是否有像local-set-key这样的函数?

4 个答案:

答案 0 :(得分:47)

要在模式下绑定密钥,您需要在定义密钥之前等待加载模式。可以要求使用该模式,或使用eval-after-load

   (eval-after-load 'latex 
                    '(define-key LaTeX-mode-map [(tab)] 'outline-cycle))

不要忘记' - eval-after-load不是宏,因此需要它们。

答案 1 :(得分:40)

我使用以下内容:

(add-hook 'LaTeX-mode-hook
          (lambda () (local-set-key (kbd "C-0") #'run-latexmk)))

单独为LaTeX模式定义绑定。

答案 2 :(得分:5)

您需要确定该模式的键映射(例如,LaTeX-mode-map)并使用函数define-key。例如,在LaTeX模式下激活outline-minor-mode时,我有:

  (define-key LaTeX-mode-map [(tab)] 'outline-cycle))

在这种情况下,主模式(LaTeX)保存键绑定,但也有outline-minor-mode-map

答案 3 :(得分:3)

其他答案都没有满足我的需求。所以这可能对其他人有所帮助。如果我处于Evil的正常模式(基本上:这意味着在Emacs中无处不在),我希望Tab跳到行的开头,但我希望它在org项之间循环如果我在组织模式文件中,请说明。

每当我切换缓冲区时,一个选择就是乱用单独的绑定和常量绑定重新绑定(因为在正常状态下,每个键只允许一个绑定)。

但更有效的选择是让Tab运行我自己的代码,该代码根据当前缓冲区使用的主要模式运行所需的函数。因此,如果我在组织缓冲区中,此代码将运行org-cycle,否则它将运行evil-first-non-blank(转到该行上的第一个非空白字符)。

我在这里使用的技术也可以通过global-set-key调用您的自定义函数,而不是使用常规非恶意Emacs的人。

对于那些不了解Emacs lisp的人,“if”语句之后的第一行是true-action,之后的行是false-action。因此,如果major-mode等于org-mode,我们会运行org-cycle,否则我们会在所有其他模式下运行evil-first-non-blank

  (defun my/tab-jump-or-org-cycle ()
    "jumps to beginning of line in all modes except org mode, where it cycles"
    (interactive)
    (if (equal major-mode 'org-mode)
        (org-cycle)
      (evil-first-non-blank))
    )
  (define-key evil-normal-state-map (kbd "<tab>") 'my/tab-jump-or-org-cycle)