古い回答

古い回答

デフォルトでは、すべての主keymap emacsキーバインディングを使用でき、まだvi-commandモードに変更できるハイブリッドモードが必要です。

どのように設定しますか?

ベストアンサー1

私は読んだこんにちは答え ここそしてここ

より良いアプローチは、vi-insertバインディングをに移動するのではなく、バインディングをに移動することです。その理由は、切り替えるバインディングがあり、モードに切り替えるように機能をシミュレートするのが難しいからです。emacsemacsvi-insertvi-commandvi-insertemacs

たとえば、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-insertvi-insertemacsvi-insert

右の列()に一意のバインディングがある場合vi-insert、たとえば

    "\e": vi-movement-mode

`vi-insertにすでに存在しているので削除してください。

残りのバインディングは左列(emacs)にあります。に追加するので、これらはそのままにしてくださいvi-insert


これが私に追加することを選択したバインディングです.inputrcemacsvi-insert

"kj"私はスイッチを使用しないことにしましたvi-commandこんにちは~の回答なぜなら、それを使って"\ee"からに移動するクエストを完了しemacsvi-insert次にからに移動する別のクエストを完了できるから"\e"です。実際にはありますvi-insertvi-commandblackjackを除くkjを含む単語そしてjkを含む単語(主に指名)

保管して"\C-d": delete-charしまいました"\C-d": vi-eof-maybeEnterforが利用可能vi-eof-maybeで、readlineを押して誤ってreadlineを終了したくないからです"\C-d"。これは、モードでバインディングを"\C-d": vi-eof-maybeオーバーライドするためにバインディングを使用しているため、バインディングを削除することを意味します。vi-eof-maybevi-insertdelete-char

代わりに下向き矢印を使用できるので、"\C-n": menu-completeそのままにしてください。これはすでにバインディングがあるため、両方のバインディングを削除することを意味します。"\C-n": next-historynext-historyvi-insertmenu-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-commandemacsvi-insert"\e"

これは"jk"、モッシングがコメントアウトされたことを示します。現在"\ee"ループモードを使用しています。"\e"必要ないと思ったのでfromをバインド解除しませんでした。だからそれがすることは、あなたが押して待つと、あなたは行くでしょう。vi-insertvi-command"\e"vi-insertvi-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

おすすめ記事