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

虽然我知道如何在Emacs中设置一个全局的键绑定,但我发现甚至Google很难将代码用于本地(次模式特定)键绑定。 例如,我在我的.emacs有这样的代码:

 ;; PDFLaTeX from AucTeX (global-set-key (kbd "Cc Mp") (lambda () (interactive) (shell-command (concat "pdflatex " buffer-file-name)))) 

我不想在全球范围内设置。 有没有像local-set-key

要在某个模式下绑定某个键,您需要等待该模式在定义该键之前加载。 人们可能需要模式,或者使用eval-after-load

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

不要忘记, ' eval-after-load不是一个macros,所以它需要他们。

我使用以下内容:

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

为LaTeX模式单独定义一个绑定。

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

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

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

没有其他答案满足我的需求。 所以这可能会帮助其他人。 如果我处于Evil的正常模式(基本上这意味着Emacs中的任何地方 ),我希望Tab跳转到行首,但是如果我处于组织模式文档中,我希望它在组织项目状态之间循环。

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

但更有效的select是使Tab运行我自己的代码,该代码根据当前缓冲区使用的主模式运行所需的函数。 所以,如果我在一个组织缓冲区,这段代码运行org-cycle ,否则它运行evil-first-non-blank (去线上的第一个非空白字符)。

我在这里使用的技术也可以通过使用global-set-key来调用你的自定义函数来使用,而对于那些使用普通非恶意Emacs的人来说。

对于那些不知道Emacs lisp的人来说,“if”语句之后的第一行是真实行为,而后面的行是假动作。 所以如果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)