2011-06-18 6 views
2

マイスペースモードをいくつかのメジャーモードにフックしたいとします。もちろん、手作業で行うこともできますが、ループが必要です。だから私はそれを書くことを試みた:.emacsループを使用していくつかのメジャーモードにマイナーモードを割り当てます。

(progn 
(setq modes-to-be-hooked '(lisp-mode-hook rst-mode-hook python-mode-hook emacs-lisp-mode-hook text-mode-hook tcl-mode-hook c-mode-hook fortran-mode-hook)) 
    (while modes-to-be-hooked 
    (setq my-hooks '(yas/minor-mode whitespace-mode)) 
     (while my-hooks 
     (add-hook '(pop modes-to-be-hooked) '(pop my-hooks))) 
) 
) 

このループの問題は、リストの最後の要素は、「ゼロ」と (nil「でnil」のフックを追加) がエラーを与えるということです。この

(progn 
    (setq mylist '(a b c)) 
    (while mylist 
     (progn 
      (setq temp (pop mylist)) 
      (if temp (message "%s" temp) (message "It's nil!")) 
      (sleep-for 1) 
     ) 
) 
) 

プリント:(

答えて

5

まあ、私は問題のカップルを見ることができる は、それから私は、もしでNILSを脱出しようとしたが、それは動作しません。第2に、あなたの(pop)コールを引用しています。つまり、あなたが希望する値を(add-hook)に渡していないことを意味します。

あなたのマイナーモードリストからポップアップするたびに、メジャーモードリストからポップしています。

whileループはループの値がnilのときに本体を実行しないため、2番目のコードブロックは(message)を経由してnilを生成しません。 nilは単に(progn)で生成される最終値であり、whileループの最終的な戻り値はnilに遭遇したときです。

あなたのコードが期待通りの動作をしていない場合、実際に何が起こっているのかを把握できるように、対話型デバッグサポートをEmacsでチェックアウトしたいと思うかもしれません。参照:
M-:(info "(elisp) debugging")RET

しかし、私はlhuiのソリューションを使用するのではなく、あなたが持っているものの固定を示唆しています。代替構文について

、私はこのアプローチを使用する:あなたが作ることができるよう、後に(例えば、他のマイナーモードを含むなど)いくつかの新機能が含まれるように決定した場合my-coding-configのような名前の関数を定義する

(defun my-coding-config() 
    (whitespace-mode 1) 
    (yas/minor-mode 1)) 

(mapc 
(lambda (language-mode-hook) 
    (add-hook language-mode-hook 'my-coding-config)) 
'(lisp-mode-hook 
    rst-mode-hook 
    python-mode-hook 
    emacs-lisp-mode-hook 
    text-mode-hook 
    tcl-mode-hook 
    c-mode-hook 
    fortran-mode-hook)) 

は、物事を簡素化これらのフック変数すべてを削除/追加するのではなく、その関数を再評価するだけで即座に変更が反映されます。

+0

感謝のphils - それは動作します! – Adobe

+0

あなたは今答えを「受け入れる」べきです。 「ここで質問するにはどうすればよいですか? http://stackoverflow.com/faq – phils

1

使用はnil:

(dolist (hook 
     (list lisp-mode-hook rst-mode-hook python-mode-hook emacs-lisp-mode-hook text-mode-hook tcl-mode-hook c-mode-hook fortran-mode-hook)) 
    (add-hook hook (lambda() 
        (whitespace-mode 1) 
        (yas/minor-mode 1))))
+0

ありがとうルパン。私はまだ間違っていますが、それは最初、tcl、fortranモードでエラーを出します。私がそれらを削除したとき、emacsは "間違った型引数:symbolp、(semantic-default-elisp-setup)"と言いました。 – Adobe

関連する問題