[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]  


コマンドライン編集

ここでは、 GNUのコマンドライン編集のインターフェイスを説明します。

行編集入門

以下のパラグラフでは、 キー・ストロークを表すための表記法について説明します。

文字列C-kはControl-Kと読み、 コントロール・キーが押されたままの状態でキーkが押された時に生成される文字を表します。

文字列M-kはMeta-Kと読み、 メタ・キー (があるものとして、それ) が押されたままの状態でキーkが押された時に生成される文字を表します。 メタ・キーがない場合、 同等のキー・ストロークを、 最初にESCキーを押し、 次にキーkを押すことで生成することができます。 どちらの手順も、 キーkメタ化するといいます。

文字列M-C-kはMeta-Control-Kと読み、 C-kメタ化することにより生成される文字を指します。

さらに、 いくつかのキーには名前があります。 DELESCLFDSPCRETTABはこの付録内でも、 初期化ファイルの中でも、 各々のキーを表します (詳細については、 Readline初期化ファイルを参照)。

Readlineの操作

しばしば対話的なセッションにおいて、 長いテキストを1行に記述した後で、 その行の先頭の単語のスペルが間違っていたことに気がつくことがあります。 Readlineライブラリは、 入力したテキストを操作するための一連のコマンドを提供しており、 これによって、 その行の大部分を入力し直すことなく、 タイプ・ミスしたところだけを修正することができます。 これらの編集コマンドを使って、 修正が必要なところにカーソルを移動させ、 テキストを削除したり、 修正テキストを挿入(insert)したりします。 その行の修正が終われば、 単にRETを押します。 RETを押すのに、 行末にいる必要はありません。 カーソルが行内のどこにあろうと、 その行全体が入力として受け付けられます。

Readlineの基本

行内に文字を入力するには、 単にその文字をタイプします。 タイプされた文字はカーソルの位置に表示され、 カーソルは1桁分右へ移動します。 1文字打ち間違えた場合は、 DELによって後退して打ち間違えた文字を削除することができます。

時には、 本当は入力したかった文字を入力せず、 その誤りに気がつくことなく、 さらに数文字を入力してしまうということがあります。 このような場合には、 C-bによってカーソルを左に移動し、 誤りを訂正することができます。 訂正後、 C-fによってカーソルを右に移動することができます。

行の途中にテキストを追加すると、 挿入(insert)された文字のためのスペースを空けるために、 カーソルの右側にある文字が右方向に押しやられることに気がつくでしょう。 同様に、 カーソル位置にあるテキストを削除すると、 文字が削除されたために生じる空白を埋めるために、 カーソルの右側にある文字が左方向に引き戻されます。 入力行のテキストを編集するための基本中の基本操作の一覧を以下に示します。

C-b
1文字戻ります
C-f
1文字進みます
DEL
カーソルの左にある文字を削除します
C-d
カーソル位置にある文字を削除します
表示可能な文字
行内のカーソル位置にその文字自身を挿入(insert)します
C-_
ユーザの最後の操作を取り消して元に戻します。 行内に文字が無くなるまで取り消しを繰り返すことが可能です

Readline移動コマンド

上記の一覧は、 ユーザが入力行を編集するのに必要な最も基本的なキー・ストロークを説明したものです。 ユーザの便利を考え、 C-bC-fC-dDELに加えて多くのコマンドが追加されてきました。 以下に、 行内をより迅速に動きまわるためのコマンドをいくつか示します。

C-a
行の先頭に移動します
C-e
行の末尾に移動します
M-f
1単語分先に進みます
M-b
1単語分前に戻ります
C-l
画面上の情報を消去し、 カレント行が1番上にくるように再表示します

C-fが1文字分先に進むのに対して、 M-fが1単語分先に進む点に注意してください。 大まかな慣例として、 コントロール・キーを使うと文字単位の操作になり、 メタ・キーを使うと単語単位の操作になります。

Readlineキル(kill)コマンド

テキストをキル(kill)するとは、 行からテキストを削除し、 その際に、 そのテキストを後に引き出してその行内に挿入(yank)することができるように退避しておくことを指します。 あるコマンドの説明に「テキストをキル(kill)する」という記述があれば、 そのテキストを後に別の箇所 (あるいは同じ箇所) において再入手することができると考えて間違いありません。

以下に、テキストをキル(kill)するためのコマンドを一覧で示します。

