readline
モードとキーマップの違いは何ですか?
各モードの主キーバインディングをどのように見つけますか?
答え1
長い話を短く
emacs
(デフォルト)の主キーバインディングを表示するには(例)以下を使用します。
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -vE '^#|: (do-lowercase-version|self-insert)$'
とvi
vi-command
vi-move
一つで同じキーマッピング。
どちらもemacs-meta
キーマップemacs-ctlx
のサブセットビューですemacs
。
vi
モードとマップについてもっと知りたい場合は、タイトルediting-mode vi
(最後)にスキップしてください。
しかし、待って!しかし、かなり多くの背景情報が必要な場合があります。たとえば、editing-mode
anとaの違いがありますkeymap
。
emacs
特に便利なのは、簡単に変更できながらテキストを挿入できるハイブリッドキーマップの概念ですvi-command
。
editing-mode
これらのanとaの違いは何ですかkeymap
?
持つただ2つのediting-mode
s:(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-command
とvi-move
キーマップも同じです。
+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$
これにより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
?
重要な要約:適用するマッピングセットの異なる視点editing-mode emacs
。
emacs-standard
emacs-meta
2番目のコマンドの出力を、、、、および対応するemacs-ctlx
sというファイルに入れると、次のようになります。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
:vi-insert
emacs-standard
not inには28のコマンドがあります。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
not inの唯一の追加バインディングは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
れるsは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
標準の単一キー(たとえば、aおよびb)を使用してcテキストを移動して対話します。一般的に+の組み合わせはvi
ありません。このモードでは、文字キーが編集/移動コマンドにマップされ、テキストを挿入できません。テキストを入力するには、キーマップに切り替えます(例:「挿入」を押す)。Ctrlkeyvi-insert
i
vi-insert
ファイルにキーマップがある場合は、シェルの起動時にアクティブになるキーマップを使用してテキストを入力します。キーマップに切り替えるには、「挿入」キーを押します。 (キーマップで起動した人のために他の方法もあります。)editing-mode vi
.inputrc
vi-insert
ivi-command
vi
vi
エディタに慣れていないと、vi-command
最初はキーを使用するのが難しいかもしれませんが、うまく使用すると、ひげを生やしたウィザードのようにテキストを編集できます。