我讀的是article about well-formatted Git commits,我想知道如何將一些規則應用於Magit日誌模式。如何一次將鉤子應用於多個Emacs模式?
它似乎同時使用3種主要模式:Magit
,Log
,Edit
。
那麼我怎樣才能得到這些模式,當一起使用時,自動硬包裝在72個字符?
我讀的是article about well-formatted Git commits,我想知道如何將一些規則應用於Magit日誌模式。如何一次將鉤子應用於多個Emacs模式?
它似乎同時使用3種主要模式:Magit
,Log
,Edit
。
那麼我怎樣才能得到這些模式,當一起使用時,自動硬包裝在72個字符?
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)
在一般情況下,你可以定義自己的功能,說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)
在回答到原來的規定的問題,如果你有一個單一的功能添加到大量的鉤變量,你可以做這樣的:
(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))
不是最好的例子,也許,但我有這麼對於我希望在編程模式中啓用的一些常見行爲,我們可以進行類似的處理,其中還有很多其他的列表。
Emacs模式具有「基本模式」,即bade模式。例如python-mode
延伸prog-mode
,其本身延伸fundamental-mode
。所有模式延伸fundamental-mode
。因此,要鉤住python-mode
加c-mode
而不是text-mode
,您可以掛鉤prog-mode
。
現在看到這個,但這是我所做的。最終的結果是,我想要做到以下幾點: (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)
。
從字符串開始而不是列表非常奇怪。符號列表將是一個更通常的起點。處理時,您可以使用'symbol-name'來獲取與之連接的字符串。 – phils
完美,謝謝!作爲一個切線,我對主要模式感到困惑 - 他們每個人在點擊時彈出一個單獨的「上下文菜單」。無論哪種方式,您的解決方案完美。 –
我強烈建議不要將'lambda'表達式添加到鉤子。原因之一是在研究內容時很難看到鉤子包含什麼內容。另一個原因是,當你修改你的鉤子時,新舊版本都會出現(除非你仔細刪除舊版本),這可能會導致有趣的效果。 – Lindydancer
@Lindydancer我完全同意,但這僅僅是爲了演示的目的。無論如何,改爲分開功能。 –