2011-09-13 16 views
9

私はarticle about well-formatted Git commitsを読んでいました。私はMagitログモードにいくつかのルールをどのように適用できるのかと思いました。一度に複数のEmacsモードにフックを適用するにはどうすればよいですか?

3つの主要モードを同時に使用しているようです。Magit,、Edit

こういったモードを一緒に使用すると、自動的に72文字でハードラップするにはどうしたらいいですか?

答えて

4

Emacsバッファには1つのメジャーモードしかありません(something like MMM or MuMaMoを使用している場合を除く)。あなたのケースでは、1つのメジャーモードがmagit-log-edit-modeであり、その名前は3つの単語(「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'-expressionを追加することについて強くお勧めします。 1つの理由は、内容を調べるときにフックに含まれる内容を確認することは本当に難しいということです。別の理由は、フックを修正するときに、新しいバージョンと古いバージョンの両方が存在することです(古いバージョンを慎重に削除しない限り)ので、興味深い効果が得られます。 – 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モードには「基本モード」があります。例えば、python-modeは、それ自身がfundamental-modeに拡張するprog-modeを拡張します。すべてのモードは、fundamental-modeに拡張されています。したがって、python-modec-modeをフックするにはtext-modeではなく、prog-modeをフックできます。

1

これを今見ているが、私がやったことはここにある。最終的な結果は、私が次のことをしたいということです: (hook-up-modes my-lisps 'standard-lisp-environment)

これを行うには、次のように定義します。defvar

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

ように( "Clojureの" "のlisp")=>( "Clojureの:

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

私はので、私は、次のしている私が使用してのLispにlispのアペンド-mode-hookを持つようにしたいです-mode-hook "" lisp-mode-hook ")。これらのすべての

(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)) 

は、今、私たちは簡単にこれらを持っていることができることを、我々は我々が簡単に

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

から取得し、最後に、我々は同様のフォームが上投稿している彼らのリーダーシンボルを、必要とします文字列のリスト、シンボルのリスト(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環境を定義しているので、すべてのリスプも同様に動作します。実際に動作するコードは、スーパーシンプルなフレーズ (hook-up-modes my-lisps 'standard-lisp-environment)です。

+0

リストの代わりに文字列で始めるのはかなり奇妙です。シンボルのリストはもっと普通の出発点になります。 'symbol-name'を使って、処理時に連結する文字列を得ることができます。 – phils

関連する問題