この章では、 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は、 この文章の中でも、 初期化ファイルの中でも、 各々のキーを表わします (@xref{Readline Init File})。
対話的なセッションにおいて、 長いテキストを1行に記述した後で、 その行の先頭の単語のスペルが間違っていたことに気が付くことがよくあります。 Readlineライブラリは、 入力したテキストを操作するための一連のコマンドを提供しており、 これによって、 その行の大部分を入力し直すことなく、 タイプ・ミスしたところだけを修正することができます。 これらの編集コマンドを使って、 修正が必要なところにカーソルを移動させ、 テキストを削除したり、 修正テキストを挿入したりします。 その行の修正が終われば、 単にRETURNを押します。 RETURNを押すのに、 行末にいる必要はありません。 カーソルが行内のどこにあろうと、 その行全体が入力として受け付けられます。
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
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
input-meta
meta-flagは、
この変数の別名です。
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 # カレントな単語、または、1つ前の単語を引用符で囲む "\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)
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にバインドすることを意図したものですが、
デフォルトではバインドされていません。
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'によって後ろのヒストリ行に移動すること、
などが可能です。