2011-09-13 39 views

回答

4

Emacs緩衝區中只能有一個主模式(除非您使用的是something like MMM or MuMaMo)。在你的情況下,一種主要模式是magit-log-edit-mode,其名稱由三個字組成(「Magit Log Edit」)。你可以只給它添加任何你喜歡的鉤:

(defun my-turn-on-auto-fill() 
    (setq fill-column 72) 
    (turn-on-auto-fill)) 

(add-hook 'magit-log-edit-mode-hook 'my-turn-on-auto-fill) 
+0

完美,謝謝!作爲一個切線,我對主要模式感到困惑 - 他們每個人在點擊時彈出一個單獨的「上下文菜單」。無論哪種方式,您的解決方案完美。 –

+1

我強烈建議不要將'lambda'表達式添加到鉤子。原因之一是在研究內容時很難看到鉤子包含什麼內容。另一個原因是,當你修改你的鉤子時,新舊版本都會出現(除非你仔細刪除舊版本),這可能會導致有趣的效果。 – Lindydancer

+0

@Lindydancer我完全同意,但這僅僅是爲了演示的目的。無論如何,改爲分開功能。 –

1

在一般情況下,你可以定義自己的功能,說my-common-hook並將其添加到所有主要的模式,例如:

(defun my-common-hook() 
    ... do stuff ... 
    ) 
(add-hook 'one-mode-hook 'my-common-hook) 
(add-hook 'another-mode-hook 'my-common-hook) 
(add-hook 'a-third-mode-hook 'my-common-hook) 
7

在回答到原來的規定的問題,如果你有一個單一的功能添加到大量的鉤變量,你可以做這樣的:

(defun my-add-to-multiple-hooks (function hooks) 
    (mapc (lambda (hook) 
      (add-hook hook function)) 
     hooks)) 

(defun my-turn-on-auto-fill() 
    (setq fill-column 72) 
    (turn-on-auto-fill)) 

(my-add-to-multiple-hooks 
'my-turn-on-auto-fill 
'(text-mode-hook 
    magit-log-edit-mode-hook 
    change-log-mode-hook)) 

不是最好的例子,也許,但我有這麼對於我希望在編程模式中啓用的一些常見行爲,我們可以進行類似的處理,其中還有很多其他的列表。

4

Emacs模式具有「基本模式」,即bade模式。例如python-mode延伸prog-mode,其本身延伸fundamental-mode。所有模式延伸fundamental-mode。因此,要鉤住python-modec-mode而不是text-mode,您可以掛鉤prog-mode

1

現在看到這個,但這是我所做的。最終的結果是,我想要做到以下幾點: (hook-up-modes my-lisps 'standard-lisp-environment)

爲此,我定義了以下defvar s。

(defvar my-lisps "clojure lisp emacs-lisp cider-repl") 
(defun standard-lisp-environment() 
    (paredit-mode 1) 
    (rainbow-delimiters-mode 1) 
    (eldoc-mode 1)) 

我想有LISP追加-mode掛機到我使用的Lisp,所以我有以下幾點:

(defun append-suffix (suffix phrases) 
    "take SUFFIX and append it to each of the PHRASES." 
    (mapcar #'(lambda (phrase) (concat phrase suffix)) phrases)) 

使得( 「Clojure的」 「口齒不清」)=>(「Clojure的-mode-hook「」lisp-mode-hook「)。

現在,我們可以很容易地擁有這些,我們需要他們的讀者符號,我們很容易從

(defun symbols-from-strings (strings) 
    "Given a list of strings, get their symbol values" 
    (mapcar #'intern strings)) 

獲取然後終於我們有類似的形式發佈以上:

(defun multiple-mode-add-hook (modes hook) 
    "Given a list of x-mode-hook symbols in MODE, add the HOOK to them." 
    (mapc (lambda (mode) (add-hook mode hook)) modes)) 

這些都使用適合他們的類型,字符串列表,符號列表「blah-mode-hook」等等。所以現在我們需要一個很好的面向用戶的函數,我們可以使用它。

(defun hook-up-modes (strings hook) 
    (let ((modes (symbols-from-strings 
       (append-suffix "-mode-hook" (split-string strings))))) 
    (multiple-mode-add-hook modes hook))) 

現在,這應該是很清晰的:我們從字符串的空格分隔列表創建我們的模式和鉤適用於它。另外,由於我已經定義了一個標準的lisp環境,所有我的lisp的行爲都是相似的,如果我喜歡,我可以很容易地刪除它。然後,實際上工作的代碼是超簡單的短語 (hook-up-modes my-lisps 'standard-lisp-environment)

+0

從字符串開始而不是列表非常奇怪。符號列表將是一個更通常的起點。處理時,您可以使用'symbol-name'來獲取與之連接的字符串。 – phils

相關問題