2011-03-31 102 views
47

儘管我知道如何在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

回答

43

要在某個模式下綁定某個鍵,您需要等待該模式在定義該鍵之前被加載。人們可以要求模式,或使用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

5

您需要確定該模式的關鍵映射(例如,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

35

我使用下面的:

(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

2

沒有其他答案滿足我的需求。所以這可能會幫助其他人。我想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)