「set keymap vi」は何をしますか? 質問する

「set keymap vi」は何をしますか? 質問する

ターミナルに vim のようなナビゲーションが欲しかったので、以下を追加しました:

set editing-mode vi
set keymap vi

私の.inputrcファイルに基づいてこれ. editing-mode vivi ナビゲーションを追加します。これは何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

GNU Readline ライブラリのドキュメント言う:

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-commandvi-moveキーマップも同等です。

+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$ 

残るは、、、、、の 3 つのキーマップを説明する固有のキーマップですemacsemacs-metaキーemacs-ctlxマップvivi-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-standard2 番目のコマンドの出力を、、、、、およびemacs-metaというファイルにそれぞれ対応する として保存すると、emacs-ctlx次のことがわかります。vi-commandvi-insertkeymap

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-ctlxemacs-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 番目の形式の方が読みやすいと主張する人もいるかもしれません。

テキストの挿入: emacsvsvi-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-standardvi-insert簡単に切り替えemacsvi-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-movevi-insert(開始キーマップ) です。一度にアクティブになるのは、これら 2 つのマップのうち 1 つだけです。

editing-mode viは、シェルの起動時に というラベルの付いたデフォルトのキーマップを設定するだけですvi-insert。ここでも、一度にアクティブになるキーマップは 1 つだけです。このvi-insertキーマップはほとんどのキーを にマップするself-insertため、キーボードのプラスチック ボタンを押すと、そこに印刷された記号が画面に表示されます。

キーマップは、コマンドを使用して、キーマップ内のデフォルトでキーにバインドされている/ /vi-insertと呼ばれるテキスト操作キーマップに自身を入れ替えることができます。vi-commandvivi-movevi-movement-modeESCvi-insert

実際、上記のハイブリッド ソリューションのように、キーマップでもコマンドを使用して、 のようなテキスト操作キーマップをアクティブにemacs設定できます。vivi-movement-mode

あるいはもっと簡単な言葉で言えば...

デフォルトでは、キーマップがアクティブなときに押すとキーマップESCが変更されます。vi-commandvi-insert

キーマップでは、エディターのデフォルト モードやコマンド モードと同様に、 、などvi-commandの標準の単一キー押下を使用してテキストを移動したり操作したりします。通常、 + の組み合わせはありません。このモードではテキストを挿入できません。文字キーは編集/移動コマンドにマップされています。テキストを入力するには、キーマップに切り替えます(例: を押すと「挿入」になります)。abcviCtrlkeyvi-inserti

テキストの入力は、キーマップを使用して行います。キーマップは、 ファイルにvi-insertがある場合、シェルの起動時にアクティブになります。のときに「挿入」を押すと、キーマップに切り替わります( で開始した場合は、他のさまざまな方法でも切り替わります)。editing-mode vi.inputrcvi-insertivi-commandvi

エディターを知らない限りvi、最初はキーの使い方が非常に難しいと感じるかもしれませんvi-commandが、慣れれば長いひげを生やした魔法使いのようにテキストを編集できるようになります。

おすすめ記事