行編集
行編集機能は、対話モードのシェルにコマンドを入力する際に使える、コマンドの簡易編集機能です。行編集機能は、コマンドを編集するための簡単なエディタとして働きます。行編集機能はコマンド履歴とも連携しており、fc コマンドを使ってエディタを起動する代わりに行編集で直接コマンドを編集・再実行できます。
行編集には複数の編集モードがあり、モードごとにキー操作の割り当てが異なります。行編集の有効・無効を切り替えたりモードを選択したりするには、set コマンドで編集モードに対応するオプションを設定します。あるモードに対応するオプションを有効にすると、そのモードの行編集が有効になります (同時に他のモードのオプションは自動的に無効になります)。現在有効になっているモードのオプションを無効にすると、行編集は無効になります。現在 yash が搭載している編集モードは vi 風と emacs 風の二種類で、それぞれ対応するオプションは -o vi
と -o emacs
です。
シェルが対話モードで起動したとき、標準入力と標準エラーがともに端末ならば、vi 風行編集が自動的に有効になります。
行編集は、標準入力と標準エラーがともに端末のときだけ使えます。この条件が満たされていないときは、行編集は働きません。行編集が働くとき、シェルは termios インタフェースを使用して端末の入出力モードを一時的に変更し、terminfo インタフェースを使用して入力されたキーの判別などを行います。
行編集のオプション
編集モードを指定するオプションの他に、行編集に関わるものとして以下のオプションが set コマンドで設定できます。
- Lealwaysrp
- このオプションが無効な時は、長いコマンドを入力してコマンドが右プロンプトに達すると、右プロンプトは見えなくなります。このオプションが有効な時は、右プロンプトは見えなくなる代わりに下に移動します。
- Lecompdebug
- 補完を行う際にデバッグ用の情報を出力します
- Leconvmeta
- Terminfo データベースで得られた情報を無視し、入力の 8 ビット目を常に meta-key フラグとみなします。
- Lenoconvmeta
- Terminfo データベースで得られた情報を無視し、入力の 8 ビット目を他のビットと同様に扱います。
- Leconvmeta オプションと lenoconvmeta オプションは片方しか有効にできません (片方を有効にするともう片方は自動的に無効になります)。どちらも無効な時は terminfo データベースの情報に従って 8 ビット目を meta-key とみなすかどうか判断します。
- Lepromptsp
- このオプションが有効な時、シェルはプロンプトを出力する前に、プロンプトが必ず行頭に来るようにカーソルを移動するための特殊な文字列を出力します。
- このオプションは最初から有効になっています。
- Levisiblebell
- シェルが警告を発する際、警告音を鳴らす代わりに端末を点滅させます。
編集モード
Vi 風編集モードは vi に似たキー操作で編集を行う編集モードです。Vi 風編集モードでは、挿入モードとコマンドモードの二つのモードを適宜切り替えて編集を行います。編集が始まるときはモードは必ず挿入モードになっています。挿入モードでは入力した文字が基本的にそのままバッファに挿入されます。コマンドモードでは入力した文字はカーソルを移動したり文字を消去したりするコマンドとして解釈されます。
Emacs 風編集モードは emacs に似たキー操作で編集を行う編集モードです。入力した文字は基本的にそのままバッファに挿入されますが、コマンドとして解釈される一部のキー操作が vi 風編集モードの挿入モードと異なります。
これらのモードの他に、コマンドの検索の際に用いる検索モードが vi 風と emacs 風とそれぞれにあります。
行編集コマンド
行編集中に入力された文字は全て以下の行編集コマンドのいずれかとして解釈されます。コマンドとキーの対応は bindkey コマンドで変更できます (検索モードを除く)。
以下の一覧には各コマンドに対応するキー入力の初期設定も示してあります。なお、vi-insert は vi 風編集モードの挿入モードを、vi-command は vi 風編集モードのコマンドモードを、vi-search は vi 風編集モードの検索モードを、emacs は emacs 風編集モードを、emacs-search は emacs 風編集モードの検索モードを示します。
コマンドの中には引数を指定することでその動作を変更できるものがあります。例えば forward-char コマンドは通常はカーソルを一文字分前に移動しますが、引数を指定するとその引数の文字数分だけカーソルを移動します。引数は、目的のコマンドの直前に digit-argument コマンドを使うことで指定できます。
基本的な編集コマンド
- noop
- 何も行いません。
- vi-command:
\^[
- alert
- 警告音を発しまたは端末を点滅させます。
- self-insert
- 入力した文字を現在のカーソルの位置に挿入します。(エスケープシーケンスによるエスケープの対象となる文字は挿入できません)
- vi-insert, emacs:
\\
- insert-tab
- タブを現在のカーソルの位置に挿入します。
- emacs:
\^[
\^I
- expect-verbatim
- このコマンドの直後に入力する一文字を現在のカーソル位置に挿入します。このコマンドを使うと self-insert コマンドで入力できない文字も入力できます (ナル文字 '\0' を除く)。
- vi-insert, vi-search, emacs-search:
\^V
- emacs:
\^Q
, \^V
- digit-argument
- このコマンドは数字またはハイフンの入力に対してのみ有効です。入力した数字を次のコマンドへの引数として受け付けます (ハイフンの場合は符号を反転します)。
- Digit-argument コマンドを連続して使うことで複数桁の引数を指定できます。例えば vi 風編集モードのコマンドモードで 12h と入力すると、h に対応するコマンドに引数 12 を与えたことになります (すなわちカーソルが左に 12 文字分移動します)。
- vi-command: 1, 2, 3, 4, 5, 6, 7, 8, 9
- emacs:
\^[
0, \^[
1, \^[
2, \^[
3, \^[
4, \^[
5, \^[
6, \^[
7, \^[
8, \^[
9, \^[
-
- bol-or-digit
- 引数がない場合は beginning-of-line コマンドと同じように、引数がある場合は digit-argument コマンドと同じように動作します。
- vi-command: 0
- accept-line
- 行編集を終了し、現在のバッファの内容をシェルへの入力として与えます。行の末尾には自動的に改行が付け加わります。
- vi-insert, vi-command, emacs, emacs-search:
\^J
, \^M
- abort-line
- 行編集を中止し、空の入力をシェルに与えます。
- vi-insert, vi-command, vi-search, emacs, emacs-search:
\!
, \^C
- eof
- シェルに入力の終わりを知らせます (これによりシェルは終了します)。
- eof-if-empty
- バッファが空ならば、行編集を終了し、シェルに入力の終わりを知らせます (これによりシェルは終了します)。バッファが空でなければ、alert コマンドと同じ動作をします。
- vi-insert, vi-command:
\#
, \^D
- eof-or-delete
- バッファが空ならば、行編集を終了し、シェルに入力の終わりを知らせます (これによりシェルは終了します)。バッファが空でなければ、delete-char コマンドと同じ動作をします。
- emacs:
\#
, \^D
- accept-with-hash
- 引数が与えられていないかバッファの最初の文字が
#
でなければ、バッファの最初に #
を挿入します。そうでなければバッファの最初の #
を削除します。いずれの場合も、その後 accept-line コマンドと同じ動作をします。
- vi-command: #
- emacs:
\^[
#
- setmode-viinsert
- 編集モードを vi 風編集モードの挿入モードに変更します。
- vi-command: i,
\I
- setmode-vicommand
- 編集モードを vi 風編集モードのコマンドモードに変更します。
- vi-insert:
\^[
- setmode-emacs
- 編集モードを emacs 風編集モードに変更します。
- expect-char
- abort-expect-char
- これは find-char コマンドなどを実装するために yash 内部で使われているコマンドで、直接使用しても意味はありません。
- redraw-all
- 行編集のプロンプトやバッファを端末に表示しなおします。
- vi-insert, vi-command, vi-search, emacs, emacs-search:
\^L
- clear-and-redraw-all
- 端末の表示をクリアし、行編集のプロンプトやバッファを端末に表示しなおします。
移動コマンド
移動コマンドはカーソルを移動させるコマンドです。ほとんどの移動コマンドは引数を与えることでそのコマンドを引数の回数だけ実行するのと同じように動作させられます。例えば forward-char コマンドに引数 4 を与えると、カーソルを 4 文字先に進めます。
以下、bigword とは一文字以上の連続した空白でない文字をいい、semiword とは一文字以上の連続した空白でも句読点でもない文字をいい、emacsword とは一文字以上の連続した英数字をいいます。また viword とは以下のいずれかをいいます
- 一文字以上の連続したアルファベットまたは下線 (
_
)
- 一文字以上の連続した、アルファベットでも下線でも空白でもない文字
以下に移動コマンドの一覧を示します。
- forward-char
- カーソルを次の文字に移動します。
- vi-insert:
\R
- vi-command: l, (空白文字),
\R
- emacs:
\R
, \^F
- backward-char
- カーソルを前の文字に移動します。
- vi-insert:
\L
- vi-command: h,
\L
, \B
, \?
, \^H
- emacs:
\L
, \^B
- forward-bigword
- カーソルを次の bigword に移動します。
- vi-command: W
- end-of-bigword
- カーソルを bigword の終わりまで移動します。
- vi-command: E
- backward-bigword
- カーソルを前の bigword に移動します。
- vi-command: B
- forward-semiword
- カーソルを次の semiword に移動します。
- end-of-semiword
- カーソルを semiword の終わりまで移動します。
- backward-semiword
- カーソルを前の semiword に移動します。
- forward-viword
- カーソルを次の viword に移動します。
- vi-command: w
- end-of-viword
- カーソルを viword の終わりまで移動します。
- vi-command: e
- backward-viword
- カーソルを前の viword に移動します。
- vi-command: b
- forward-emacsword
- カーソルを次の emacsword に移動します。
- emacs:
\^[
f, \^[
F
- backward-emacsword
- カーソルを前の emacsword に移動します。
- emacs:
\^[
b, \^[
B
- beginning-of-line
- カーソルをバッファの先頭に移動します。
- vi-insert, vi-command:
\H
- emacs:
\H
, \^A
- end-of-line
- カーソルをバッファの末尾に移動します。
- vi-insert:
\E
- vi-command: $,
\E
- emacs:
\E
, \^E
- go-to-column
- カーソルをバッファ内の n 文字目に移動します。ただし n は引数です (引数が与えられていない場合は 1)。
- vi-command: |
- first-nonblank
- カーソルをバッファ内の最初の空白でない文字に移動します。
- vi-command: ^
- find-char
- このコマンドの直後に入力した文字がある位置までカーソルを進めます。
- vi-command: f
- emacs:
\^]
- find-char-rev
- このコマンドの直後に入力した文字がある位置までカーソルを戻します。
- vi-command: F
- emacs:
\^[
\^]
- till-char
- このコマンドの直後に入力した文字がある位置の直前までカーソルを進めます。
- vi-command: t
- till-char-rev
- このコマンドの直後に入力した文字がある位置の直後までカーソルを戻します。
- vi-command: T
- refind-char
- 前回実行した find-char, find-char-rev, till-char, till-char-rev コマンドを再実行します。
- vi-command: ;
- refind-char-rev
- 前回実行した find-char, find-char-rev, till-char, till-char-rev コマンドを、カーソルの進む向きを逆にして再実行します。
- vi-command: ,
編集コマンド
編集コマンドはバッファの内容を変更するコマンドです。ほとんどの編集コマンドは引数を与えることでそのコマンドを引数の回数だけ実行するのと同じように動作させられます。
名前に kill が付くコマンドで削除した文字列はキルリングという場所に保管され、後で put などのコマンドでバッファに戻すことができます。
以下に編集コマンドの一覧を示します。
- delete-char
- カーソルのところにある文字を削除します。引数を与えた場合は kill-char コマンドと同じ動作をします。
- vi-insert, emacs:
\X
- delete-bigword
- カーソルのところにある bigword を削除します。引数を与えた場合は kill-bigword コマンドと同じ動作をします。
- delete-semiword
- カーソルのところにある semiword を削除します。引数を与えた場合は kill-semiword コマンドと同じ動作をします。
- delete-viword
- カーソルのところにある viword を削除します。引数を与えた場合は kill-viword コマンドと同じ動作をします。
- delete-emacsword
- カーソルのところにある emacsword を削除します。引数を与えた場合は kill-emacsword コマンドと同じ動作をします。
- backward-delete-char
- カーソルの前にある文字を削除します。引数を与えた場合は backward-kill-char コマンドと同じ動作をします。
- vi-insert, emacs:
\B
, \?
, \^H
- backward-delete-bigword
- カーソルの前にある bigword を削除します。引数を与えた場合は backward-kill-bigword コマンドと同じ動作をします。
- backward-delete-semiword
- カーソルの前にある semiword を削除します。引数を与えた場合は backward-kill-semiword コマンドと同じ動作をします。
- vi-insert:
\^W
- backward-delete-viword
- カーソルの前にある viword を削除します。引数を与えた場合は backward-kill-viword コマンドと同じ動作をします。
- backward-delete-emacsword
- カーソルの前にある emacsword を削除します。引数を与えた場合は backward-kill-emacsword コマンドと同じ動作をします。
- delete-line
- バッファの内容を全て削除します。
- forward-delete-line
- カーソル以降の全ての文字を削除します。
- backward-delete-line
- カーソルより前の全ての文字を削除します。
- vi-insert:
\$
, \^U
- kill-char
- カーソルのところにある文字を削除し、キルリングに保管します。
- vi-command: x,
\X
- kill-bigword
- カーソルのところにある bigword を削除し、キルリングに保管します。
- kill-semiword
- カーソルのところにある semiword を削除し、キルリングに保管します。
- kill-viword
- カーソルのところにある viword を削除し、キルリングに保管します。
- kill-emacsword
- カーソルのところにある emacsword を削除し、キルリングに保管します。
- emacs:
\^[
d, \^[
D
- backward-kill-char
- カーソルの前にある文字を削除し、キルリングに保管します。
- vi-command: X
- backward-kill-bigword
- カーソルの前にある bigword を削除し、キルリングに保管します。
- emacs:
\^W
- backward-kill-semiword
- カーソルの前にある semiword を削除し、キルリングに保管します。
- backward-kill-viword
- カーソルの前にある viword を削除し、キルリングに保管します。
- backward-kill-emacsword
- カーソルの前にある emacsword を削除し、キルリングに保管します。
- emacs:
\^[
\B
, \^[
\?
, \^[
\^H
- kill-line
- バッファの内容を全て削除し、キルリングに保管します。
- forward-kill-line
- カーソル以降の全ての文字を削除し、キルリングに保管します。
- emacs:
\^K
- backward-kill-line
- カーソルより前の全ての文字を削除し、キルリングに保管します。
- emacs:
\$
, \^U
, \^X
\B
, \^X
\?
- put-before
- 最後にキルリングに保管した文字列をカーソルの直前に挿入します。カーソルは挿入した文字列の最後の文字のところに移動します。
- vi-command: P
- put
- 最後にキルリングに保管した文字列をカーソルの直後に挿入します。カーソルは挿入した文字列の最後の文字のところに移動します。
- vi-command: p
- put-left
- 最後にキルリングに保管した文字列をカーソルの直前に挿入します。カーソルは挿入した文字列の直後に移動します。
- emacs:
\^Y
- put-pop
- このコマンドは put-before, put, put-left, put-pop コマンドの直後にだけ使えます。このコマンドは直前のコマンドでキルリングから挿入した文字列を削除し、代わりにその文字列の前にキルリングに保管した文字列を挿入します。
- emacs:
\^[
y, \^[
Y
- undo
- 直前の編集コマンドを取り消し、バッファの内容を前の状態に戻します。
- vi-command: u
- emacs:
\^_
, \^X
\$
, \^X
\^U
- undo-all
- 全ての編集コマンドを取り消し、バッファの内容を初期状態に戻します。
- vi-command: U
- emacs:
\^[
\^R
, \^[
r, \^[
R
- cancel-undo
- undo, undo-all による編集コマンドの取り消しを取り消し、バッファの内容を復元します。
- vi-command:
\^R
- cancel-undo-all
- undo, undo-all による編集コマンドの取り消しを全て取り消し、バッファの内容を復元します。
- redo
- 直前の編集コマンドを繰り返します。
- vi-command: .
補完コマンド
- complete
- 現在のカーソル位置で補完を行います。補完候補が複数ある場合はその一覧を表示します。
- complete-next-candidate
- 現在のカーソル位置で補完を行います。補完候補が複数ある場合は、一覧の中から次の候補を選択します。
- vi-insert, emacs:
\^I
- complete-prev-candidate
- 現在のカーソル位置で補完を行います。補完候補が複数ある場合は、一覧の中から前の候補を選択します。
- vi-insert, emacs:
\bt
- complete-next-column
- 現在のカーソル位置で補完を行います。補完候補が複数ある場合は、一覧の中から次の列の最初の候補を選択します。
- complete-prev-column
- 現在のカーソル位置で補完を行います。補完候補が複数ある場合は、一覧の中から前の列の最初の候補を選択します。
- complete-next-page
- 現在のカーソル位置で補完を行います。補完候補が複数ある場合は、一覧の中から次のページの最初の候補を選択します。
- complete-prev-page
- 現在のカーソル位置で補完を行います。補完候補が複数ある場合は、一覧の中から前のページの最初の候補を選択します。
- complete-list
- 現在のカーソル位置で補完を行います。引数を指定しない場合、補完候補の一覧を表示します。引数を指定すると、その番号の候補で補完内容を確定します。
- emacs:
\^[
?, \^[
=
- complete-all
- 現在のカーソル位置で補完を行い、カーソル位置にある単語をすべての補完候補で置き換えます。
- emacs:
\^[
*
- complete-max
- 現在のカーソル位置で補完を行い、各補完候補の最長共通先頭部分をカーソル位置に挿入します。
- clear-candidates
- 補完候補の一覧を消去します。
Vi 固有のコマンド
- vi-replace-char
- カーソルのところにある文字を、このコマンドの直後に入力した文字に置き換えます。
- vi-command: r
- vi-insert-beginning
- カーソルをバッファの先頭に移動したのち、setmode-viinsert コマンドと同じ動作をします。
- vi-command: I
- vi-append
- カーソルを次の文字に移動したのち、setmode-viinsert コマンドと同じ動作をします。
- vi-command: a
- vi-append-to-eol
- カーソルをバッファの末尾に移動したのち、setmode-viinsert コマンドと同じ動作をします。
- vi-command: A
- vi-replace
- Setmode-viinsert コマンドと同じ動作をしますが、同時に上書きモードを有効にします。上書きモードでは、self-insert コマンドは文字を挿入する代わりにカーソルのところにある文字を置き換えます。上書きモードは編集モードを変更するまで有効です。
- vi-command: R
- vi-switch-case
- このコマンドの直後には移動コマンドを入力する必要があります。移動コマンドが動かしたカーソルの範囲にある文字の大文字と小文字を入れ替えます。
- vi-switch-case-char
- カーソルのところにある文字の大文字と小文字を入れ替えて、カーソルを次の文字に移動します。
- vi-command: ~
- vi-yank
- このコマンドの直後には移動コマンドを入力する必要があります。移動コマンドが動かしたカーソルの範囲にある文字をキルリングに保管します。
- vi-command: y
- vi-yank-to-eol
- カーソルの位置からバッファの末尾までにある文字をキルリングに保管します。
- vi-command: Y
- vi-delete
- このコマンドの直後には移動コマンドを入力する必要があります。移動コマンドが動かしたカーソルの範囲にある文字を削除し、キルリングに保管します。
- vi-command: d
- vi-delete-to-eol
- カーソルの位置からバッファの末尾までにある文字を削除し、キルリングに保管します。
- vi-command: D
- vi-change
- このコマンドの直後には移動コマンドを入力する必要があります。移動コマンドが動かしたカーソルの範囲にある文字を削除し、その後編集モードを vi 風編集モードの挿入モードに変更します。
- vi-command: c
- vi-change-to-eol
- カーソルの位置からバッファの末尾までにある文字を削除し、その後編集モードを vi 風編集モードの挿入モードに変更します。
- vi-command: C
- vi-change-line
- バッファの内容を全て削除し、その後編集モードを vi 風編集モードの挿入モードに変更します。
- vi-command: S
- vi-yank-and-change
- このコマンドの直後には移動コマンドを入力する必要があります。移動コマンドが動かしたカーソルの範囲にある文字を削除しキルリングに保管した後、編集モードを vi 風編集モードの挿入モードに変更します。
- vi-yank-and-change-to-eol
- カーソルの位置からバッファの末尾までにある文字を削除しキルリングに保管した後、編集モードを vi 風編集モードの挿入モードに変更します。
- vi-yank-and-change-line
- バッファの内容を全て削除しキルリングに保管した後、編集モードを vi 風編集モードの挿入モードに変更します。
- vi-substitute
- カーソルのところにある文字を削除しキルリングに保管した後、編集モードを vi 風編集モードの挿入モードに変更します。
- vi-command: s
- vi-append-last-bigword
- コマンド履歴の中で最も新しいコマンドにおける最後の bigword を、空白文字に続けてカーソルの位置の直後に挿入します。引数 n を与えたときは最後の bigword の代わりに n 番目の bigword を挿入します。その後、setmode-viinsert コマンドと同じ動作をします。
- vi-command: _
- vi-exec-alias
- このコマンドの直後に入力した文字を c とすると、
_c
という名前のエイリアスの内容をシェルへの入力とみなして行編集コマンドとして解釈・実行します。
- vi-command: @
- vi-edit-and-accept
- エディタとして vi を起動し、バッファの内容を編集させます。エディタが終了すると編集後の内容をバッファに反映した後 accept-line コマンドと同じ動作をします。ただしエディタの終了ステータスが 0 でないときは何も行いません。
- vi-command: v
- vi-complete-list
- Complete-list コマンドと同様ですが、候補を確定したとき編集モードを vi 風編集モードの挿入モードに変更します。
- vi-command: =
- vi-complete-all
- Complete-all コマンドと同様ですが、単語を置き換えた後、編集モードを vi 風編集モードの挿入モードに変更します。
- vi-command: *
- vi-complete-max
- Complete-max コマンドと同様ですが、候補を挿入した後、編集モードを vi 風編集モードの挿入モードに変更します。
- vi-command:
\\
- vi-search-forward
- 順方向の履歴検索を開始します。編集モードを vi 風編集モードの検索モードに変更します。
- vi-command: ?
- vi-search-backward
- 逆方向の履歴検索を開始します。編集モードを vi 風編集モードの検索モードに変更します。
- vi-command: /
Emacs 固有のコマンド
- emacs-transpose-chars
- カーソルの前にある文字を右に移動します。
- emacs:
\^T
- emacs-transpose-words
- カーソルの前にある emacsword を右に移動します。
- emacs:
\^[
t, \^[
T
- emacs-downcase-word
- カーソルの後にある emacsword を小文字に変換します。
- emacs:
\^[
l, \^[
L
- emacs-upcase-word
- カーソルの後にある emacsword を大文字に変換します。
- emacs:
\^[
u, \^[
U
- emacs-capitalize-word
- カーソルの後にある emacsword をキャピタライズ (各単語の頭文字だけ大文字にする) します。
- emacs:
\^[
c, \^[
C
- emacs-delete-horizontal-space
- カーソルの前後にある空白を削除します。引数を与えるとカーソルの前にある空白を削除します。
- emacs:
\^[
\\
- emacs-just-one-space
- カーソルの前後にある空白の個数を一つに調整します。引数を与えるとその引数の数だけ空白を残します。
- emacs:
\^[
(Escape の後に空白文字)
- emacs-search-forward
- 順方向の履歴検索を開始します。編集モードを emacs 風編集モードの検索モードに変更します。
- emacs:
\^S
- emacs-search-backward
- 順方向の履歴検索を開始します。編集モードを emacs 風編集モードの検索モードに変更します。
- emacs:
\^R
コマンド履歴関連のコマンド
- oldest-history
- コマンド履歴の中で最も古いコマンドに移動します。引数を与えるとそれを履歴番号とみなしてその番号のコマンドに移動します。カーソルの位置は変わりません。
- newest-history
- コマンド履歴の中で最も新しいコマンドに移動します。引数を与えるとそれを履歴番号とみなしてその番号のコマンドに移動します。カーソルの位置は変わりません。
- return-history
- コマンド履歴のどのコマンドにも対応しない新規バッファに移動します。引数を与えるとそれを履歴番号とみなしてその番号のコマンドに移動します。カーソルの位置は変わりません。
- oldest-history-bol
- コマンド履歴の中で最も古いコマンドに移動します。引数を与えるとそれを履歴番号とみなしてその番号のコマンドに移動します。カーソルはバッファの先頭に移動します。
- vi-command: G
- newest-history-bol
- コマンド履歴の中で最も新しいコマンドに移動します。引数を与えるとそれを履歴番号とみなしてその番号のコマンドに移動します。カーソルはバッファの先頭に移動します。
- return-history-bol
- コマンド履歴のどのコマンドにも対応しない新規バッファに移動します。引数を与えるとそれを履歴番号とみなしてその番号のコマンドに移動します。カーソルはバッファの先頭に移動します。
- vi-command: g
- oldest-history-eol
- コマンド履歴の中で最も古いコマンドに移動します。引数を与えるとそれを履歴番号とみなしてその番号のコマンドに移動します。カーソルはバッファの末尾に移動します。
- emacs:
\^[
<
- newest-history-eol
- コマンド履歴の中で最も新しいコマンドに移動します。引数を与えるとそれを履歴番号とみなしてその番号のコマンドに移動します。カーソルはバッファの末尾に移動します。
- return-history-eol
- コマンド履歴のどのコマンドにも対応しない新規バッファに移動します。引数を与えるとそれを履歴番号とみなしてその番号のコマンドに移動します。カーソルはバッファの末尾に移動します。
- emacs:
\^[
>
- next-history
- コマンド履歴の中で次のコマンドに移動します。カーソルの位置は変わりません。
- prev-history
- コマンド履歴の中で前のコマンドに移動します。カーソルの位置は変わりません。
- next-history-bol
- コマンド履歴の中で次のコマンドに移動します。カーソルはバッファの先頭に移動します
- vi-command: j, +,
\D
, \^N
- prev-history-bol
- コマンド履歴の中で前のコマンドに移動します。カーソルはバッファの先頭に移動します
- vi-command: k, -,
\U
, \^P
- next-history-eol
- コマンド履歴の中で次のコマンドに移動します。カーソルはバッファの末尾に移動します
- vi-insert, emacs:
\D
, \^N
- prev-history-eol
- コマンド履歴の中で前のコマンドに移動します。カーソルはバッファの末尾に移動します
- vi-insert, emacs:
\U
, \^P
- search-again
- 最後に行ったコマンド履歴検索をもう一度行います。
- vi-command: n
- search-again-rev
- 最後に行ったコマンド履歴検索を方向を逆にしてもう一度行います。
- vi-command: N
- search-again-forward
- 最後に行ったコマンド履歴検索を順方向にもう一度行います。
- search-again-backward
- 最後に行ったコマンド履歴検索を逆方向にもう一度行います。
- beginning-search-forward
- コマンド履歴を順方向に検索し、バッファの先頭から現在のカーソル位置までの間にある文字列が同じ次のコマンドに移動します。カーソル位置は変わりません。
- beginning-search-backward
- コマンド履歴を逆方向に検索し、バッファの先頭から現在のカーソル位置までの間にある文字列が同じ前のコマンドに移動します。カーソル位置は変わりません。
コマンド履歴検索モードのコマンド
- srch-self-insert
- 入力した文字を検索用バッファに挿入します。(エスケープシーケンスによるエスケープの対象となる文字は挿入できません)
- vi-search, emacs-search:
\\
- srch-backward-delete-char
- 検索用バッファの最後の一文字を削除します。
- 検索用バッファが空の場合、vi 風編集モードでは srch-abort-search コマンドと同じ動作をします。
- 検索用バッファが空の場合、emacs 風編集モードでは alert コマンドと同じ動作をします。
- vi-search, emacs-search:
\B
, \?
, \^H
- srch-backward-delete-line
- 検索用バッファの内容を全て削除します。
- vi-search, emacs-search:
\$
, \^U
- srch-continue-forward
- 現在表示している暫定検索結果の次の結果を順方向に探します。
- emacs-search:
\^S
- srch-continue-backward
- 現在表示している暫定検索結果の次の結果を逆方向に探します。
- emacs-search:
\^R
- srch-accept-search
- 検索を終了し、現在表示している暫定検索結果を確定します。検索結果に移動します。
- vi-search:
\^J
, \^M
- emacs-search:
\^J
, \^[
- srch-abort-search
- 検索を中止し、検索を開始する前の状態に戻ります。
- vi-search:
\^[
- emacs-search:
\^G
エスケープシーケンス
Bindkey コマンドで行編集のキー設定を表示・設定する際、ファンクションキーなどの特殊なキーはエスケープシーケンスで表わします。エスケープシーケンスは全てバックスラッシュ (\
) で始まります。またバックスラッシュそのものもエスケープの対象です。エスケープシーケンスとキーの対照は以下の通りです。
\\
- バックスラッシュ (
\
)
\B
- Backspace
\D
- ↓矢印キー
\E
- End
\H
- Home
\I
- Insert (Insert-char, Enter-insert-mode)
\L
- ←矢印キー
\N
- Page-down (Next-page)
\P
- Page-up (Previous-page)
\R
- →矢印キー
\U
- ↑矢印キー
\X
- Delete
\!
- INTR
\#
- EOF
\$
- KILL
\?
- ERASE
\^@
- Ctrl + @
\^A
, \^B
, …, \^Z
- Ctrl + A, Ctrl + B, …, Ctrl + Z
- ※ Ctrl + I は Tab、Ctrl + J は Newline、Ctrl + M は Carriage-return です。
\^[
- Ctrl + [ (Escape)
\^\
- Ctrl + \
\^]
- Ctrl + ]
\^^
- Ctrl + ^
\^_
- Ctrl + _
\^?
- Ctrl + ? (Delete)
\F00
, F01
, …, \F63
- F0, F1, …, F63
\a1
- キーパッドの左上キー
\a3
- キーパッドの右上キー
\b2
- キーパッドの中央キー
\bg
- Beginning
\bt
- Back-tab
\c1
- キーパッドの左下キー
\c3
- キーパッドの右下キー
\ca
- Clear-all-tabs
\cl
- Close
\cn
- Cancel
\co
- Command
\cp
- Copy
\cr
- Create
\cs
- Clear-screen または erase
\ct
- Clear-tab
\dl
- Delete-line
\ei
- Exit-insert-mode
\el
- Clear-to-end-of-line
\es
- Clear-to-end-of-screen
\et
- Enter (Send)
\ex
- Exit
\fd
- Find
\hp
- Help
\il
- Insert-line
\ll
- Home-down
\me
- Message
\mk
- Mark
\ms
- マウスイベント
\mv
- Move
\nx
- Next-object
\on
- Open
\op
- Options
\pr
- Print (Copy)
\pv
- Previous-object
\rd
- Redo
\re
- Resume
\rf
- Ref (Reference)
\rh
- Refresh
\rp
- Replace
\rs
- Restart
\sf
- Scroll-forward (Scroll-down)
\sl
- Select
\sr
- Scroll-backward (Scroll-up)
\st
- Set-tab
\su
- Suspend
\sv
- Save
\ud
- Undo
\SE
- Shift + End
\SH
- Shift + Home
\SI
- Shift + Insert
\SL
- Shift + ←矢印キー
\SR
- Shift + →矢印キー
\SX
- Shift + Delete
\Sbg
- Shift + Beginning
\Scn
- Shift + Cancel
\Sco
- Shift + Command
\Scp
- Shift + Copy
\Scr
- Shift + Create
\Sdl
- Shift + Delete-line
\Sel
- Shift + End-of-line
\Sex
- Shift + Exit
\Sfd
- Shift + Find
\Shp
- Shift + Help
\Smg
- Shift + Message
\Smv
- Shift + Move
\Snx
- Shift + Next
\Sop
- Shift + Options
\Spr
- Shift + Print
\Spv
- Shift + Previous
\Srd
- Shift + Redo
\Sre
- Shift + Resume
\Srp
- Shift + Replace
\Ssu
- Shift + Suspend
\Ssv
- Shift + Save
\Sud
- Shift + Undo
INTR, EOF, KILL, ERASE の四つは stty コマンドなどで設定される端末の特殊文字です。一般的な環境では、INTR は Ctrl + C に、EOF は Ctrl + D に、KILL は Ctrl + U に、ERASE は Ctrl + H または Ctrl + ? に設定されています。これら四つは他のキー入力よりも優先して認識されます。
コマンドライン補完
行編集でコマンドを入力している途中で Tab キーを押すことで、コマンドの名前やオプション、引数を補完することができます。コマンド名やファイル名を途中まで打ち込んだところで Tab キーを押すと、その名前に一致するコマンド名やファイル名の一覧が現れます。さらに続けて Tab キーを押すと、入力したい名前を一覧の中から選ぶことができます。(一致する名前が一つしかない場合は、一覧は現れず、直接名前がコマンドラインに入力されます。)
補完の対象となる名前に *
や ?
などの文字が入っている場合は、そのパターンに一致する名前全てがコマンドラインに展開されます。(一覧による選択はできません)
標準状態では、コマンド名を入力しているときはコマンド名が、コマンドの引数を入力しているときはファイル名が補完されます。しかし補完を行う関数 (補完関数) を定義することで補完内容を変更することができます。また補完関数が定義されていない場合に自動的にスクリプトを読み込んで補完関数を定義することができます。(詳細下記)
補完動作の詳細
コマンド名を補完しようとしたときの具体的な動作は、以下のとおりです:
- (シェルを起動してから初めて補完を行おうとしたときのみ) コマンド
. -AL completion/INIT
を実行するのと同様にして、ファイル completion/INIT をロードパスから読み込みます。ファイルが見つからない場合は、そのまま次のステップに進みます。
- 関数
completion//default
が定義されている場合は、それを補完関数として実行し、補完を終了します。
- 入力中の単語をコマンド名として補完します。
コマンドの引数を補完しようとしたときの具体的な動作は、以下のとおりです:
- (シェルを起動してから初めて補完を行おうとしたときのみ) コマンド
. -AL completion/INIT
を実行するのと同様にして、ファイル completion/INIT をロードパスから読み込みます。ファイルが見つからない場合は、そのまま次のステップに進みます。
- 補完しようとしているコマンドに対応した補完関数が定義されていれば、それを実行して補完を終了します。補完関数の名前は、コマンド名の先頭に
completion/
を付けたものになっていなければなりません。例えば echo
コマンドの補完関数の名前は、completion/echo
になります。コマンド名がスラッシュを含んでいる場合は (例えば /bin/ls
)、まずコマンド名全体に completion/
を付けた名前 (completion//bin/ls
) の補完関数を試し、関数が見つからない場合はコマンド名からディレクトリ名を除いた名前 (completion/ls
) の補完関数を試します。
- 前のステップで補完関数が見つからなかった場合は、コマンド
. -AL 補完関数名 コマンド名
を実行するのと同様にして、補完関数を定義するためのファイルを読み込み実行します。コマンド名がスラッシュを含んでいる場合は、補完関数の実行時と同様に二つの名前を試します。ファイルの実行により補完関数が定義された場合は、補完関数を実行して補完を終了します。
- 関数
completion//default
が定義されている場合は、それを補完関数として実行し、補完を終了します。
- 入力中の単語をファイル名として補完します。
チルダ展開におけるユーザ名やパラメータ展開におけるパラメータ名を入力しているときは、ユーザ名やパラメータ名が常に補完されます。(補完のしかたを変更することはできません)
補完関数は普通の関数と同様に (位置パラメータなしで) 実行されます。ただし、補完関数の実行時には以下のローカル変数が自動的に設定されます。
IFS
- 空白文字・タブ・改行の三文字 (シェル起動時のデフォルト)
WORDS
- 既に入力されているコマンド名とコマンドの引数を含む配列です。コマンド名を補完しようとしているときは、この配列は空になります。
TARGETWORD
- 現在補完を行おうとしている、途中まで入力されたコマンド名またはコマンドの引数です。
補完関数の実行中に complete 組込みコマンドを実行することで、補完候補が生成されます。シェルは補完関数実行中に生成された補完候補を用いて補完を行います。
補完関数が見つからない場合は、ドット組込みコマンドを用いるのと同様にして補完関数名と同じ名前のファイルを読み込み実行します。このファイルには、補完関数を定義する関数定義コマンドが書いてあることが期待されます。ファイルの実行が終わった後、実際に補完関数が定義されていればその補完関数を使って補完を行います。
補完関数および補完関数定義用のファイルの実行中は、端末に対して入出力を行ってはなりません (端末の表示が乱れてしまいます)。スムーズな補完を行うために、補完の実行中に長い時間のかかる処理を行うのは避けてください。
補完の実行中は、POSIX 準拠モードが強制的に解除されます。また errexit オプションは無効となり、トラップは実行されません。