bind - fish のキーバインドを扱う¶
概要¶
bind [(-M | --mode) MODE] [(-m | --sets-mode) NEW_MODE] [--preset | --user] [-s | --silent] KEYS COMMAND ...
bind [(-M | --mode) MODE] [--preset] [--user] [--color WHEN] [KEYS]
bind [-a | --all] [--preset] [--user] [--color WHEN]
bind (-f | --function-names)
bind (-K | --key-names)
bind (-L | --list-modes)
bind (-e | --erase) [(-M | --mode) MODE] [--preset] [--user] [-a | --all] | KEYS ...
説明¶
bind はキーバインドを管理します。
KEYS と COMMAND の両方が指定された場合、 bind は指定された MODE にバインドを追加(または置換)します。 KEYS のみが指定された場合、 bind はそのキーに対して MODE またはすべてのモードに存在するバインドを表示します。 KEYS 引数が提供されない場合、 bind は MODE またはすべてのモードの全バインドを表示します。
KEYS はカンマ区切りのキー名のリストです。修飾キーは、キー名の前に ctrl- 、 alt- 、 shift- 、 super- (WindowsキーやCommandキー)を組み合わせて指定できます。例えば、 Alt キーを押しながら w を押す操作は alt-w と記述します。キー名は大小文字を区別します。例えば alt-W は alt-shift-w と同じです。 ctrl-x,ctrl-e は、 ctrl-x を押した後に ctrl-e を押すことを意味します。
いくつかのキーには名前が付いています。通常、それらは印字可能な文字として表現できないためです。以下がその一覧です。
矢印キー:
up,down,left,rightbackspacecomma(,)deleteendenterescapef1からf12homeinsertmenuminus(-)pageuppagedownprintscreenspacetab
これらの名前は大小文字を区別します。
KEYS に空の値('')を指定すると、他に一致するものがない場合に使用される汎用バインド(デフォルトの挙動)を指定できます。ほとんどのバインドモードでは、これを self-insert 関数にバインドするのが妥当です(例: bind '' self-insert)。これにより、他のバインドがないキー入力はそのまま文字として挿入されます。非印字文字はエディタによって無視されるため、これによって制御シーケンスがそのまま挿入されることはありません。
キーコンビネーションの名前を調べるには、 fish_key_reader を使用できます。
COMMAND には任意の fishコマンドを指定できますが、一連の特別な入力用関数を指定することもできます。これらには、カーソルの移動、キルリング(クリップボード履歴)の操作、タブ補完の実行などを行う関数が含まれます。これら入力用関数の一覧については、 bind --function-names を実行するか、 以下を参照 してください。
注釈
スクリプトがコマンドラインの内容を変更する場合、最後に特別な入力用関数である repaint を呼び出して終了する必要があります。
キーバインドには、vi のモーダル入力を模した「モード(modes)」を使用できます。デフォルトのモードは "default" です(vi モードでは、これは vi の「ノーマル」モードに相当します)。すべてのキーバインドは単一のモードに対して適用されます。適用するモードは -M MODE で指定できます。キーバインドによってモードを変更したい場合は、 -m NEW_MODE で新しいモードを指定できます。現在のモードは $fish_bind_mode 変数で確認および変更できます。fish 関数内からモードを変更したい場合は、 set fish_bind_mode MODE を使用してください。
カスタムキーバインドを保存するには、 bind 文を config.fish に記述してください。あるいは、 fish_user_key_bindings という名前の関数が存在する場合、 fish はそれも自動的に実行します。
オプション¶
以下のオプションが利用可能です:
- -f 、 --function-names
利用可能な入力用関数の一覧を表示します
- -K 、 --key-names
backspaceのような、利用可能な名前付きキーの一覧を表示します。- -L 、 --list-modes
定義されているバインドモードの一覧を表示します
- -M MODE 、 --mode MODE
バインドを使用するバインドモードを指定します。デフォルトは "default" です。 vi バインド を使用している場合、これは vi で言うところの「ノーマル」モードである コマンド モードに相当します。
- -m NEW_MODE 、 --sets-mode NEW_MODE
このバインドが実行された後、現在のモードを NEW_MODE に変更します。
- -e 、 --erase
新しく定義する代わりに、指定されたシーケンスとモードのバインドを削除します。このフラグを使用して複数のシーケンスを指定できます。-M 、 --mode と併せて -a 、 --all を指定すると、シーケンスに関係なく、指定されたモードのすべてのバインドを削除します。-M 、 --mode なしで -a 、 --all を指定すると、シーケンスに関係なく、すべてのモードのすべてのバインドを削除します。
- -a 、 --all
--erase を参照してください
- --preset 、 --user
バインド操作をユーザーレベルで行うか、プリセットレベルで行うかを指定します。fish がマッピングを検索する際、ユーザーバインドはプリセットバインドよりも優先されます。デフォルトでは、一覧表示(両方のレベルが表示されます)を除き、すべての
bindの呼び出しは「ユーザー」レベルで動作します。新しいバインドの挿入を除き、すべての呼び出しは(--preset と --user の両方が指定されている場合)両方のレベルで同時に動作できます。--preset は、完全なバインドセット(fish_vi_key_bindingsの作成時など)でのみ使用すべきです。- -s 、 --silent
未バインドのシーケンスに対するエラーメッセージを抑制します。
- --color WHEN
バインドを一覧表示する際にシンタックスハイライトの色を使用するかどうかを制御します。WHEN には、
auto(デフォルト。出力先が ターミナルの場合 に着色)、always、またはneverを指定できます。- -h 、 --help
このコマンドの使用に関するヘルプを表示します。
特殊入力関数¶
以下の特殊入力関数が利用可能です。
and直前の関数が成功した場合のみ、次の関数を実行します(注意: 成功を報告するのは一部の関数のみです)。
accept-autosuggestion現在の自動提案(autosuggestion)を受け入れます。受け入れるものがない場合は false を返します。
backward-char左に 1 文字移動します。補完ページャがアクティブな場合は、代わりに前の補完候補を選択します。
backward-char-passive左に 1 文字移動しますが、移動に関連しない操作はトリガーしません。カーソルがコマンドラインの先頭にある場合は何もしません。補完ページャの UI が表示されている場合でも、選択項目を変更しません。
backward-token左に 1 引数分移動します。
backward-delete-charカーソルの左側にある 1 文字を削除します。
backward-kill-tokenカーソルの左側にある引数をキルリングへ移動します。
backward-kill-line行頭からカーソル位置までのすべてをキルリングへ移動します。
backward-kill-path-componentカーソルの左側にあるパスの構成要素(パスコンポーネント)を 1 つキルリングへ移動します。パスコンポーネントとは、パスの一部になり得るすべての文字を指し、具体的には
/={,}'\":@ |;<>&および改行、タブ以外の文字の連続です。backward-kill-word現在の単語の先頭まで、カーソルの左側にある単語をキルリングへ移動します(Vim の
dbと同様の動作です)。backward-kill-bigword空白で区切られた現在の単語の先頭まで、カーソルの左側にある単語をキルリングへ移動します(Vim の
dBと同様の動作です)。backward-path-componentカーソルを 1 つ左の パス構成要素 へ移動します。
backward-word前の単語の先頭で止まるように、カーソルを 1 単語分左へ移動します(vim の
bや Emacs のM-bと同様ですが、単語の区切りルールがわずかに異なります)。backward-bigword前の単語の先頭で止まるように、カーソルを 1 つ左の「空白区切りの単語(bigword)」へ移動します(vim の
Bと同様です)。backward-word-end前の単語の末尾へ移動します(vim の
geと同様です)。backward-bigword-end前の「空白区切りの単語(bigword)」の末尾へ移動します(vim の
gEと同様です)。beginning-of-bufferバッファの先頭、つまり 1 行目の最初へ移動します。
beginning-of-history履歴の最初へ移動します。
beginning-of-line行頭へ移動します。
begin-selectionテキストの選択を開始します。
cancelページャが開いている場合は閉じ、補完が挿入された直後であればその補完を取り消します。
cancel-commandline現在のコマンドラインをキャンセルして新しい空のコマンドラインに置き換えます。元の内容は、キャンセルされたことを示すマーカーと共にその場に残されます。
capitalize-word現在の単語の先頭を大文字にします。
clear-commandlineコマンドライン全体を空にします。
clear-screen画面を消去し、プロンプトを再描画します。
scrollback-push以前の出力をターミナルのスクロールバックに押し出し、プロンプトを一番上に配置します。これには、ターミナルが ECMA-48 SCROLL UP コマンドおよび カーソル位置レポート を実装している必要があります。
complete現在のトークンの残りの部分を推測(補完)します。
complete-and-search補完オプションに対して検索可能なページャを起動します(利便性のため、この関数は補完ページャ内で逆方向への移動も行います)。
delete-charカーソルの右側にある文字を 1 文字削除します。
delete-or-exitカーソルの右側にある文字を 1 文字削除します。コマンドラインが空の場合はシェルを終了します。
down-line1 行下に移動します。
downcase-word現在の単語を小文字にします。
end-of-bufferバッファの最後(つまり最終行の末尾)へ移動します。すでにコマンドラインの末尾にいる場合は、現在のオートサジェスチョン(自動提案)を確定します。
end-of-history履歴の末尾(最新の項目)へ移動します。
end-of-line行末へ移動します。
end-selectionテキストの選択を終了します。
expand-abbr現在カーソル下にある省略形(abbreviation)を展開します。
execute現在のコマンドラインを実行します。
exitシェルを終了します。
forward-tokenカーソルを 1 つ右の引数(トークン)へ移動します。
forward-charカーソルを 1 文字右に移動します。コマンドラインの末尾にいる場合は、現在のオートサジェスチョンを確定します。補完ページャがアクティブな場合は、代わりに次の補完候補を選択します。
forward-char-passiveカーソルを 1 文字右に移動しますが、移動以外の操作(確定など)をトリガーしません。カーソルがコマンドラインの末尾にいても、オートサジェスチョンを確定しません。補完ページャが表示されていても、選択項目を変更しません。
forward-path-componentカーソルを 1 つ右の パス構成要素 へ移動します。コマンドラインの末尾にいる場合は、オートサジェスチョンからパス構成要素 1 つ分を確定します。
forward-single-charカーソルを 1 文字右に移動します。コマンドラインの末尾にいる場合は、オートサジェスチョンから 1 文字分だけを確定します。
forward-word現在の単語の末尾を越えた位置まで、カーソルを 1 単語分右へ移動します。コマンドラインの末尾にいる場合は、オートサジェスチョンから 1 単語分を確定します。
forward-word-viforward-word と同様ですが、次の単語の先頭で止まります(vim の
wと同様です)。forward-word-endforward-word と同様ですが、次の単語の末尾で止まります(vim の
eと同様です)。
forward-bigword現在の単語の末尾を越えた位置まで、カーソルを 1 つ右の「空白区切りの単語(bigword)」へ移動します。コマンドラインの末尾にいる場合は、オートサジェスチョンから 1 単語分を確定します。
forward-bigword-viforward-bigword と同様ですが、次の単語の先頭で止まります(vim の
Wと同様です)。forward-bigword-endforward-bigword と同様ですが、次の単語の末尾で止まります(vim の
Eと同様です)。history-pager履歴に対して検索可能なページャを起動します(インクリメンタル検索)。履歴ページャがすでにアクティブな場合は、さらに過去へと遡って検索します。
history-delete履歴ページャ内、または上矢印キーによる履歴検索で選択中の履歴項目を永久に削除します。
history-search-backward履歴を遡って前の一致項目を検索します。
history-search-forward履歴を先へ進んで次の一致項目を検索します。
history-prefix-search-backward現在の入力内容を接頭辞(前方一致)として履歴を遡り、前の一致項目を検索します。
history-prefix-search-forward現在の入力内容を接頭辞(前方一致)として履歴を先へ進み、次の一致項目を検索します。
history-token-search-backward履歴を遡って、一致する前の引数(トークン)を検索します。
history-token-search-forward履歴を先へ進んで、一致する次の引数(トークン)を検索します。
history-last-token-search-backward履歴を遡って、一致する前の「最後の引数」を検索します。
history-last-token-search-forward履歴を先へ進んで、一致する次の「最後の引数」を検索します。
forward-jumpおよびbackward-jumpもう 1 文字読み取り、カーソルの後/前にあるその文字の次の出現箇所へジャンプします。
forward-jump-tillおよびbackward-jump-till次の出現箇所の「直前」までジャンプします。
repeat-jumpおよびrepeat-jump-reverse最後のジャンプを同じ方向、または逆方向でもう一度行います。
jump-to-matching-bracketカーソル下の文字が括弧であれば、対応する括弧へジャンプします。そうでなければ、カーソルの後にある「いずれかの閉じ括弧」の次の出現箇所へジャンプします。対象となる括弧は
([{}])です。jump-till-matching-bracketjump-to-matching-bracketと同様ですが、開き括弧の場合は右へ、閉じ括弧の場合は左へカーソルをオフセットします。このオフセットはジャンプ元とジャンプ先の両方に適用されます。言い換えれば、カーソルは常に括弧の内側でジャンプし、括弧の 1 文字手前で止まります。この入力用関数は、vi のテキストオブジェクトibをエミュレートするのに便利です。対象となる括弧は([{}])です。kill-token次の引数(トークン)をキルリングへ移動します。
kill-lineカーソル位置から行末までのすべてをキルリングへ移動します。
kill-path-componentパス構成要素 を 1 つキルリングへ移動します。
kill-selection選択されたテキストをキルリングへ移動します。
kill-whole-line行全体(後に続く改行を含む)をキルリングへ移動します。その行が最終行である場合は、前にある改行も削除されます。
kill-inner-line行全体(後に続く改行を含まない)をキルリングへ移動します。
kill-word次の単語をキルリングへ移動し、削除された単語の末尾の直後で止まります。
kill-word-vi次の単語をキルリングへ移動し、次の単語の先頭で止まります(vim の
dwと同様です)。kill-bigword次の空白区切りの単語(bigword)をキルリングへ移動し、現在の単語の末尾の直後で止まります。
kill-bigword-vi次の空白区切りの単語(bigword)をキルリングへ移動し、次の単語の先頭で止まります(vim の
dWと同様です)。kill-inner-wordカーソル下の単語を削除します(vim の
diwと同様です)。kill-inner-bigwordカーソル下の空白区切りの単語(bigword)を削除します(vim の
diWと同様です)。kill-a-wordカーソル下の単語と、その周囲の空白を削除します(vim の
dawと同様です)。kill-a-bigwordカーソル下の空白区切りの単語(bigword)と、その周囲の空白を削除します(vim の
daWと同様です)。nextd-or-forward-wordコマンドラインが空の場合はディレクトリ履歴を先に進み、空でない場合は 1 単語右へ移動します。コマンドラインの末尾にいる場合は、現在のオートサジェスチョンから 1 単語分を確定します。
or直前の関数が成功しなかった場合のみ、次の関数を実行します(Note: 失敗を報告する関数は一部のみです)。
pager-toggle-search補完ページャが表示されている場合は検索フィールドの表示/非表示を切り替えます。
history-pagerの後に使用された場合は、履歴を新しい方に向かって検索します。prevd-or-backward-wordコマンドラインが空の場合はディレクトリ履歴を遡り、空でない場合は 1 単語左へ移動します。
repaintプロンプト関数を再実行し、プロンプトを再描画します(後方互換性のための
force-repaintも同様です)。repaint-modefish_mode_prompt を再実行し、プロンプトを再描画します。これは vi モードで便利です。
fish_mode_promptが存在しないか、何も出力しない場合は、通常の repaint と同様に動作します。self-insert一致したシーケンスをコマンドラインに挿入します。
self-insert-notfirstカーソルが行頭にある場合を除き、一致したシーケンスをコマンドラインに挿入します。
get-keyこのバインドをトリガーするために押されたキーを環境変数
fish_keyにセットします。使用例:for i in (seq 0 9) bind $i get-key 'commandline -i "#$fish_key"' 'set -eg fish_key' end
suppress-autosuggestion現在のオートサジェスチョンを削除します。削除すべき提案があった場合は真(true)を返します。
swap-selection-start-stop選択範囲を変更せずに、ハイライトされたテキストの反対側の端へ移動します。
transpose-charsカーソルの左側にある 2 つの文字を入れ替えます。
transpose-wordsカーソルの左側にある 2 つの単語を入れ替えます。
togglecase-charカーソル下の文字の大文字・小文字を切り替えます。
togglecase-selection選択範囲の文字の大文字・小文字を切り替えます。
insert-line-under現在の行の下に新しい行を追加します。
insert-line-over現在の行の上に新しい行を追加します。
up-line1 行上に移動します。
undoおよびredoコマンドライン上の直近の編集を取り消す、またはやり直します。
upcase-word現在の単語を大文字にします。
yankキルリングの最新の項目をバッファに挿入(貼り付け)します。
yank-popキルリングを回転させ、一つ前の項目を取り出します。
追加の関数¶
以下の関数は通常の関数として含まれていますが、特に入力編集において有用です。
up-or-searchおよびdown-or-searchカーソル位置と現在のモードに応じて、カーソル移動または履歴検索を行います。
edit_command_buffer現在のコマンドラインの内容を保持した状態で、ビジュアルエディタ(環境変数
VISUAL、EDITORで指定されたもの)を開きます。fish_clipboard_copy現在の選択範囲をシステムクリップボードにコピーします。
fish_clipboard_pasteシステムクリップボードの現在の選択内容をカーソルの前に貼り付けます。
fish_commandline_append引数をコマンドラインの末尾に追加します。コマンドラインがすでにその引数で終わっている場合は、代わりにその末尾部分を削除します。コマンドラインが空の場合は、履歴の最後のコマンドから開始します。
fish_commandline_prepend引数をコマンドラインの先頭に追加します。コマンドラインがすでにその引数で始まっている場合は、代わりにその先頭部分を削除します。コマンドラインが空の場合は、履歴の最後のコマンドから開始します。
使用例¶
ctrl-d が押されたときにシェルを終了するようにします。:
bind ctrl-d 'exit'
pageup が押されたときに履歴検索を実行するようにします。:
bind pageup history-search-backward
vi キーバインド を有効にし、 ctrl-c を入力行の消去に再割り当てします。:
set -g fish_key_bindings fish_vi_key_bindings
bind -M insert ctrl-c kill-whole-line repaint
ctrl-g が押されたときに git diff を実行し、その後にコマンドラインを再描画します。:
bind ctrl-g 'git diff' repaint
tab と shift-tab を入れ替え、tab キーで検索フィールドにフォーカスするようにします。ただし、すでに検索フィールドがアクティブな場合は、元の挙動(tab で次へ、 shift-tab で前へ)を維持します。:
bind tab '
if commandline --search-field >/dev/null
commandline -f complete
else
commandline -f complete-and-search
end
'
bind shift-tab '
if commandline --search-field >/dev/null
commandline -f complete-and-search
else
commandline -f complete
end
'
ターミナルの制限¶
fish が動作する Unix ターミナルは、その根幹において 70 年代の技術です。そのため、内部で実行されるアプリケーション側では回避できない制限がいくつか存在します。
例えば歴史的に、コントロールキーは上位 3 ビットを 0 に設定することで文字を修飾します。これは以下のことを意味します。
多くの文字とコントロールキーの組み合わせは、他のキーと区別がつきません。例: ctrl-i は tab と「同じ」であり、 ctrl-j は改行(
\n)と「同じ」です。コントロールキーとシフトキーは同時には機能しません。 ctrl-X は ctrl-x と同一です。
その他のキーには直接的なエンコーディングがなく、エスケープシーケンスとして送信されます。例えば、右矢印キー(right, →)は通常 \e\[C を送信します。
一部のモダンなターミナルは、より多くの文字や修飾キーを区別できる新しいキーエンコーディングをサポートしており、fish は可能な限りそれらを自動的に有効にします。
確信が持てない場合は、 fish_key_reader - explore what characters keyboard keys send を実行してください。もし ctrl-i を押したときに tab が送信されると表示されるなら、お使いのターミナルは新しいエンコーディングをサポートしておらず、fish はターミナルから送られてくる情報に制限されることになります。
キーのタイムアウト¶
複数の文字からなるシーケンスをバインドした場合、fish がその一部しか受信していない可能性が常にあります。その際、完全なシーケンスなのか、その一部なのかを判別する必要があります。
例:
bind j,k 'commandline -i foo'
# or `bind jk`
これは jk というシーケンスに、コマンドラインへの "foo" の挿入をバインドします。 "j" だけが押されたとき、fish は(デフォルトの self-insert に従って) "j" を挿入すべきか、それとも "k" を待つべきか判断できません。
これにはタイムアウトを有効にできます。 fish_sequence_key_delay_ms 変数にミリ秒単位でタイムアウト時間を設定してください。タイムアウト時間を過ぎると、fish はシーケンスの完了を待つのをやめ、すでに受け取っている文字で可能な処理を行います。
Escape キーは特殊なケースです。単独のキーとしても使われますが、ファンクションキーや矢印キーなどの長いエスケープシーケンスの一部としても使われるからです。また、Alt キーと他のキーを同時に押すと(例: Alt+a)、通常はエスケープ文字に続いて "a" が送信されます。そのため、エスケープ文字には fish_escape_delay_ms で設定される独自のタイムアウトが用意されています。
キーシーケンス も参照してください。
