2012-03-10 35 views
3

ErgoEmacsマイナーモードがグローバルにオンになっています。これは基本的な編集のための多くのカスタムキーボードショートカットを定義しています。しかし、私がlispファイルを開くと、slime-modeが自動的に有効になり、M-pM-nがそれ自身のコマンドで上書きされます。しかし、M-pM-nは常にergoemacs-modeで定義します。マイナーモードでキーバインディングをロードおよび定義する順序を設定するにはどうすればよいですか?または、どのように私はergoemacsモードのキーバインドを優先させるのですか?2つのEmacsマイナーモードで競合するキーボードショートカット

答えて

2

たぶん簡単な解決策は、スライムのバインディングを削除することです:

(add-hook 'slime-mode-hook 
    (lambda() 
    (define-key slime-mode-map [?\M-p] nil) 
    (define-key slime-mode-map [?\M-n] nil))) 

用心:100%テストされていないguarantedd、変数の名前はスライムモードマップとは異なる場合があります(それはおそらく唯一存在しますスライムモードをロードした後)。

3

マイナーモードでキーバインディングが読み込まれ、定義される順序を設定するにはどうすればよいですか?または、どのように私はergoemacsモードのキーバインドを優先させるのですか?

変数minor-mode-map-alistのslime-modeより前にErgoEmacsが表示されるようにする必要があると思います。おそらくもっと良い方法がありますが、以下のコードでこれを達成する必要があります。あなたが望むことができたら教えてください。

 
(require 'cl) 

(add-hook 
'slime-mode-hook 
(lambda() 
    (let ((elem (first 
     (remove-if-not 
      (lambda (item) (equal 'ergoemacs-mode (car item))) 
      minor-mode-map-alist)))) 
     (setq minor-mode-map-alist (remove elem minor-mode-map-alist)) 
     (add-to-list 'minor-mode-map-alist elem)))) 

+0

感謝しました!解決策はまだまだハッキーです。マイナーモードがどのような順序でロードされるかはどのように決定されますか?おそらく、このメカニズムを理解すればより洗練されたソリューションが生まれるかもしれません。 –

+0

ほとんどのライブラリは、 'autoload'メカニズムを介してオンデマンドでロードされるか、または' require'を介して明示的にロードされます。ロード順序を完全に任意に扱うべきですが、あなたのinitファイルは、単にそのファイルの内容を並べ替えるだけです。レットバインディングは、より簡潔/明確な '(assoc ')メソッドと同等です。これは、以下のような便利な機能があります。http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 – phils

+0

letバインディングは、 ergomacs-mode minor-mode-map-alist) 'を使用します。この場合、' assoc'の代わりに 'assq'を使うことができます – Felipe

関連する問題