为特定的Emacs模式设置自定义键绑定
尽管我知道如何在Emacs中设置全局键绑定,但我发现甚至Google难以将本地代码(小模式特定)键绑定编码出来。例如,我在我的代码.emacs
:为特定的Emacs模式设置自定义键绑定
;; PDFLaTeX from AucTeX
(global-set-key (kbd "C-c M-p")
(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
不是宏,因此它需要他们。
您需要确定该模式的关键映射(例如,LaTeX-mode-map
)并使用功能define-key
。作为一个例子,用乳胶模式中激活outline-minor-mode
沿,我有:
(define-key LaTeX-mode-map [(tab)] 'outline-cycle))
在这种情况下的主要模式(胶乳)是关键的结合,但也有一个outline-minor-mode-map
。
你需要等待加载乳胶模式才能做到这一点:(eval-after-load'latex'(define-key LaTeX-mode-map [(tab)]'outline-cycle))) – 2011-03-31 14:57:54
@Remi,thanks很多,那让我失望了。提供您的评论作为答案,以便我可以检查它。 =) – aL3xa 2011-03-31 15:44:57
我使用下面的:
(add-hook 'LaTeX-mode-hook
(lambda() (local-set-key (kbd "C-0") #'run-latexmk)))
具有用于单独乳胶模式中定义的绑定。
没有其他答案满足我的需求。所以这可能会帮助其他人。我想Tab
跳转到行的开头,如果我在邪恶的正常模式是(基本上是:这意味着无处不在Emacs),但我而是希望组织项目状态之间的循环,如果我在一个组织模式文件。
当我切换缓冲区时(因为邪恶在每个键的正常状态下只允许有一个绑定),一种选择是用单独的绑定和常量绑定重新绑定。
但更有效的选择是让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)
我越来越发现自己要Emacs的维基求助:http://www.emacswiki.org/emacs/KeyBindingDiscussion在这里,它显示你可以添加一个键绑定到模式键映射,并显示如何找到该映射。 – drysdam 2011-03-31 12:50:23
Yepp ...我已经看到了一个,但我一直得到'Symbol的值作为变量是void:LaTeX-mode-map'。嗯... – aL3xa 2011-03-31 13:30:22