为特定的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这样的功能?

+0

我越来越发现自己要Emacs的维基求助:http://www.emacswiki.org/emacs/KeyBindingDiscussion在这里,它显示你可以添加一个键绑定到模式键映射,并显示如何找到该映射。 – drysdam 2011-03-31 12:50:23

+0

Yepp ...我已经看到了一个,但我一直得到'Symbol的值作为变量是void:LaTeX-mode-map'。嗯... – aL3xa 2011-03-31 13:30:22

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

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

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

+7

你如何通过编程来确定'eval-after-load'的第一个参数? – erjoalgo 2013-09-26 18:01:46

+0

我认为这足以提供属于该模式的任何功能 - 例如“乳胶模式”而不是“乳胶”也可以。 – Artyom 2014-09-26 18:51:00

+0

对我来说,这个变量被称为latex-mode-map(全部小写)。 LaTeX-mode-map不存在。 – 2014-11-30 09:26:40

您需要确定该模式的关键映射(例如,LaTeX-mode-map)并使用功能define-key。作为一个例子,用乳胶模式中激活outline-minor-mode沿,我有:

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

在这种情况下的主要模式(胶乳)是关键的结合,但也有一个outline-minor-mode-map

+7

你需要等待加载乳胶模式才能做到这一点:(eval-after-load'latex'(define-key LaTeX-mode-map [(tab)]'outline-cycle))) – 2011-03-31 14:57:54

+0

@Remi,thanks很多,那让我失望了。提供您的评论作为答案,以便我可以检查它。 =) – aL3xa 2011-03-31 15:44:57

我使用下面的:

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

具有用于单独乳胶模式中定义的绑定。

+1

'#'对我来说是多余的。 – doctorate 2015-01-07 09:01:32

+0

我不得不设置“latex-mode-hook”(没有大写字母)。我也发现不需要'#'。 – hunse 2015-04-29 21:10:16

+2

在尖括号#'http://endlessparentheses.com/get-in-the-habit-of-using-sharp-quote.html – codeasone 2016-02-16 12:53:11

没有其他答案满足我的需求。所以这可能会帮助其他人。我想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)