2016-05-15 12 views
1

私はEmacsを初めて使い、悪いモードを使用しています。私はvimで持っていたマッピングのいくつかを再マッピングするのにいくつかの問題がありました。 vimでは、map機能を使用してキーを再マップするのは簡単でした。 cwciwに、dwdiwに変更したかったのです。しかし、私はelispの多くの理解がありません。そのため、簡単なマッピングが可能なプラグインや関数があります。おかげさまで EvilモードのEmacsでのキーマッピング

答えて

1

最初は悪いニュースです。これは現在、他の演算子にも影響を及ぼさずには不可能です。理由はcが演算子であるため、cが入力されるとEmacsはevil-changeを実行します。次にEvilがオペレータのペンディング状態になり、次のw(またはiw)が読み込まれ、正しい動作が確認されます。

すべて演算子の演算子状態が1つしかない、つまり共有キーマップが1つしかないという問題があります。したがって、wiwに変更すると、すべてのオペレータの動作が、cまたはdだけでなく変更されます。

まず良いニュース:あなたは、あなたが単にさらに良いニュース今

(define-key evil-operator-state-map "w" "iw") 

を行う可能性があるため、これは大丈夫です場合。上記のことを知っていれば、Emacs lispの魔法を少し使って問題を解決するのは比較的簡単です。オペレータに渡される範囲は、関数evil-operator-rangeによって決まります。現在の演算子がevil-changeまたはevil-deleteの場合、この関数にアドバイスしてキーバインドを一時的に変更することです。新しいバインディングを配置できるキーマップはいくつかありますが、evil-operator-state-local-mapは合理的な選択です。

(defun my/evil-motion-range (orig-fun &rest args) 
    (if (not (memq this-command '(evil-delete evil-change))) 
     (apply orig-fun args) 
    (let* ((orig-keymap evil-operator-state-local-map) 
      (evil-operator-state-local-map (copy-keymap orig-keymap))) 
     (define-key evil-operator-state-local-map "w" "iw") 
     (apply orig-fun args)))) 

(advice-add 'evil-operator-range :around #'my/evil-motion-range) 

実際には、この手法では、演算子固有のバインディングを一般的な方法で実装できます。

関連する問題