为特定的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)