Readline

提供: ArchWiki
2015年10月25日 (日) 01:19時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

ReadlineGNU プロジェクトによって開発されているライブラリで、コマンドラインで編集したり対話するために Bash などの CLI インターフェイスプログラムで使われています。このページを読む前にライブラリの ホームページ を参照してください。ここでは簡単な設定だけに触れます。

コマンドラインの編集

デフォルトでは Readline はコマンドラインと対話するのに Emacs のようなショートカットを使います。ただし、vi スタイルの編集インターフェイスもサポートはされています。

vi あるいは vim を使っている場合、以下の行を ~/.inputrc に記述することで vi ライクなキーバインドを有効にできます:

set editing-mode vi

もしくは、vi ライクなキーバインドを使うために、以下の行を ~/.bashrc に追加する方法もあります:

set -o vi

便利な viemacs のチートシートも参照。

履歴

通常、上方向キーを押すと、今入力しているコマンドとは関係なく、最後に実行したコマンドが表示されます。しかしながら、今入力した文字列とマッチする過去のコマンドだけを表示するようにすると便利かもしれません。

例えば、ユーザーが以下のコマンドを実行していた場合:

  • ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig
  • who
  • mount
  • man mount

この場合、ls と入力して上方向キーを押したときに、入力されている文字が man mount に置き換わるようなことです。履歴検索を有効にしていれば、(現在入力した) ls から始まる過去のコマンドだけが表示されます。上記の例なら ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig です。

以下の行を /etc/inputrc または ~/.inputrc に追加することで履歴検索モードを有効にできます:

"\e[A":history-search-backward
"\e[B":history-search-forward

vi モードを使っている場合、以下の行を ~/.inputrc に追加します (この投稿 を参照):

set editing-mode vi
$if mode=vi
set keymap vi-command
# these are for vi-command mode
"\e[A": history-search-backward
"\e[B": history-search-forward
set keymap vi-insert
# these are for vi-insert mode
"\e[A": history-search-backward
"\e[B": history-search-forward
$endif

上記の行を ~/.inputrc に追加する場合、こちら のような変なことが起こらないようにファイルの最初に以下の行を追加することを推奨します:

$include /etc/inputrc

また、Ctrl+R を押すことで reverse-search-history (インクリメンタル検索) を使うこともできます。前の入力に基づいて検索する代わりに入力されたコマンドを検索語として履歴バッファを後方に検索します。このモードで Ctrl+R をもう一度押すと現在の検索語にマッチするバッファの一つ前の行が表示され、Ctrl+G (abort) を押すと検索がキャンセルされて現在の入力行に戻ります。例えば前に実行した mount コマンドを検索したい場合、Ctrl+R を押してから 'mount' と入力して、見つけたい行が出るまで Ctrl+R を押します。

このモードの前方検索は forward-search-history と呼ばれデフォルトでは Ctrl+S で呼び出せます。しかしながら、ほとんどのターミナルは Ctrl+S を上書きしてしまい、Ctrl+Q が入力されるまで画面出力が一時停止します (XON/XOFF フロー制御と呼ばれます)。forward-search-history を有効にするには、以下のコマンドを実行してフロー制御を無効化:

$ stty -ixon

または inputrc で別のキーを使って下さい。例えば、デフォルトで何にもバインドされていない Alt+S を使うには:

"\es":forward-search-history

履歴検索

重複を無視する

同じコマンドを複数回実行した場合、全てが履歴に追加されます。重複させないようにするには、以下を ~/.bashrc に追加してください:

export HISTCONTROL=ignoredups

空白を無視する

空白から始まる行の記録を無効化するには以下を ~/.bashrc に追加します:

export HISTCONTROL=ignorespace

~/.bashrc に既に以下が記述されている場合:

export HISTCONTROL=ignoredups

以下のように置き換えてください:

export HISTCONTROL=ignoreboth

マクロ

Readline ではキーをキーボードマクロにバインドすることができます。例えば、Bash で以下のコマンドを実行します:

bind '"\ew":"\C-e # macro"'

もしくは inputrc に以下を追加します:

"\ew":"\C-e # macro"

そして何か文字を入力して Alt+W を押して見て下さい。Readline はまるで Ctrl+E (end-of-line) が押されたように振る舞い、' # macro' が追加されます。

Readline マクロで既存のキーバインドを使うことで、頻繁に使用するイディオムを自動的に使うようにできて大変便利です。例えば、以下のマクロは Ctrl+Alt+L で "| less" を行末に追加して実行します (Ctrl+MEnter と同じです):

"\e\C-l":"\C-e | less\C-m"

以下のマクロは Ctrl+Alt+Y を押すと行頭に 'yes |' が追加され、yes/no を聞いてくるコマンドに y で答えてくれます:

"\e\C-y":"\C-ayes | \C-m"

以下のマクロは Alt+S が押されたときに入力した文字列を su -c '' で囲ってくれます:

"\es":"\C-a su -c '\C-e'\C-m"

以下のマクロは Alt+S が押されたときに sudo を行頭に付けます。Enter キーは入力しないので安全です。

"\es":"\C-asudo \C-e"

最後の例は、Ctrl+Alt+B でコマンドを バックグラウンドに送って、全ての出力を捨てます:

"\e\C-b":"\C-e > /dev/null 2>&1 &\C-m"

Tips and tricks

制御エコーを無効にする

readline のアップデートによって、Ctrl+C を押すとターミナルは ^C を表示するようになっています。制御文字を表示して欲しくない場合、以下を ~/.inputrc に追加します:

set echo-control-characters off