ターミナルに vim のようなナビゲーションが欲しかったので、以下を追加しました:
set editing-mode vi
set keymap vi
私の.inputrc
ファイルに基づいてこれ. editing-mode vi
vi ナビゲーションを追加します。これは何keymap vi
をするものですか? また、なぜ必要なのですか?
ベストアンサー1
要約
デフォルトのキーマップのバインディングを変更/追加したくない場合は、 行は必要ありませんkeymap vi
。
何keymap vi
が言っているかというと、その時点以降にリストされているバインディングは、そのキーマップ(その通りvi-command
およびと同じキーマップですvi-move
)。
挿入キーマップを変更する場合 (たとえば、Ctrl-A
入力中に行の先頭に移動するバインディングを追加する場合)、keymap vi-insert
行の下でこれを行う必要があります。
モードとマップの詳細情報が必要な場合はvi
、見出しediting-mode vi
(最後のもの)に進んでください。
editing-mode
でも待ってください! ただし、との違いなど、かなりの背景情報が必要になる場合がありますkeymap
。
emacs
特に便利なのは、テキストを挿入しながらも簡単に変更を加えることができるハイブリッド キーマップの概念ですvi-command
。
editing-mode
との違いは何ですかkeymap
?
があるのみ2 つediting-mode
の : emacs
(デフォルト) およびvi
。
editing-mode The editing-mode variable controls which default set of key bindings is used. By default, Readline starts up in Emacs editing mode, where the keystrokes are most similar to Emacs. This variable can be set to either `emacs' or `vi'.
editing-mode
との違いに注意してくださいkeymap
。 2 つ (はい、2 つしかありません。読み進めてください) では、エディターediting-mode vi
のさまざまなモードをエミュレートするためにキーマップが入れ替わりますvi
。全てこれらemacs
は同時に動作しますediting-mode emacs
(後述)。
では、 は実際に何editing-mode
をするのでしょうか? シェルの起動時にアクティブなキーマップを または に設定するだけemacs
ですvi-insert
。
独自のキーマップとは何ですか?
Acceptable keymap names are emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command, and vi-insert. vi is equivalent to vi-command; emacs is equivalent to emacs-standard.
文書化されていませんが、vi
/vi-command
とvi-move
キーマップも同等です。
+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$
残るは、、、、、の 3 つのキーマップを説明する固有のキーマップですemacs
。emacs-meta
キーemacs-ctlx
マップvi
をvi-insert
区別するには、キーマップを調べるのが最も効果的でしょう...
キーマップのデフォルトのバインディングは何ですか?
(例) emacs (デフォルト) のデフォルトのキーバインドを表示するには、次のコマンドを使用します。
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -v '^#
emacs
上記の例では、他のキーマップ名に置き換えることができます。
あまり役に立たないself-insert
や という行が多数あるため、それらを削除します。do-lowercase-version
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -vE '^#|: (do-lowercase-version|self-insert)$' | sort
さまざまなキーマップの違いは何ですかemacs
?
TL;DR: これらは、に適用された単一のマッピング セットに対する異なるビューですediting-mode emacs
。
emacs-standard
2 番目のコマンドの出力を、、、、、およびemacs-meta
というファイルにそれぞれ対応する として保存すると、emacs-ctlx
次のことがわかります。vi-command
vi-insert
keymap
emacs-meta
および にマップされているがemacs-ctlx
にも表示されないコマンドはありませんemacs-standard
。
$ comm -13 <(sed -r 's/.*: (\S+)/\1/' emacs-standard|sort) <(sed -r 's/.*: (\S+)/\1/' emacs-ctlx|sort)
$ comm -13 <(sed -r 's/.*: (\S+)/\1/' emacs-standard|sort) <(sed -r 's/.*: (\S+)/\1/' emacs-meta|sort)
$
したがって、emacs
/ は、および のemacs-standard
両方の動作機能のスーパーセットですemacs-ctlx
。emacs-meta
これは次のことを意味します。
keymap emacs
"\eg": glob-expand-word
"\C-x\C-r": re-read-init-file
機能的には次のものと同等です:
keymap emacs-meta
"g": glob-expand-word
keymap emacs-ctlx
"\C-r": re-read-init-file
2 番目の形式の方が読みやすいと主張する人もいるかもしれません。
テキストの挿入: emacs
vsvi-insert
28個のコマンドがありemacs-standard
ますvi-insert
+ravi@boxy:~/lib/readline$ comm -12 vi-insert emacs-standard |wc -l
28
+ravi@boxy:~/lib/readline$
emacs
/ はemacs-standard
基本的に のスーパーセットです。したがって、テキストを入力する場合は、できる限り のキーマップvi-insert
を使用するのが最善です。emacs-standard
vi-insert
簡単に切り替えemacs
てvi-command
。
vi-insert
に含まれず、追加されるバインディングはemacs-standard
以下のとおりです。
+ravi@boxy:~/lib/readline$ comm -23 vi-insert emacs-standard
"\C-d": vi-eof-maybe
"\C-n": menu-complete
"\C-p": menu-complete-backward
"\e": vi-movement-mode
これら 4 つのうち最初の 3 つはemacs
バインディングと競合します。
"\C-d": delete-char
"\C-n": next-history
"\C-p": previous-history
私は次のように解決しました。
set keymap emacs
"\e": "kj" # see https://unix.stackexchange.com/questions/303631/how-can-i-setup-a-hybrid-readline-with-emacs-insert-mode-and-vi-command-mode
"\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
editing-mode vi
上で見たようにvi
、、vi-command
およびvi-move
は全く同一のキーマップ:
+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$
合計は二デフォルトで に関連付けられている個別のマップediting-mode vi
。
editing-mode vi
の場合、keymap
使用されるのはvi
/ vi-command
/vi-move
とvi-insert
(開始キーマップ) です。一度にアクティブになるのは、これら 2 つのマップのうち 1 つだけです。
editing-mode vi
は、シェルの起動時に というラベルの付いたデフォルトのキーマップを設定するだけですvi-insert
。ここでも、一度にアクティブになるキーマップは 1 つだけです。このvi-insert
キーマップはほとんどのキーを にマップするself-insert
ため、キーボードのプラスチック ボタンを押すと、そこに印刷された記号が画面に表示されます。
キーマップは、コマンドを使用して、キーマップ内のデフォルトでキーにバインドされている/ /vi-insert
と呼ばれるテキスト操作キーマップに自身を入れ替えることができます。vi-command
vi
vi-move
vi-movement-mode
ESCvi-insert
実際、上記のハイブリッド ソリューションのように、キーマップでもコマンドを使用して、 のようなテキスト操作キーマップをアクティブにemacs
設定できます。vi
vi-movement-mode
あるいはもっと簡単な言葉で言えば...
デフォルトでは、キーマップがアクティブなときに押すとキーマップESCが変更されます。vi-command
vi-insert
キーマップでは、エディターのデフォルト モードやコマンド モードと同様に、 、などvi-command
の標準の単一キー押下を使用してテキストを移動したり操作したりします。通常、 + の組み合わせはありません。このモードではテキストを挿入できません。文字キーは編集/移動コマンドにマップされています。テキストを入力するには、キーマップに切り替えます(例: を押すと「挿入」になります)。abcvi
Ctrlkeyvi-insert
i
テキストの入力は、キーマップを使用して行います。キーマップは、 ファイルにvi-insert
がある場合、シェルの起動時にアクティブになります。のときに「挿入」を押すと、キーマップに切り替わります( で開始した場合は、他のさまざまな方法でも切り替わります)。editing-mode vi
.inputrc
vi-insert
ivi-command
vi
エディターを知らない限りvi
、最初はキーの使い方が非常に難しいと感じるかもしれませんvi-command
が、慣れれば長いひげを生やした魔法使いのようにテキストを編集できるようになります。