C-k
カレントなカーソル位置から行末までのテキストをキル(kill)します。
M-d
カーソル位置からカーソルの置かれている単語の末尾までをキル(kill)します。 カーソルが2つの単語の間にあるときは、 次の単語の末尾までをキル(kill)します。
M-DEL
カーソル位置から、 カーソルの置かれている単語の先頭までをキル(kill)します。 カーソルが2つの単語の間にあるときは、 前の単語の先頭までをキル(kill)します。
C-w
カーソル位置から、 それより前にある最初の空白までをキル(kill)します。 単語間の境界が異なるので、 これはM-DELとは異なります。

次に、キル(kill)されたテキストを引き出して行内へ挿入(yank)する方法を示します。

C-y
バッファ内のカーソル位置に、 最後にキル(kill)されたテキストを挿入(yank)します。
M-y
キル・リング(kill-ring)を回転させ、 新たにトップに来たテキストを挿入(yank)します。 このコマンドを実行できるのは、 1つ前に実行したコマンドがC-yもしくはM-yの場合だけです。

キル(kill)コマンドを使うと、 テキストはキル・リング(kill-ring)に退避されます。 キル(kill)コマンドを任意の回数連続して実行すると、 キル(kill)されたテキストはすべて連結されて退避されます。 したがって、 挿入(yank)を行うと、 そのすべてを一気に手に入れることができます。 キル・リング(kill-ring)は個々の行に固有のものではありません。 以前入力した行においてキル(kill)したテキストを、 後になって別の行を入力している時に、 挿入(yank)することができます。

Readlineの引数

Readlineコマンドには数値引数を渡すことができます。 数値引数は、 繰り返し回数として使われたり、 引数の符号として使われたりします。 通常は先に進むようなコマンドに負の数を引数として指定すると、 前に戻るようになります。 例えば、 行の先頭までのテキストをキル(kill)するには、 M-- C-kとします。

コマンドに数値引数を渡す通常の方法は、 コマンドの前にメタ化された数値を入力することです。 入力した最初の数値が、 マイナス記号(-)の場合、 引数の符号は負になります。 引数を開始するために1つメタ化された数値を入力すれば、 その後は、 残りの数値を入力し、 続いてコマンドを入力することができます。 例えば、 C-dコマンドに引数として10を渡すためには、 M-1 0 C-dを入力します。

Readline初期化ファイル

ReadlineライブラリにはGNU Emacs風のキー・バインディングが付いていますが、 ユーザが異なるキー・バインディングを使いたいということがあるかもしれません。 ユーザのホーム・ディレクトリ内の初期化ファイルにコマンドを記述することで、 Readlineを使うプログラムをカスタマイズすることができます。 このファイルの名前は、 `~/.inputrc'です。

Readlineライブラリを使うプログラムが起動されると、 `~/.inputrc'ファイルが読み込まれ、 キー・バインディングが設定されます。

さらに、 C-x C-rコマンドによってこの初期化ファイルが再読み込みされるので、 ユーザが初期化ファイルに加えた変更を組み込むことができます。

Readline初期化ファイルの構文

