書式
bind [(-M | --mode) MODE] [(-m | --sets-mode) NEW_MODE] [(-k | --key)] SEQUENCE COMMAND [COMMAND...]

書式
bind [(-M | --mode) MODE] [(-k | --key)] SEQUENCE

書式
bind (-K | --key-names) [(-a | --all)]

書式
bind (-f | --function-names)

書式
bind (-e | --erase) [(-M | --mode) MODE] (-a | --all | [(-k | --key)] SEQUENCE [SEQUENCE...])

概要

bind コマンドは指定された
キーシーケンスとコマンドの
結び付け(キーバインド)を加えます。

SEQUENCE は割り当てる文字列で
fishのエスケープシーケンスで記述されます。

たとえば、Altキーと別な文字キーXを押すと、
「ESC文字とX」が送信されますので、
Altを押しながらXは
\eX エスケープシーケンスを使って記述できます。

たとえば、Alt+wは \ew となります。

コントロール文字は
\c エスケープを使って
同様に記述できます。

たとえば、Ctrl+X (^X) は
\cx と記述できます。

注意してほしいのは
Altキーを押す場合は
大文字小文字を区別するのに対し、
Ctrlキーを押す場合は区別しないことです。

このことはあくまでも
テキストベースの端末の制限によるものであり、
fishの制限ではありません。

デフォルトのキーバインドは

  • 空文字列(すなわち '') を
    SEQUENCE に記述することで設定
  • 他のキーバインドにマッチしないならば
    いつでも使われる
  • キー自身を挿入する(self-insert)関数
    (つまり bind '' self-insert)を使う場合に
    意味をなす。
  • コマンドラインエディタ に設定されていない
    いかなるキーストロークを挿入
  • コントロールシーケンスが表示される結果にはならない

-k スイッチが使われると、キー名
(たとえば downupbackspace)が
キーシーケンスの代わりに使われます。

名前は相当するcursesの変数から
key_ プレフィクスを取り除いたものと
同じように使われます。

(それについては
man 5 terminfo を実行して詳細を読むか、

bind --key-names を実行して
使用できるキー名の全リストを見てください。
bind --key-namesの実行例)

訳注:fish_key_reader を使うと、割り当てたいキーを押すだけで bind コマンドの例が出てきて便利です!

COMMAND はどのfishのコマンドを受け付けますが、
以下のような特別な入力関数のセットの1つも受け付けます。

  • カーソル移動
  • キルリング操作
  • タブ補完

bind --function-names
入力関数の全リストが得られます。

COMMAND がシェルスクリプトの
コマンドであるとき、
実際のコードを関数にしてから
関数名を割り当てるのが良い習慣です。

この方法は
編集中の関数のテストがとても容易になり、
たいていの場合はより可読性が上がります。

スクリプトが出力をするならば、
スクリプトは commandline -f repaint
呼び出して終了する必要があります。

fishに適切に再描画させるために
必要だからです。

COMMAND が複数与えられたとき、
キーが押されたら全コマンドが
指定された順番で実行されます。

SEQUENCE が与えられなかった場合、
すべてのキーバインド
(または、指定された MODE 内のキーバインド)
が出力されます。

SEQUENCE が与えられて、
COMMAND が与えられなかった場合、
SEQUENCE にマッチしたキーバインドのみが
出力されます。

デフォルトでは、
キーバインドはセッション間で
保存されません。

~/.config/fish/config.fish 内に
直接書かれた bind コマンドは
有効になりません。

なぜなら、
デフォルトのキーバインドが設定される前に
config.fish が読み込まれるからです。

自分用のキーバインドを保存するためには、
bind コマンドを
fish_user_key_bindings オートロード関数 内に
書いてください。

キーバインドは
Viの入力を模倣した「モード」を
使うこともあります。

デフォルトのモードは default で、
すべてのキーバインドが
1つのモードに適用されます。

モードは $fish_bind_mode 変数で
参照・変更できます。

パラメータ

-k / --key
文字列の代わりにキー名を
指定する( leftbackspace など)。
-K / --key-names
有効なキー名のリストを表示する。
-a または --all も指定すると、
割り当てられていないキーも表示する。
-f / --function-names
使える入力関数のリストを表示する。
-M MODE / --mode MODE
bind コマンドで指定するモードを指定する。
デフォルトは default
-m NEW_MODE / --sets-mode NEW_MODE
このバインドが実行された後に、
現在のモードを NEW_MODE に変更する。
-e / --erase
新しいキーバインドを定義する代わりに、
与えられたキーシーケンスとモードの
キーバインドを削除する。

  • 複数のキーシーケンスを指定することもできる。
  • -M / --mode とともに
    -a / --all を指定すると、
    いかなるキーシーケンスであっても
    与えられたモードの全キーバインドを削除する。
  • -M / --mode を付けずに
    -a / --all を指定すると、
    全モードの全キーバインドを削除する。
-a / --all
--erase--key-names とともに使います。

特別な入力関数

