デフォルトでは、すべての主keymap emacs
キーバインディングを使用でき、まだvi-command
モードに変更できるハイブリッドモードが必要です。
どのように設定しますか?
答え1
より良いアプローチは、vi-insert
バインディングをに移動するのではなく、バインディングをに移動することです。その理由は、切り替えるバインディングがあり、モードに切り替えるように機能をシミュレートするのが難しいからです。emacs
emacs
vi-insert
vi-command
vi-insert
emacs
たとえば、A
コマンドのvi-command
デフォルトはvi-append-eol
(行の末尾に追加してに切り替えますvi-insert
)です。
マクロではなく関数にバインドされているため、モードA
に切り替えることはできません。emacs
たとえば、これは機能しません
"A": vi-append-eol emacs-editing-mode
"A": vi-append-eol "\ee"
次のことができます。
"A": "$a\ee"
"a"
しかし、今ではコマンドに従ってvi-append-mode
バウンスも必要です。"a"
それから続行する時間です"i"
。"i"
に切り替えることができますemacs
。マクロに変換する必要がある完全なコマンドチェーンがあります。これは痛いです。
したがって、emacs
バインディングをvi-insert
。
vi-insert
したがって、一意のバインディングを設定し、emacs
同じキーシーケンスに対して異なるバインディングがある場合に使用するバインディングを決定しようとします。同じバインディングがある場合は無視します。
これは、次のコマンドを使用して実行できます。
comm -3\
<(INPUTRC=/dev/null bash -c 'bind -pm emacs' |
LC_ALL='C' grep -vE '^#|: (do-lowercase-version|self-insert)$' |
sort) \
<(INPUTRC=/dev/null bash -c 'bind -pm vi-insert' |
LC_ALL='C' grep -vE '^#|: (do-lowercase-version|self-insert)$' |
sort) | cat
| cat
存在理由を説明するここ
「まったく同じバインディング」は削除されるため、-3
このリストを調べて左の列でバインディングを見つけます。左の列の各バインディングに対して、次の操作を行います。
同じキーシーケンスに対する冗長バインディングがある場合(例:
"\C-d": delete-char
"\C-d": vi-eof-maybe
そのうちの1つを選択してください。すでにバインディングがある場所にこれらのバインディングを追加する予定なので、必要に応じてこれら2行を削除できますvi-insert
(右側)。必要に応じて(左)削除してください。vi-insert
vi-insert
emacs
vi-insert
右の列()に一意のバインディングがある場合vi-insert
、たとえば
"\e": vi-movement-mode
`vi-insertにすでに存在しているので削除してください。
残りのバインディングは左列(emacs
)にあります。に追加するので、これらはそのままにしてくださいvi-insert
。
これが私に追加することを選択したバインディングです.inputrc
。emacs
vi-insert
"kj"
私はスイッチを使用しないことにしましたvi-command
。こんにちは~の回答なぜなら、それを使って"\ee"
からに移動するクエストを完了しemacs
、vi-insert
次にからに移動する別のクエストを完了できるから"\e"
です。実際にはありますvi-insert
vi-command
blackjackを除くkjを含む単語そしてjkを含む単語(主に指名)
保管して"\C-d": delete-char
しまいました"\C-d": vi-eof-maybe
。Enter
forが利用可能vi-eof-maybe
で、readlineを押して誤ってreadlineを終了したくないからです"\C-d"
。これは、モードでバインディングを"\C-d": vi-eof-maybe
オーバーライドするためにバインディングを使用しているため、バインディングを削除することを意味します。vi-eof-maybe
vi-insert
delete-char
代わりに下向き矢印を使用できるので、"\C-n": menu-complete
そのままにしてください。これはすでにバインディングがあるため、両方のバインディングを削除することを意味します。"\C-n": next-history
next-history
vi-insert
menu-complete
"\C-p": menu-complete-backward
代わりに"\C-p": previous-history
上向き矢印を押すことができるので、それを維持しますprevious-history
。これはvi-insert
すでにバインディングがあるため、両方のバインディングを削除することを意味しますmenu-complete-backward
。
"\C-w": vi-unix-word-rubout
代わりに予約してください"\C-w": unix-word-rubout
。違いが何なのかわかりません。私はvi-insert
そのうちの1つに固執します。これはvi-insert
すでにバインディングがあるため、両方のバインディングを削除することを意味しますvi-unix-word-rubout
。
私はそれを守った"\e": vi-movement-mode
。これはvi-insert
、すでに存在するバインディングを削除することを意味しますvi-movement-mode
。
set editing-mode vi
set keymap emacs
"\ee": vi-editing-mode
set keymap vi-command
"\ee": emacs-editing-mode
# key bindings to get out of vi-editing-mode
set keymap vi-insert
"\ee": emacs-editing-mode
# emacs keybindings in vi-insert mode
"\C-@": set-mark
"\C-]": character-search
"\C-_": undo
"\C-a": beginning-of-line
"\C-b": backward-char
"\C-d": delete-char
"\C-e": end-of-line
"\C-f": forward-char
"\C-g": abort
"\C-k": kill-line
"\C-l": clear-screen
"\C-o": operate-and-get-next
"\C-q": quoted-insert
"\C-x!": possible-command-completions
"\C-x$": possible-variable-completions
"\C-x(": start-kbd-macro
"\C-x)": end-kbd-macro
"\C-x*": glob-expand-word
"\C-x/": possible-filename-completions
"\C-x@": possible-hostname-completions
"\C-x\C-?": backward-kill-line
"\C-x\C-e": edit-and-execute-command
"\C-x\C-g": abort
"\C-x\C-r": re-read-init-file
"\C-x\C-u": undo
"\C-x\C-v": display-shell-version
"\C-x\C-x": exchange-point-and-mark
"\C-xe": call-last-kbd-macro
"\C-xg": glob-list-expansions
"\C-x~": possible-username-completions
"\e ": set-mark
"\e!": complete-command
"\e#": insert-comment
"\e$": complete-variable
"\e&": tilde-expand
"\e*": insert-completions
"\e-": digit-argument
"\e.": insert-last-argument
"\e.": yank-last-arg
"\e/": complete-filename
"\e0": digit-argument
"\e1": digit-argument
"\e2": digit-argument
"\e3": digit-argument
"\e4": digit-argument
"\e5": digit-argument
"\e6": digit-argument
"\e7": digit-argument
"\e8": digit-argument
"\e9": digit-argument
"\e<": beginning-of-history
"\e=": possible-completions
"\e>": end-of-history
"\e?": possible-completions
"\e@": complete-hostname
"\e\C-?": backward-kill-word
"\e\C-]": character-search-backward
"\e\C-e": shell-expand-line
"\e\C-g": abort
"\e\C-h": backward-kill-word
"\e\C-i": dynamic-complete-history
"\e\C-r": revert-line
"\e\C-y": yank-nth-arg
"\e\\": delete-horizontal-space
"\e\e": complete
"\e^": history-expand-line
"\e_": insert-last-argument
"\e_": yank-last-arg
"\eb": backward-word
"\ec": capitalize-word
"\ed": kill-word
"\ef": forward-word
"\eg": glob-complete-word
"\el": downcase-word
"\en": non-incremental-forward-search-history
"\ep": non-incremental-reverse-search-history
"\er": revert-line
"\et": transpose-words
"\eu": upcase-word
"\ey": yank-pop
"\e{": complete-into-braces
"\e~": complete-username
修正する
私はもう少しうまくやったと思います。リーダーとして使用するために多くのコマンドが送信されたため、スイッチを押すと遅延が発生し、"jk"
スイッチをコマンドで再開したことがありました。vi command
"\e"
vi-command
emacs
vi-insert
"\e"
これは"jk"
、モッシングがコメントアウトされたことを示します。現在"\ee"
ループモードを使用しています。"\e"
必要ないと思ったのでfromをバインド解除しませんでした。だからそれがすることは、あなたが押して待つと、あなたは行くでしょう。vi-insert
vi-command
"\e"
vi-insert
vi-command
からに移動するには、いずれかのvi-command
コマンドvi-insert
を押すだけです。たとえば、"A"
2つの"i"
モード間を循環させることもできます。3つのモード間を循環しても問題ありませんvi
。
set keymap emacs
"\ee": vi-editing-mode
set keymap vi-command
"\ee": emacs-editing-mode
# key bindings to get out of vi-editing-mode
set keymap vi-insert
# Choose one of these editor switching modes
#
# moosh jk to switch
#"\ee": emacs-editing-mode
#"\ejk": vi-movement-mode
#"\ekj": vi-movement-mode
#
# "\ee" to cycle
# can unmap "\e" to switch to vi-command but don't see a need
#"\e":
"\ee": vi-movement-mode
修正する
では `vi-unix-word-rubout にバインドされ、vi-insert
単語"\C-w"
の境界や他の場所で停止します。この機能が気に入らない。
たとえば、次のことを試してみてください。
$ cannot-delete'
# press left arrow to go back behind the single quote
# press \C-w in vi-insert to try to delete cannot-delete, it won't work
このバグレポート提供された例には問題はありませんが、問題が説明されています。
したがって、この問題を解決するために"\C-w"
emacsにバインドすることができます。unix-word-rubout
再バインドする"\C-w"
必要があるかもしれませんバインド解除のデフォルト。
# In .bashrc
stty werase undef
すべてのデフォルト値をバインド解除するには、次の手順を実行します。
# In .inputrc
set bind-tty-special-chars off
これが重要かどうかはわかりませんが、macOSを使用しているので、そこにあります。私が削除した他の基本バインディング。
それから.inputrc
:
"\C-w": unix-word-rubout
答え2
次の.inputrc
行を使用すると、Meta / Alt+とモードを切り替えることができますE。emacs
vi-insert
j同時に、Moo Mooはkあなたをモードに連れて行きますvi-command
。
注:「kj」を含む唯一の英語の単語は「blackjack」であり、「jk」を含む単語はありません。)
set show-mode-in-prompt on
set keymap emacs
"\ee": vi-editing-mode
"jk": "\eejk"
"kj": "\eejk"
set keymap vi-insert
"\ee": emacs-editing-mode
"jk": vi-movement-mode
"kj": vi-movement-mode
set keymap vi-command
"\ee": emacs-editing-mode
注:v4.3.11(1)からキーbash
マップに直接切り替えようとするために、以下にバインディングを追加するとプロンプトが更新されないため(存在する場合)、この回避策が必要です。keymap emacs
vi-movement-mode
vi-command
show-mode-in-prompt on
興味深い事実:
モードvi-insert
に簡単に追加できるモード固有のバインディングは4つだけです。emacs
"\C-d": vi-eof-maybe
"\C-n": menu-complete
"\C-p": menu-complete-backward
"\e": vi-movement-mode
しかし、以下はデフォルトのemacs
バインディングです。
"\C-d": delete-char
"\C-n": next-history
"\C-p": previous-history
私は次のように解決しました。
set keymap emacs
"\e": "kj" # needs to be below "kj" mapping
"\C-d": delete-char # eof-maybe: ^D does nothing if there is text on the line
"\C-n": menu-complete
"\C-p": menu-complete-backward
"\C-y": previous-history # historY
"\e\C-y": previous-history
古い回答
emacs
から直接行く前はこうしていましたvi-command
。これには、emacs
すべての基本コマンドをvi-insert
キーマップにインポートする操作が含まれます。
デフォルト値emacs-standard
とvi-insert
マッピングを取得します。
INPUTRC=~/dev/null bash -c 'bind -pm emacs-standard' | grep -vE '^#|: (do-lowercase-version|self-insert)$' | sort > emacs-standard
INPUTRC=~/dev/null bash -c 'bind -pm vi-insert' | grep -vE '^#|: (do-lowercase-version|self-insert)$' | sort > vi-insert
以下から追加項目のみをインポートしますemacs-standard
。
comm -23 emacs-standard vi-insert > vi-insert-emacs-additions
次に、~/.inputrc
行の下に次を追加します。vi-insert-emacs-additions
(echo set editing-mode vi && echo set keymap vi-insert && cat vi-insert-emacs-additions) >> ~/.inputrc
便宜上、bash 4.3.11(1) リリースでは次のようにvi-insert-emacs-additions
表示されます。
"\C-a": beginning-of-line "\C-b": backward-char "\C-]": character-search "\C-d": delete-char "\C-e": end-of-line "\C-f": forward-char "\C-g": abort "\C-k": kill-line "\C-l": clear-screen "\C-n": next-history "\C-o": operate-and-get-next "\C-p": previous-history "\C-q": quoted-insert "\C-@": set-mark "\C-_": undo "\C-x\C-?": backward-kill-line "\C-x\C-e": edit-and-execute-command "\C-x\C-g": abort "\C-x\C-r": re-read-init-file "\C-x\C-u": undo "\C-x\C-v": display-shell-version "\C-x\C-x": exchange-point-and-mark "\C-xe": call-last-kbd-macro "\C-x)": end-kbd-macro "\C-xg": glob-list-expansions "\C-x*": glob-expand-word "\C-x!": possible-command-completions "\C-x/": possible-filename-completions "\C-x@": possible-hostname-completions "\C-x~": possible-username-completions "\C-x$": possible-variable-completions "\C-x(": start-kbd-macro "\e0": digit-argument "\e1": digit-argument "\e2": digit-argument "\e3": digit-argument "\e4": digit-argument "\e5": digit-argument "\e6": digit-argument "\e7": digit-argument "\e8": digit-argument "\e9": digit-argument "\eb": backward-word "\e<": beginning-of-history "\e\C-?": backward-kill-word "\ec": capitalize-word "\e\C-]": character-search-backward "\e\C-e": shell-expand-line "\e\C-g": abort "\e\C-h": backward-kill-word "\e\C-i": dynamic-complete-history "\e!": complete-command "\e/": complete-filename "\e@": complete-hostname "\e{": complete-into-braces "\e~": complete-username "\e$": complete-variable "\e\C-r": revert-line "\e\C-y": yank-nth-arg "\e\\": delete-horizontal-space "\e-": digit-argument "\ed": kill-word "\e\e": complete "\e>": end-of-history "\ef": forward-word "\eg": glob-complete-word "\e^": history-expand-line "\e#": insert-comment "\e*": insert-completions "\e_": insert-last-argument "\e.": insert-last-argument "\el": downcase-word "\en": non-incremental-forward-search-history "\ep": non-incremental-reverse-search-history "\e=": possible-completions "\e?": possible-completions "\er": revert-line "\e ": set-mark "\e&": tilde-expand "\et": transpose-words "\eu": upcase-word "\e_": yank-last-arg "\e.": yank-last-arg "\ey": yank-pop
keymap emacs
vi-movement-mode
注:モードに直接切り替えようとしてバインディングを追加すると、vi-command
プロンプトは更新されません(show-mode-in-prompt on
。
これが上記のソリューションがバインディングemacs
を追加する理由ですvi-insert
。これにより時間が長くなりますが、.inputrc
完全なソリューションには必要です。