`~/.inputrc'ファイルの中では、4種の構成物のみ許されます。

変数の設定
Readlineの中の2、3の変数の状態を変更することができます。 これは、 初期化ファイルの中でsetコマンドを使うことで行います。 行編集コマンドとしてviを使いたいということを指定するには、 次のようにします。
set editing-mode vi
現在のところ、 設定できる変数は極めて少ないので、 ここでそのすべてを取り上げます。
editing-mode
editing-mode変数は、 どの編集モードを使うのかを制御します。 デフォルトでは、 GNU Readlineは、 キー・ストロークがEmacsによく似ているEmacs編集モードで起動します。 この変数は、 emacsviのどちらかに設定することができます。
horizontal-scroll-mode
この変数は、 OnOffのどちらかに設定することができます。 これをOnに設定すると、 1行のテキストの長さがスクリーン幅よりも長い場合に、 編集中の行のテキストが次の行に折り返すことなく、 同じ行の上で水平方向にスクロールするようになります。 デフォルトでは、 この変数はOffに設定されています。
mark-modified-lines
この変数がOnに設定されると、 変更されたヒストリ行の先頭にアスタリスク(`*')が表示されます。 この変数はデフォルトではOffです。
prefer-visible-bell
この変数がOnに設定されると、 視覚的なベル(8) が利用できる場合には、 単に端末のベルを鳴らす代りに、 視覚的なベルを使用します。 デフォルトでは、 この値はOffです。
キー・バインディング
`~/.inputrc'ファイルの中でキー・バインディングを制御するための構文は単純です。 まず、 キー・バインディングを変更したいコマンドの名前を知っている必要があります。 以下に、 コマンド名、 そのコマンドのデフォルトのキー・バインディング、 そのコマンドが何をするものであるかについての簡単な説明を一覧にして示します。 コマンドの名前が分れば、 `~/.inputrc'ファイル内の1行に、 そのコマンドに割り当てたいキーの名前に続けてコロン、 さらに続けてそのコマンドの名前を記述します。 キーの名前は、 ユーザの好みに応じて異なる方法で表現することができます。
keyname: function-name or macro
keynameは英語で記述されたキーの名前です。 例えば、 以下のようになります。
Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: ">&output"
上の例では、 C-uが関数universal-argumentに割り当てられ、 C-oがその右側に記述されたマクロ (行内に`>&output'というテキストを挿入(insert)するマクロ) を実行するよう割り当てられます。
"keyseq": function-name or macro
keyseqは、 前の例のkeynameとは異なり、 一連のキー入力全体を記述する文字列を指定することができます。 一連のキーは、 2重引用符で囲みます。 以下の例に示すように、 GNU Emacsスタイルのキー・エスケープを使うことができます。
"\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'というテキストを挿入(insert)するよう、 それぞれ割り当てられています。

移動のためのコマンド

beginning-of-line (C-a)
カレント行の先頭に移動します。
end-of-line (C-e)
カレント行の末尾に移動します。
forward-char (C-f)
1文字分先に進みます。
backward-char (C-b)
1文字分後へ戻ります。
forward-word (M-f)
次の単語の末尾へ移動します。
backward-word (M-b)
現在カーソルが指している単語、 もしくは、 1つ前の単語の先頭に移動します。
clear-screen (C-l)
画面を消去し、 カレント行が画面のトップになるようにして再表示します。

ヒストリを操作するためのコマンド

accept-line (Newline, Return)
カーソルの位置にかかわりなく、 行全体を受け付けます。 この行が空行ではない場合、 それをヒストリ・リストに追加します。 この行がヒストリ行である場合は、 そのヒストリ行を最初の状態に復元します。
previous-history (C-p)
ヒストリ・リストを1つ上に移動します。
next-history (C-n)
ヒストリ・リストを1つ下に移動します。
beginning-of-history (M-<)
ヒストリの最初の行に移動します。
end-of-history (M->)
入力ヒストリの最後の行、 すなわち、 ユーザがまさに入力している行に移動します。
reverse-search-history (C-r)
カレントな行から始めて後方検索を行います。 必要に応じて、 ヒストリの上の方へ移動します。 インクリメンタルな検索を行います。
forward-search-history (C-s)
カレントな行から始めて前方検索を行います。 必要に応じて、 ヒストリの下の方へ移動します。

テキストを変更するためのコマンド

delete-char (C-d)
カーソル位置にある文字を削除します。 カーソルが空行の先頭にあり、 最後に入力された文字がC-dでない場合は、 EOFを返します。
backward-delete-char (Rubout)
カーソル位置の前にある文字を削除します。 数値引数を指定すると、 文字を削除するのではなくキル(kill)するよう指示したことになります。
quoted-insert (C-q, C-v)
このコマンドのあとに入力する文字をそのまま行に追加します。 これが、 例えばC-qなどを挿入する(insert)方法です。
tab-insert (M-TAB)
タブを挿入(insert)します。
self-insert (a, b, A, 1, !, ...)
その文字自身を挿入(insert)します。
transpose-chars (C-t)
ポイントの前にある文字を1文字分先にドラッグして、 ポイントの位置にある文字の後ろに持っていきます。 ポイント自身も同様に先に進みます。 ポイントが行末にある場合には、 ポイントの前の2つの文字を入れ替えます。 負の引数を与えても機能しません。
transpose-words (M-t)
カーソルの後ろにある単語をドラッグして、 カーソルの前にある単語の前に持っていきます。 カーソル自身も、 カーソルの前にある単語の前に移動します。
upcase-word (M-u)
カレントな (あるいは、 1つ後の) 単語内のすべての文字を大文字に変換します。 負の引数を指定すると、 1つ前の単語内のすべての文字を大文字に変換しますが、 ポイントは移動しません。
downcase-word (M-l)
カレントな (あるいは、 1つ後の) 単語内のすべての文字を小文字に変換します。 負の引数を指定すると、 1つ前の単語内のすべての文字を小文字に変換しますが、 ポイントは移動しません。
capitalize-word (M-c)
カレントな (あるいは、 1つ後の) 単語内の先頭の文字を大文字に変換します。 負の引数を指定すると、 1つ前の単語内の先頭の文字を大文字に変換しますが、 ポイントは移動しません。

キル(kill)とヤンク(yank)

kill-line (C-k)
カレントなカーソル位置から行末までのテキストをキル(kill)します。
backward-kill-line ()
行頭までのテキストをキル(kill)します。 これには、 通常キーが割り当てられていません。
kill-word (M-d)
カーソル位置からカレントな単語の末尾までをキル(kill)します。 カーソルが単語の間にある場合は、 次の単語の末尾までをキル(kill)します。
backward-kill-word (M-DEL)
カーソルの前にある単語をキル(kill)します。
unix-line-discard (C-u)
UNIXの行入力においてC-uがかつて機能していたのと同様の方法で行全体をキル(kill)します。 キル(kill)されたテキストはキル・リング(kill-ring)に退避されます。
unix-word-rubout (C-w)
UNIXの行入力においてC-wがかつて機能していたのと同様の方法で単語をキル(kill)します。 キル(kill)された単語はキル・リング(kill-ring)に退避されます。 これは、 単語間の境界が異なるために、 backward-kill-wordとは異なります。
yank (C-y)
バッファ内のポイント位置にキル・リング(kill-ring)のトップにあるテキストを挿入(yank)します。
yank-pop (M-y)
キル・リング(kil-ring)を回転させ、 新しくトップになったテキストを挿入(yank)します。 1つ前に実行したコマンドがyankもしくはyank-popであった場合のみ、 このコマンドを実行することができます。

数値引数の指定

digit-argument (M-0, M-1, ... M--)
数値を既に蓄積済みの引数に追加するか、 新しい引数を開始します。 M--は負の引数を開始します。
universal-argument ()
GNU EmacsにおけるC-uと同様の動作をします。 デフォルトでは、 キーは割り当てられていません。

Readlineによる入力補完

complete (TAB)
ポイント位置の前にあるテキストの補完を試みます。 実際の動きは実装により定義されます。 通常、 ファイル名をとる引数を入力している時には、 ファイル名を補完することができます。 コマンド名を入力している時には、 コマンド名を補完することができます。 GDBに対してシンボル名を入力している時には、 シンボル名を補完することができます。 Bashに対して変数名を入力している時には、 変数名を補完することができます。
possible-completions (M-?)
ポイントの前のテキストの補完候補を一覧表示します。

その他のコマンド

re-read-init-file (C-x C-r)
ユーザの`~/.inputrc'ファイルの内容を読み込み、 そこに記述されているバインディングを組み込みます。
abort (C-g)
カレントな編集コマンドの実行を停止します。
prefix-meta (ESC)
次に入力する文字をメタ化します。 これは、 メタ・キーのないキーボードを使っている人のためのコマンドです。 ESC fを入力するのはM-fを入力するのと同じことです。
undo (C-_)
インクリメンタルな取り消し処理を実行します。 取り消す内容は、 各行ごとに別々に記憶されています。
revert-line (M-r)
行に加えられたすべての変更を取り消します。 これは、 最初の状態に戻すのに必要な回数だけundoコマンドを実行するようなものです。

Readlineのviモード

Readlineライブラリはviの編集機能のフルセットを提供する訳ではありませんが、 簡単な行編集を行うのに十分な機能は備えています。

GNU Emacs編集モードとvi編集モードを対話的に切り替えるには、 M-C-j (toggle-editing-mode) コマンドを使います。

viモードで行入力を行う時には、 あたかもiを入力したかのように、 最初から挿入モードになっています。 ESCを押すと編集モードに替わり、 標準的なviの移動キーにより行内テキストを編集することができます。 kにより1つ前のヒストリ行に、 jによって1つ後のヒストリ行に移動すること等ができます。


[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]