Emacsとviモードを切り替えるためのバインディングマップについて

Emacsとviモードを切り替えるためのバインディングマップについて

長すぎます。

bash+ 次のコマンドを実行すると効果がないようCtrlです。z

bind -m vi-command '"\C-z": emacs-editing-mode'
bind -m vi-insert '"\C-z": emacs-editing-mode'
bind -m emacs-standard '"\C-z": vi-editing-mode'

そして、このような愚かなことは動作します

bind -m vi-insert '"h": "ciaooooo"'

この問題の源

いつも満足していたのでこれらのマッピングを使いたいという意味ではありませんがvi-editing-mode、主にどうするのか分からないので観察している動作を理解したいと思います。fzf~のkey-bindings.bash働く

key-bindings.bash次のようないくつかの関数が定義されています。__fzf_select____fzf_cd__その他の項目をさまざまな方法でキーにバインドします。

今、仮定しましょう。最近bash、バインディングは次のとおりです。

# Required to refresh the prompt after fzf
bind -m emacs-standard '"\er": redraw-current-line'

bind -m vi-command '"\C-z": emacs-editing-mode'
bind -m vi-insert '"\C-z": emacs-editing-mode'
bind -m emacs-standard '"\C-z": vi-editing-mode'

#if (( BASH_VERSINFO[0] < 4 )); then
# older versions of the commands in the else branch
#else
  # CTRL-T - Paste the selected file path into the command line
  bind -m emacs-standard -x '"\C-t": fzf-file-widget'
  bind -m vi-command -x '"\C-t": fzf-file-widget'
  bind -m vi-insert -x '"\C-t": fzf-file-widget'

  # CTRL-R - Paste the selected command from history into the command line
  bind -m emacs-standard -x '"\C-r": __fzf_history__'
  bind -m vi-command -x '"\C-r": __fzf_history__'
  bind -m vi-insert -x '"\C-r": __fzf_history__'
#fi

# ALT-C - cd into the selected directory
bind -m emacs-standard '"\ec": " \C-b\C-k \C-u`__fzf_cd__`\e\C-e\er\C-m\C-y\C-h\e \C-y\ey\C-x\C-x\C-d"'
bind -m vi-command '"\ec": "\C-z\ec\C-z"'
bind -m vi-insert '"\ec": "\C-z\ec\C-z"'

ここで、およびについては、__fzf_history__3fzf-file-widgetつのキーマップに対して同じマッピングが実行されますemacs-standard。今まではそんなに良くなった。vi-commandvi-insert

しかし、__fzf_cd__話は異なります:

  • bind -m emacs-standard一連のクレイジーemacs特定のキーストロークでこれを参照してください。
  • 一方、bind -m vi-command/は+マッピング(上記のコードスニペットの上部)をvi-insert利用して切り替えてロジックを適用するようです。Ctrlzemacs-editing-modevi-editing-mode
    1. 入力emacs-editing-modeモード
    2. Alt+を打つc
    3. 復帰vi-editing-modeモード

私は上記の分析がほとんど正確であると比較的確信しています。

Ctrlしかし、+マッピングはz+マッピングと同じ範囲で定義され、後者が前者を利用するが、後者は有効であり、前者は有効ではない。Altc

私は何を見逃していますか?

ベストアンサー1

私が期待するのは、手動で試してみると、「\ Cz」が端末自体によって「hang」文字でキャプチャされることです。

したがって、readline組み込み関数はbash実際に役割を見ることができないため、関連する操作は実行されません。 「\Cz」がマッピングの一部である場合、端末を通過しないので傍受しません。

したがって、fzfは「内部」遷移に特定のキーを使用することを選択したようです。

これを確認するには、新しい端末を開きますstty -a。この出力で、susp = ^Z;Cz文字が実際に端末で探している文字であることを確認できることを願っています。

その後、同じ端末で定義したマッピングをテストする前に切り替えるのではなく、ぶら下がっているstty susp ^X文字を生成するために実行できます。私が正しい場合は、キーバインディングを変更する必要があります。^X^ZC-zemacs-editing-mode

重要な点は、次のように明確でなければなりません。

  • bind -m vi-insert '"\C-z": emacs-editing-mode'
  • stty -a(ただ見るために)。
  • stty susp ^X
  • C-zキーバインディングが変更されていることを確認してください。

おすすめ記事