長すぎます。
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-command
vi-insert
しかし、__fzf_cd__
話は異なります:
bind -m emacs-standard
一連のクレイジーemacs特定のキーストロークでこれを参照してください。- 一方、
bind -m vi-command
/は+マッピング(上記のコードスニペットの上部)をvi-insert
利用して切り替えてロジックを適用するようです。Ctrlzemacs-editing-mode
vi-editing-mode
- 入力
emacs-editing-mode
モード - Alt+を打つc
- 復帰
vi-editing-mode
モード
- 入力
私は上記の分析がほとんど正確であると比較的確信しています。
Ctrlしかし、+マッピングはz+マッピングと同じ範囲で定義され、後者が前者を利用するが、後者は有効であり、前者は有効ではない。Altc
私は何を見逃していますか?
答え1
私が期待するのは、手動で試してみると、「\ Cz」が端末自体によって「hang」文字でキャプチャされることです。
したがって、readline
組み込み関数はbash
実際に役割を見ることができないため、関連する操作は実行されません。 「\Cz」がマッピングの一部である場合、端末を通過しないので傍受しません。
したがって、fzfは「内部」遷移に特定のキーを使用することを選択したようです。
これを確認するには、新しい端末を開きますstty -a
。この出力で、susp = ^Z;
Cz文字が実際に端末で探している文字であることを確認できることを願っています。
その後、同じ端末で定義したマッピングをテストする前に切り替えるのではなく、ぶら下がっているstty susp ^X
文字を生成するために実行できます。私が正しい場合は、キーバインディングを変更する必要があります。^X
^Z
C-z
emacs-editing-mode
重要な点は、次のように明確でなければなりません。
bind -m vi-insert '"\C-z": emacs-editing-mode'
stty -a
(ただ見るために)。stty susp ^X
C-z
キーバインディングが変更されていることを確認してください。