虽然我知道如何在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
这样的函数?
答案 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)