この章では、 GNUのコマンドライン編集インターフェイスの基本的な特徴について説明します。
以下のパラグラフでは、 キー・ストロークを表わすために使用される表記法について説明します。
C-kは、 Control-Kという意味です。 これは、 コントロール・キーが押されたままの状態でキーkが押されたときに生成される文字を表わします。
M-kは、 Meta-Kという意味です。 これは、 メタ・キー (があるものとして、それ) が押されたままの状態でキーkが押されたときに生成される文字を表わします。 メタ・キーがない場合、 最初にESCキーを押し、 次にキーkを押すことで、 同等のキー・ストロークを生成することができます。 どちらの手順も、 キーkをメタ化する、 といいます。
M-C-kは、 Meta-Control-Kという意味です。 これは、 C-kをメタ化することにより生成される文字を指します。
さらに、 いくつかのキーには名前があります。 DEL、 ESC、 LFD、 SPC、 RET、 TABは、 この文章の中でも、 初期化ファイルの中でも、 各々のキーを表わします (Readline初期化ファイル参照)。
対話的なセッションにおいて、 長いテキストを1行に記述した後で、 その行の先頭の単語のスペルが間違っていたことに気が付くことがよくあります。 Readlineライブラリは、 入力したテキストを操作するための一連のコマンドを提供しており、 これによって、 その行の大部分を入力し直すことなく、 タイプ・ミスしたところだけを修正することができます。 これらの編集コマンドを使って、 修正が必要なところにカーソルを移動させ、 テキストを削除したり、 修正テキストを挿入したりします。 その行の修正が終われば、 単にRETURNを押します。 RETURNを押すのに、 行末にいる必要はありません。 カーソルが行内のどこにあろうと、 その行全体が入力として受け付けられます。
行内に文字を入力するには、 単にその文字をタイプします。 タイプされた文字はカーソルの位置に表示され、 カーソルは1桁分右へ移動します。 1文字打ち間違えた場合は、 削除文字(erase character)を使って、 後退しながら打ち間違えた文字を削除することができます。
ときには、 本当は入力したかった文字を入力せず、 その誤りに気が付くことなく、 さらに数文字を入力してしまうということがあります。 このような場合には、 C-bによってカーソルを左に移動し、 誤りを訂正することができます。 訂正後、 C-fによってカーソルを右に移動することができます。
行の途中にテキストを追加すると、 挿入されたテキストのためのスペースを空けるために、 カーソルの右側にある文字が右方向に押しやられることに気がつくでしょう。 同様に、 カーソル位置にあるテキストを削除すると、 テキストが削除されたために生じる空白を埋めるために、 カーソルの右側にある文字が左方向に引き戻されます。 入力行のテキストを編集するための最も基本的な操作の一覧を以下に示します。
上記の一覧は、 ユーザが入力行を編集するのに必要な、 最も基本的なキー・ストロークを説明したものです。 ユーザの利便を考慮して、 C-b、 C-f、 C-d、 DELに加えて多くのコマンドが追加されてきました。 以下に、 行内をより迅速に動きまわるためのコマンドをいくつか示します。
C-fが1文字分先に進むのに対して、 M-fが1単語分先に進む点に注意してください。 大まかな慣例として、 コントロール・キーを使うと文字単位の操作になり、 メタ・キーを使うと単語単位の操作になります。
テキストをキル(kill)するとは、 行からテキストを削除し、 その際に、 そのテキストを後に引き出して行内にヤンク(yank)(20)することができるように退避しておくことを指します。 あるコマンドの説明に「テキストをキルする」という記述があれば、 後に別の箇所 (あるいは同じ箇所) において、 そのテキストを再入手することができると考えて間違いありません。
キル・コマンドを使うと、 テキストはキル・リング(kill-ring)に退避されます。 キル・コマンドを任意の回数連続して実行すると、 キルされたテキストはすべて連結されて退避されます。 したがって、 ヤンクを行うと、 そのすべてを入手することができます。 キル・リングは個々の行に固有のものではありません。 以前入力した行においてキルしたテキストを、 後になって別の行を入力しているときにヤンクすることができます。
以下に、 テキストをキルするためのコマンドを一覧で示します。
キルされたテキストを引き出して行内へヤンクする方法を、 以下に示します。 ヤンクとは、 最後にキルされたテキストを、 キル・バッファからコピーすることを意味しています。
Readlineコマンドには数値引数を渡すことができます。 数値引数は、 繰り返し回数として使われたり、 引数の符号として使われたりします。 通常は先に進むようなコマンドに負の数を引数として指定すると、 前に戻るようになります。 例えば、 行の先頭までのテキストをキルするには、 `M-- C-k'としてもよいでしょう。
コマンドに数値引数を渡す通常の方法は、 コマンドの前にメタ化された数字を入力することです。 入力された最初の「数字」がマイナス記号(-)の場合、 引数の符号は負になります。 引数を開始するためには、 メタ化された数字を1つだけ入力すればよく、 残りの数字はそのまま入力することができます。 そして最後にコマンドを入力します。 例えば、 C-dコマンドに引数として10を渡すためには、 `M-1 0 C-d'と入力します。
readlineは、 コマンド履歴 の中から、 指定された文字列を含む行を検索するコマンドを提供しています。 インクリメンタル(incremental)と 非インクリメンタル(non-incremental)の2つの検索モードがあります。
インクリメンタル(incremental)・モードでは、 ユーザが検索文字列を入力し終わる前から検索が始まります。 検索文字列の中の文字が1つ入力されるたびに、 Readlineは、 それまで入力された文字列にマッチする、 履歴の中の次のエントリを表示します。 インクリメンタル・モードの検索では、 検索したい履歴エントリを見つけるのに本当に必要となる文字だけを入力するだけで済みます。 インクリメンタル・モードの検索を中止するのには、 isearch-terminators変数の値の中に含まれる文字が使われます。 この変数に値が割り当てられていない場合は、 ESC文字やC-jによってインクリメンタル・モードの検索が中止されます。 C-gは、 インクリメンタル・モードの検索を終了させて、 元の行を表示します。 検索が中止されると、 検索文字列を含む履歴エントリがカレント行となります。 検索文字列にマッチする他のエントリを履歴リストから見つけるためには、 必要に応じてC-sまたはC-rを入力します。 これによって、 それまでに入力された検索文字列にマッチする次のエントリを履歴から見つけるために、 下の方向、 または、 上の方向に検索が行われます。 Readlineコマンドにバインドされているキー・シーケンスのうち上記以外のものを入力すると、 検索は中止され、 そのコマンドが実行されます。 例えば RETが入力されると、 検索は中止され、 そのときの行が受け入れられたことになります。 したがって、 履歴リストの中のそのコマンドが実行されます。
非インクリメンタル(non-incremental)・モードでは、 マッチする履歴行の検索を開始する前に、 検索文字列全体を読み込みます。 検索文字列は、 ユーザによって入力されたものでも構いませんし、 カレント行の内容の一部であっても構いません。
Readlineライブラリには、
emacs
スタイルのキー・バインディングがデフォルトで組み込まれていますが、
異なるキー・バインディングを使うこともできます。
ホーム・ディレクトリ内のファイルinputrcにコマンドを記述することで、
誰でもReadlineを使うプログラムをカスタマイズすることができます。
このファイルの名前は、
環境変数INPUTRC
の値から取られます。
この変数に値がセットされていない場合のデフォルトは、
`~/.inputrc'です。
Readlineライブラリを使うプログラムが起動されると、 初期化ファイルが読み込まれ、 キー・バインディングが設定されます。
さらに、
C-x C-r
コマンドを実行すると、
この初期化ファイルが再読み込みされます。
初期化ファイルに変更が加えられていれば、
その変更が反映されます。
Readline初期化ファイルの中では、 ほんの少数の基本的な構文だけが使用できます。 空行は無視されます。 `#'で始まる行はコメントです。 `$'で始まる行は、 条件構文を表わします (条件初期化構文参照)。 その他の行は、 変数設定とキー・バインディングを示します。
set
コマンドを使用してReadlineの変数の値を変更することによって、
Readlineの実行時の振る舞いを変更することができます。
デフォルトのEmacsスタイルのキー・バインディングを変更して、
vi
の行編集コマンドを使用できるようにするには、
以下のようにします。
set editing-mode vi以下の変数によって、 実行時の振る舞いのかなりの部分が変更可能です。
bell-style
comment-begin
insert-comment
コマンドが実行されたときに、
行の先頭に挿入される文字列です。
デフォルトの値は"#"
です。
completion-ignore-case
completion-query-items
100
です。
convert-meta
disable-completion
self-insert
にマップされたかのように、
行内に挿入されます。
デフォルトは`off'です。
editing-mode
editing-mode
変数は、
デフォルトで使用するキー・バインディングの種類を制御します。
Readlineは、
デフォルトの状態では、
Emacs編集モードで起動します。
このモードは、
キー・ストロークがEmacsに非常に良く似ています。
この変数は、
`emacs'と`vi'のどちらかに設定することができます。
enable-keypad
expand-tilde
horizontal-scroll-mode
input-meta
meta-flag
は、
この変数の別名です。
isearch-terminators
keymap
keymap
名は、
emacs
、
emacs-standard
、
emacs-meta
、
emacs-ctlx
、
vi
、
vi-command
、
vi-insert
です。
vi
はvi-command
と同等です。
また、
emacs
はemacs-standard
と同等です。
デフォルトの値は、
emacs
です。
editing-mode
変数の値も、
デフォルトのキーマップに影響を及ぼします。
mark-directories
mark-modified-lines
output-meta
print-completions-horizontally
show-all-if-ambiguous
visible-stats
Control-u: universal-argument Meta-Rubout: backward-kill-word Control-o: "> output"上の例では、 C-uが関数
universal-argument
にバインドされ、
C-oがその右側に記述されたマクロ
(行内に`> output'というテキストを挿入するマクロ)
を実行するようバインドされます。
"\C-u": universal-argument "\C-x\C-r": re-read-init-file "\e[11~": "Function Key 1"上の例では、 C-uが (最初の例と同様) 関数
universal-argument
に、
`C-x C-r'が関数re-read-init-file
に、
`ESC [ 1 1 ~'が`Function Key 1'というテキストを挿入するよう、
それぞれバインドされています。
\C-
\M-
\e
\\
\"
\'
\a
\b
\d
\f
\n
\r
\t
\v
\nnn
\xnnn
"\C-x\\": "\\"
Readlineは、 Cのプリプロセッサにおける条件コンパイル機能と質的に類似した機能を実装しています。 これによって、 あるテストの結果に応じてキー・バインディングや変数設定が実行されるようにすることができます。 4種類のパーサ指示子が使われます。
$if
$if
は、
編集モード、
使用されている端末、
あるいは、
Readlineを使用しているアプリケーションに応じてバインディングが行われるようにすることを可能にします。
$if
の後ろに、
テストされる内容が行末まで続きます。
テストされる内容をほかのものと分離するために特別に文字を使う必要はありません。
mode
emacs
モードとvi
モードのどちらで動作しているかをテストするために、
$if
指示子の一形式であるmode=
が使用されます。
例えば、
Readlineがemacs
モードで開始されている場合にのみ、
emacs-standard
やemacs-ctlx
のキーマップでバインディングをセットするようにするために、
これを`set keymap'コマンドと組み合わせて使用することができます。
term
term=
という形式は、
端末のファンクション・キーによって特定のキー・シーケンスが出力されるようなバインディングを行うなどの目的で、
端末固有のキー・バインディングを組み込むために使用することができます。
`='の右側の単語は、
端末の完全名と、
端末の名前のうち最初の`-'までの部分の両方に対してテストされます。
これにより、
例えばsun
は、
sun
とsun-cmd
の両方にマッチすることになります。
application
$if Bash # Quote the current or previous word "\C-xq": "\eb\"\ef\"" $endif
$endif
$if
コマンドを終わらせます。
$else
$if
指示子から枝分かれしたこの部分に記述されたコマンドは、
テスト結果が偽であった場合に実行されます。
$include
$include /etc/inputrc
以下に、 inputrcファイルの実例を示します。 この中では、 キー・バインディング、 変数割り当て、 条件構文の例が示されています。
# このファイルは、Gnu Readlineライブラリを使うプログラムの行入力編集 # の振る舞いを制御する。Gnu Readlineライブラリを使うプログラムには、 # FTP、Bash、Gdbなどがある。 # # inputrcファイルは、C-x C-rによって再読み込みすることができる。 # '#'で始まる行は、コメントである。 # # 最初に、/etc/Inputrcからシステム全体のバインディングと変数割り当て # を取り込む。 $include /etc/Inputrc # # emacsモードにおける種々のバインディングをセットする。 set editing-mode emacs $if mode=emacs Meta-Control-h: backward-kill-word 関数名の後ろのテキストは無視される。 # # キーパッド・モードにおける矢印キー # #"\M-OD": backward-char #"\M-OC": forward-char #"\M-OA": previous-history #"\M-OB": next-history # # ANSIモードにおける矢印キー # "\M-[D": backward-char "\M-[C": forward-char "\M-[A": previous-history "\M-[B": next-history # # 8ビット・キーパッド・モードにおける矢印キー # #"\M-\C-OD": backward-char #"\M-\C-OC": forward-char #"\M-\C-OA": previous-history #"\M-\C-OB": next-history # # 8ビットANSIモードにおける矢印キー # #"\M-\C-[D": backward-char #"\M-\C-[C": forward-char #"\M-\C-[A": previous-history #"\M-\C-[B": next-history C-q: quoted-insert $endif # 旧スタイルのバインディング。これがたまたまデフォルトでもある。 TAB: complete # シェルとのやりとりにおいて便利なマクロ $if Bash # パス(PATH)の編集 "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f" # 引用符で囲まれた単語を入力するための準備 -- 先頭と末尾の二重引用符 # を挿入して、先頭の引用符の直後に移動 "\C-x\"": "\"\"\C-b" # バックスラッシュを挿入 # (シーケンスやマクロにおいて、バックスラッシュ・エスケープをテストする) "\C-x\\": "\\" # カレントな単語、または、1つ前の単語を引用符で囲む "\C-xq": "\eb\"\ef\"" # バインドされていない行再表示コマンドにバインディングを追加 "\C-xr": redraw-current-line # カレント行において変数を編集 "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y=" $endif # 視覚的なベルが利用可能であれば、それを使う set bell-style visible # 読み込みの際に、文字の第8ビットを落とさない set input-meta on # iso-latin1文字は、プレフィックス・メタ・シーケンスに変換せず、 # そのまま挿入する set convert-meta off # 第8ビットがセットされている文字を、メタ・プレフィックス文字として # ではなく、直接表示する set output-meta on # ある単語について、150を超える補完候補が存在する場合、ユーザに対して # すべてを表示させたいかどうかを問い合わせる set completion-query-items 150 # FTP用 $if Ftp "\C-xg": "get \M-?" "\C-xt": "put \M-?" "\M-.": yank-last-arg $endif
このセクションでは、 キー・シーケンスにバインドすることが可能なReadlineコマンドについて説明します。
beginning-of-line (C-a)
end-of-line (C-e)
forward-char (C-f)
backward-char (C-b)
forward-word (M-f)
backward-word (M-b)
clear-screen (C-l)
redraw-current-line ()
accept-line (Newline, Return)
previous-history (C-p)
next-history (C-n)
beginning-of-history (M-<)
end-of-history (M->)
reverse-search-history (C-r)
forward-search-history (C-s)
non-incremental-reverse-search-history (M-p)
non-incremental-forward-search-history (M-n)
history-search-forward ()
history-search-backward ()
yank-nth-arg (M-C-y)
yank-last-arg (M-., M-_)
yank-nth-arg
と同じように動作します。
yank-last-arg
を連続して実行すると、
履歴リストを遡って移動していきます。
したがって、
各行の最後の引数が順番に挿入されていきます。
delete-char (C-d)
delete-char
にバインドされていない場合は、
EOF
を返します。
backward-delete-char (Rubout)
forward-backward-delete-char ()
quoted-insert (C-q, C-v)
tab-insert (M-TAB)
self-insert (a, b, A, 1, !, ...)
transpose-chars (C-t)
transpose-words (M-t)
upcase-word (M-u)
downcase-word (M-l)
capitalize-word (M-c)
kill-line (C-k)
backward-kill-line (C-x Rubout)
unix-line-discard (C-u)
kill-whole-line ()
kill-word (M-d)
forward-word
の場合と同様です。
backward-kill-word (M-DEL)
backward-word
の場合と同様です。
unix-word-rubout (C-w)
delete-horizontal-space ()
kill-region ()
copy-region-as-kill ()
copy-backward-word ()
backward-word
の場合と同様です。
デフォルトでは、
このコマンドはバインドされていません。
copy-forward-word ()
forward-word
の場合と同様です。
デフォルトでは、
このコマンドはバインドされていません。
yank (C-y)
yank-pop (M-y)
digit-argument (M-0, M-1, ... M--)
universal-argument ()
universal-argument
を再実行することによって、
その数字引数を終わらせることができます。
しかし、
このコマンドの後ろに数字が続かない場合の再実行は、
無視されます。
特殊なケースとして、
このコマンドの直後に数字でもマイナス記号でもない文字が続く場合、
次に実行されるコマンドの引数カウントは4倍されます。
引数カウントの初期値は1です。
したがって、
この関数を最初に実行した後には、
引数カウントは4になり、
2回目に実行した後には16になります。
以下、
同様です。
デフォルトでは、
キーへのバインドはされていません。
complete (TAB)
possible-completions (M-?)
insert-completions (M-*)
possible-completions
を実行すれば生成されたであろうテキストの補完候補をすべて、
ポイントの前に挿入します。
menu-complete ()
complete
に似ていますが、
補完されるべき単語を、
補完候補の一覧の中の1つと置き換えます。
menu-complete
を繰り返し実行すると、
補完候補の一覧から順番に1つずつ補完候補が挿入されていきます。
候補一覧の終端に達すると、
ベル音が鳴らされ、
補完前のテキストが復元されます。
引数nを指定すると、
補完候補の一覧の中でn個先に移動します。
一覧を逆方向に戻るために、
負の引数を指定することができます。
このコマンドは、
TAB
にバインドすることを意図したものですが、
デフォルトではバインドされていません。
delete-char-or-list ()
delete-char
のように)
そのカーソル位置にある文字を削除します。
行末にある場合は、
possible-completions
と同一の振る舞いします。
このコマンドは、
デフォルトではバインドされていません。
start-kbd-macro (C-x ()
end-kbd-macro (C-x ))
call-last-kbd-macro (C-x e)
re-read-init-file (C-x C-r)
abort (C-g)
bell-style
の設定次第では)
端末のベル音を鳴らします。
do-uppercase-version (M-a, M-b, M-x, ...)
prefix-meta (ESC)
undo (C-_, C-x C-u)
revert-line (M-r)
undo
コマンドを、
行を元の状態に戻すのに必要な回数繰り返して実行するようなものです。
tilde-expand (M-~)
set-mark (C-@)
exchange-point-and-mark (C-x C-x)
character-search (C-])
character-search-backward (M-C-])
insert-comment (M-#)
comment-begin
変数の値が挿入され、
挿入後の行が、
あたかも改行が入力されたかのように、
受け付けられます。
dump-functions ()
dump-variables ()
dump-macros ()
vi
モード
Readlineライブラリは、
vi
の編集機能のフルセットを提供してはいませんが、
簡単な行編集を行うのに十分な機能は備えています。
Readlineのvi
モードは、
POSIX 1003.2標準にしたがって動作します。
emacs
編集モードとvi
編集モードを対話的に切り替えるには、
コマンドM-C-j(toggle-editing-mode)を使用してください。
Readlineのデフォルトはemacs
モードです。
vi
モードで行入力を行うときには、
あたかも`i'を入力したかのように、
最初から「挿入」モードになっています。
ESCを押すと「コマンド」モードになり、
標準的なvi
の移動キーによって行のテキストを編集することができます。
すなわち、
`k'により前の履歴行に移動すること、
`j'によって後ろの履歴行に移動すること、
などが可能です。