accept-autosuggestion
現在のオートサジェスチョンを受け入れる
backward-char
1文字左へ移動
backward-bigword
1ビッグワード(ホワイトスペースで区切られた単語)左へ移動
backward-delete-char
カーソルの左1文字を削除
backward-kill-bigword
1ビッグワードを削除し、 キルリング へ移動
backward-kill-line
行頭からカーソルまでを削除しキルリングへ移動
backward-kill-path-component
1パス構成要素(最後の / または空白からカーソル位置)を
削除しキルリングへ移動
backward-kill-word
1単語を削除しキルリングへ移動
backward-word
1単語左へ移動
beginning-of-history
履歴の最初へ移動
beginning-of-line
行頭へ移動
begin-selection
テキスト選択を開始
capitalize-word
現在の単語をキャピタライズ
(先頭文字を大文字化)
complete
現在のトークンの残りを予測
complete-and-search
補完のページャを起動
delete-char
カーソル位置(右)の文字を削除
downcase-word
現在の単語を小文字化
end-of-history
履歴の最後へ移動
end-of-line
行末へ移動
end-selection
テキスト選択を終了
forward-bigword
1ビッグワード右へ移動
forward-char
1文字右へ移動
forward-word
1単語右へ移動
history-search-backward
過去方向へ履歴検索
history-search-forward
未来方向へ履歴検索
kill-bigword
次のビッグワードを削除しキルリングへ移動
kill-line
カーソルから行末までを削除しキルリングへ移動
kill-selection
選択されたテキストを削除しキルリングへ移動
kill-whole-line
行全体を削除しキルリングへ移動
kill-word
次の単語を削除しキルリングへ移動
suppress-autosuggestion
現在のオートサジェスチョンを削除
swap-selection-start-stop
選択を変更することなしに
ハイライトされたテキストの他端へ移動
transpose-chars
カーソルの左右にある文字を入れ替える
transpose-words
カーソルの左右にある単語を入れ替える
upcase-word
現在の単語を大文字化
yank
最新のキルリングの内容を
コマンドラインに挿入(ヤンク)
yank-pop
キルリングを過去のものに置き換える

実行例

# Ctrl+Dが押されたときにfishを終了する
bind \cd 'exit'

 

# PageUpが押されたときに履歴検索をする
bind -k ppage history-search-backward

 

# コマンドラインエディタをViモードにして
set -g fish_key_bindings fish_vi_key_bindings
# Ctrl+Cを現在行削除(キルリングに移動)させる
bind -M insert \cc kill-whole-line force-repaint

Viモード

特殊な場合: ESC文字

ESCキーは単独でも使えます。

たとえば、Viモードで
挿入モード からノーマルモード
移行するときです。

ESC文字は同時に
「メタキー」としても使われます。

「メタ」とは
ファンクションキーや矢印キーといった
エスケープシーケンスの始まりを
示すための文字です。

キーバインドは
ESC文字から始まるようにも
カスタマイズされることもあります。

fishはESC文字を受信してから
一定時間待ちます。

なぜなら、
ESC文字が単独のものなのか
エスケープシーケンスの一部なのか
を判定するためです。

待っている間にキーが押されれば、
ESCキーはメタキーとして振舞います

キーが押されなければ、
単独のESC文字として扱われます。

待ち時間は以下のようになっています。

fish_escape_delay_msユニバーサル変数 にすることが望ましいです。

なぜなら、コマンドラインで
一度設定すれば済むからです。

$ set -U fish_escape_delay_ms 200
注意

fish 2.2.0以前は
デフォルトで10ミリ秒になっていて、
変更不可能になっていました。

そのため、ESCキーをメタキーとして
使用することは事実上不可能でした。

bind --key-namesの実行例

筆者の環境(Debian GNU/Linux)では
このようになっています。

$ bind --key-names
backspace
dc
down
end
f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
f11
f12
home
ic
left
npage
ppage
right
up

bind --key-names --allの実行例

筆者の環境(Debian GNU/Linux)では
このようになっています。

$ bind --key-names --all
a1
a3
b2
backspace
beg
btab
c1
c3
cancel
catab
clear
close
command
copy
create
ctab
dc
dl
down
eic
end
enter
eol
eos
exit
f0
f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
f11
f12
f13
f14
f15
f16
f17
f18
f19
f20
find
help
home
ic
il
left
ll
mark
message
move
next
npage
open
options
ppage
previous
print
redo
reference
refresh
replace
restart
resume
right
save
sbeg
scancel
scommand
scopy
screate
sdc
sdl
select
send
seol
sexit
sf
sfind
shelp
shome
sic
sleft
smessage
smove
snext
soptions
sprevious
sprint
sr
sredo
sreplace
sright
srsume
ssave
ssuspend
stab
sundo
suspend
undo
up

bind --function-namesの実行例

$ bind --function-names
beginning-of-line
end-of-line
forward-char
backward-char
forward-word
backward-word
forward-bigword
backward-bigword
history-search-backward
history-search-forward
delete-char
backward-delete-char
kill-line
yank
yank-pop
complete
complete-and-search
beginning-of-history
end-of-history
backward-kill-line
kill-whole-line
kill-word
kill-bigword
backward-kill-word
backward-kill-path-component
backward-kill-bigword
history-token-search-backward
history-token-search-forward
self-insert
transpose-chars
transpose-words
upcase-word
downcase-word
capitalize-word
vi-arg-digit
vi-delete-to
execute
beginning-of-buffer
end-of-buffer
repaint
force-repaint
up-line
down-line
suppress-autosuggestion
accept-autosuggestion
begin-selection
swap-selection-start-stop
end-selection
kill-selection
forward-jump
backward-jump
and
cancel

最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。