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 はキーバインドを管理します。

KEYSCOMMAND の両方が指定された場合、 bind は指定された MODE にバインドを追加(または置換)します。 KEYS のみが指定された場合、 bind はそのキーに対して MODE またはすべてのモードに存在するバインドを表示します。 KEYS 引数が提供されない場合、 bindMODE またはすべてのモードの全バインドを表示します。

KEYS はカンマ区切りのキー名のリストです。修飾キーは、キー名の前に ctrl-alt-shift-super- (WindowsキーやCommandキー)を組み合わせて指定できます。例えば、 Alt キーを押しながら w を押す操作は alt-w と記述します。キー名は大小文字を区別します。例えば alt-Walt-shift-w と同じです。 ctrl-x,ctrl-e は、 ctrl-x を押した後に ctrl-e を押すことを意味します。

いくつかのキーには名前が付いています。通常、それらは印字可能な文字として表現できないためです。以下がその一覧です。

  • 矢印キー: up, down, left, right

  • backspace

  • comma (,)

  • delete

  • end

  • enter

  • escape

  • f1 から f12

  • home

  • insert

  • menu

  • minus (-)

  • pageup

  • pagedown

  • printscreen

  • space

  • tab

これらの名前は大小文字を区別します。

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-line

1 行下に移動します。

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-vi

forward-word と同様ですが、次の単語の先頭で止まります(vim の w と同様です)。

forward-word-end

forward-word と同様ですが、次の単語の末尾で止まります(vim の e と同様です)。

forward-bigword

現在の単語の末尾を越えた位置まで、カーソルを 1 つ右の「空白区切りの単語(bigword)」へ移動します。コマンドラインの末尾にいる場合は、オートサジェスチョンから 1 単語分を確定します。

forward-bigword-vi

forward-bigword と同様ですが、次の単語の先頭で止まります(vim の W と同様です)。

forward-bigword-end

forward-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-bracket

jump-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-mode

fish_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-line

1 行上に移動します。

undo および redo

コマンドライン上の直近の編集を取り消す、またはやり直します。

upcase-word

現在の単語を大文字にします。

yank

キルリングの最新の項目をバッファに挿入(貼り付け)します。

yank-pop

キルリングを回転させ、一つ前の項目を取り出します。

追加の関数

以下の関数は通常の関数として含まれていますが、特に入力編集において有用です。

up-or-search および down-or-search

カーソル位置と現在のモードに応じて、カーソル移動または履歴検索を行います。

edit_command_buffer

現在のコマンドラインの内容を保持した状態で、ビジュアルエディタ(環境変数 VISUALEDITOR で指定されたもの)を開きます。

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

tabshift-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-itab と「同じ」であり、 ctrl-j は改行(\n)と「同じ」です。

  • コントロールキーとシフトキーは同時には機能しません。 ctrl-Xctrl-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 で設定される独自のタイムアウトが用意されています。

キーシーケンス も参照してください。