「Readline」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(en:Readlineへの転送ページ)
 
(add Category.)
 
(4人の利用者による、間の13版が非表示)
1行目: 1行目:
  +
[[Category:コマンドライン]]
#redirect[[en:Readline]]
 
  +
[[Category:GNU]]
  +
[[en:Readline]]
  +
[[it:Readline]]
  +
[[ru:Readline]]
  +
[[zh-hans:Readline]]
  +
'''Readline''' は [[GNU プロジェクト]]によって開発されているライブラリで、コマンドラインで編集したり対話するために [[Bash]] などの CLI インターフェイスプログラムで使われています。詳しくは {{man|3|readline}} を参照してください。ここでは簡単な設定だけに触れます。
  +
  +
== インストール ==
  +
  +
{{Pkg|readline}} パッケージは、[[Bash]] の依存関係としてすでにインストールされている可能性があります。
  +
  +
== 編集モード ==
  +
デフォルトでは Readline はコマンドラインと対話するのに [[Emacs]] のようなショートカットを使います。ただし、vi スタイルの編集インターフェイスもサポートはされています。
  +
  +
[[vi]] あるいは vim を使っている場合、以下の行を {{Ic|~/.inputrc}} に記述することで Readline ベースのアプリケーションで vi ライクなキーバインドを有効にできます:
  +
  +
{{hc|~/.inputrc|
  +
set editing-mode vi}}
  +
  +
もしくは、以下の行を {{Ic|~/.bashrc}} に追加すると [[Bash]] で vi ライクなキーバインドが設定されます:
  +
  +
{{hc|~/.bashrc|
  +
set -o vi}}
  +
  +
便利な [http://www.catonmat.net/download/bash-vi-editing-mode-cheat-sheet.pdf vi] や [http://www.catonmat.net/download/readline-emacs-editing-mode-cheat-sheet.pdf emacs] のチートシートも参照。
  +
  +
=== プロンプトのモードインジケータ ===
  +
  +
viスタイルの編集には、コマンドと挿入の2つのモードがあります。次のオプションを追加すると、現在アクティブなものを表示できます。
  +
  +
{{hc|~/.inputrc|
  +
set show-mode-in-prompt on
  +
}}
  +
  +
プロンプトに表示される文字列 (デフォルトでは {{ic|(cmd)}}/{{ic| (ins) }})は、{{ic|vi-ins-mode-string}} および {{ic|vi-cmd-mode-string}} 変数を使用してカスタマイズできます。
  +
  +
=== モードごとに異なるカーソル形状 ===
  +
  +
モードごとに異なるカーソル形状を設定するには、[https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html#index-vi_002dcmd_002dmode_002dstring "\1 .. \2" escapes]
  +
  +
{{hc|~/.inputrc|
  +
set vi-ins-mode-string \1\e[6 q\2
  +
set vi-cmd-mode-string \1\e[2 q\2
  +
}}
  +
  +
  +
これにより、コマンドモードの場合はブロック型カーソルが、挿入モードの場合はパイプカーソルが設定されます。 これを機能させるには、モードインジケーターを有効にする必要があることに注意してください ([[#Mode indicator in prompt]] を参照)
  +
  +
仮想コンソールでは異なるエスケープコードが使用されるため、最初に使用されている用語を確認する必要があります。
  +
  +
{{hc|~/.inputrc|2=
  +
$if term=linux
  +
set vi-ins-mode-string \1\e[?0c\2
  +
set vi-cmd-mode-string \1\e[?8c\2
  +
$else
  +
set vi-ins-mode-string \1\e[6 q\2
  +
set vi-cmd-mode-string \1\e[2 q\2
  +
$endif
  +
}}
  +
  +
詳細については、[https://www.kernel.org/doc/html/latest/admin-guide/vga-softcursor.html software cursor for VGA] を参照してください。
  +
  +
== 高速な単語移動 ==
  +
  +
[[Xterm]] は {{ic|Ctrl+Left}} と {{ic|Ctrl+Right}} による単語ごとの移動を [https://stackoverflow.com/a/7783928 デフォルトで] サポートしています。他のターミナルエミュレータでもこの機能を使うには、適切な [http://wiki.bash-hackers.org/scripting/terminalcodes ターミナルコード] を確認して、{{ic|~/.inputrc}} で {{ic|backward-word}} と {{ic|forward-word}} にバインドしてください。
  +
  +
例えば [[urxvt]] の場合:
  +
  +
{{hc|~/.inputrc|
  +
"\e[1;5D": backward-word
  +
"\e[1;5C": forward-word}}
  +
  +
== 履歴 ==
  +
通常、上方向キーを押すと、今入力しているコマンドとは関係なく、最後に実行したコマンドが表示されます。しかしながら、今入力した文字列とマッチする過去のコマンドだけを表示するようにすると便利かもしれません。
  +
  +
例えば、ユーザーが以下のコマンドを実行していた場合:
  +
* {{Ic|ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig}}
  +
* {{Ic|who}}
  +
* {{Ic|mount}}
  +
* {{Ic|man mount}}
  +
この場合、{{Ic|ls}} と入力して上方向キーを押したときに、入力されている文字が {{Ic|man mount}} に置き換わるようなことです。履歴検索を有効にしていれば、(現在入力した) {{Ic|ls}} から始まる過去のコマンドだけが表示されます。上記の例なら {{Ic|ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig}} です。
  +
  +
以下の行を {{Ic|/etc/inputrc}} または {{Ic|~/.inputrc}} に追加することで履歴検索モードを有効にできます:
  +
"\e[A":history-search-backward
  +
"\e[B":history-search-forward
  +
  +
vi モードを使っている場合、以下の行を {{Ic|~/.inputrc}} に追加します ([https://bbs.archlinux.org/viewtopic.php?pid=428760#p428760 この投稿] を参照):
  +
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
  +
j:history-search-forward
  +
k:history-search-backward
  +
set keymap vi-insert
  +
# these are for vi-insert mode
  +
"\e[A": history-search-backward
  +
"\e[B": history-search-forward
  +
$endif
  +
  +
上記の行を {{Ic|~/.inputrc}} に追加する場合、[https://bbs.archlinux.org/viewtopic.php?id=112537 こちら] のような変なことが起こらないようにファイルの最初に以下の行を追加することを推奨します:
  +
  +
$include /etc/inputrc
  +
  +
また、{{ic|Ctrl+R}} を押すことで reverse-search-history (インクリメンタル検索) を使うこともできます。前の入力に基づいて検索する代わりに入力されたコマンドを検索語として履歴バッファを後方に検索します。このモードで {{ic|Ctrl+R}} をもう一度押すと現在の検索語にマッチするバッファの一つ前の行が表示され、{{ic|Ctrl+G}} (abort) を押すと検索がキャンセルされて現在の入力行に戻ります。例えば前に実行した {{Ic|mount}} コマンドを検索したい場合、{{ic|Ctrl+R}} を押してから 'mount' と入力して、見つけたい行が出るまで {{ic|Ctrl+R}} を押します。
  +
  +
このモードの前方検索は forward-search-history と呼ばれデフォルトでは {{ic|Ctrl+S}} で呼び出せます。しかしながら、ほとんどのターミナルは {{ic|Ctrl+S}} を上書きしてしまい、{{ic|Ctrl+Q}} が入力されるまで画面出力が一時停止します (XON/XOFF フロー制御と呼ばれます)。forward-search-history を有効にするには、以下のコマンドを実行してフロー制御を無効化:
  +
$ stty -ixon
  +
または {{Ic|inputrc}} で別のキーを使って下さい。例えば、デフォルトで何にもバインドされていない {{ic|Alt+S}} を使うには:
  +
"\es":forward-search-history
  +
  +
== 高速な補完 ==
  +
  +
タブ補完を実行するとき、タブを一回押すと入力している単語が部分的に補完されます。部分補完ができない場合、タブを二回押すと全ての補完候補が表示されます。
  +
  +
タブを一回押した時に二回押したときと同じ補完を実行するには、以下を設定:
  +
{{hc|~/.inputrc|
  +
set show-all-if-unmodified on
  +
}}
  +
  +
もしくは一回のタブで両方の補完を実行するように設定: 部分補完を実行して補完候補を全て表示:
  +
{{hc|~/.inputrc|
  +
set show-all-if-ambiguous on
  +
}}
  +
  +
== カラー補完 ==
  +
  +
{{ic|colored-stats}} オプションを使うことでファイル名の補完に色を付けることができます。{{ic|colored-completion-prefix}} で補完リストの一致部分に色を付けることも可能です。例:
  +
  +
{{hc|~/.inputrc|
  +
# Color files by types
  +
set colored-stats On
  +
# Append char to indicate type
  +
set visible-stats On
  +
# Mark symlinked directories
  +
set mark-symlinked-directories On
  +
# Color the common prefix
  +
set colored-completion-prefix On
  +
# Color the common prefix in menu-complete
  +
set menu-complete-display-prefix On
  +
}}
  +
  +
== マクロ ==
  +
Readline ではキーをキーボードマクロにバインドすることができます。例えば、Bash で以下のコマンドを実行します:
  +
bind '"\ew":"\C-e # macro"'
  +
  +
もしくは inputrc に以下を追加します:
  +
"\ew":"\C-e # macro"
  +
  +
そして何か文字を入力して {{ic|Alt}}+{{ic|W}} を押して見て下さい。Readline はまるで {{ic|Ctrl+E}} (end-of-line) が押されたように振る舞い、'{{Ic| # macro}}' が追加されます。
  +
  +
Readline マクロで既存のキーバインドを使うことで、頻繁に使用するイディオムを自動的に使うようにできて大変便利です。例えば、以下のマクロは {{ic|Ctrl+Alt+L}} で "| less" を行末に追加して実行します ({{ic|Ctrl+M}} は {{ic|Enter}} と同じです):
  +
"\e\C-l":"\C-e | less\C-m"
  +
  +
以下のマクロは {{ic|Ctrl+Alt+Y}} を押すと行頭に 'yes |' が追加され、yes/no を聞いてくるコマンドに y で答えてくれます:
  +
"\e\C-y":"\C-ayes | \C-m"
  +
  +
以下のマクロは {{ic|Alt+S}} が押されたときに入力した文字列を {{Ic|su -c ''}} で囲ってくれます:
  +
"\es":"\C-a su -c '\C-e'\C-m"
  +
  +
以下のマクロは {{ic|Alt+S}} が押されたときに {{Ic|sudo }} を行頭に付けます。{{ic|Enter}} キーは入力しないので安全です。
  +
"\es":"\C-asudo \C-e"
  +
  +
最後の例は、{{ic|Ctrl+Alt+B}} でコマンドを バックグラウンドに送って、全ての出力を捨てます:
  +
"\e\C-b":"\C-e > /dev/null 2>&1 &\C-m"
  +
  +
== 制御エコーを無効にする ==
  +
{{Pkg|readline}} のアップデートによって、{{ic|Ctrl+C}} を押すとターミナルは {{Ic|^C}} を表示するようになっています。制御文字を表示して欲しくない場合、以下を {{Ic|~/.inputrc}} に追加します:
  +
set echo-control-characters off
  +
  +
== 参照 ==
  +
  +
* [http://www.catonmat.net/download/bash-vi-editing-mode-cheat-sheet.pdf vi readline 編集チートシート]
  +
* [http://www.catonmat.net/download/readline-emacs-editing-mode-cheat-sheet.pdf emacs readline 編集チートシート]

2022年3月6日 (日) 08:46時点における最新版

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

インストール

readline パッケージは、Bash の依存関係としてすでにインストールされている可能性があります。

編集モード

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

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

~/.inputrc
set editing-mode vi

もしくは、以下の行を ~/.bashrc に追加すると Bash で vi ライクなキーバインドが設定されます:

~/.bashrc
set -o vi

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

プロンプトのモードインジケータ

viスタイルの編集には、コマンドと挿入の2つのモードがあります。次のオプションを追加すると、現在アクティブなものを表示できます。

~/.inputrc
set show-mode-in-prompt on

プロンプトに表示される文字列 (デフォルトでは (cmd)/ (ins) )は、vi-ins-mode-string および vi-cmd-mode-string 変数を使用してカスタマイズできます。

モードごとに異なるカーソル形状

モードごとに異なるカーソル形状を設定するには、"\1 .. \2" escapes

~/.inputrc
set vi-ins-mode-string \1\e[6 q\2
set vi-cmd-mode-string \1\e[2 q\2


これにより、コマンドモードの場合はブロック型カーソルが、挿入モードの場合はパイプカーソルが設定されます。 これを機能させるには、モードインジケーターを有効にする必要があることに注意してください (#Mode indicator in prompt を参照)

仮想コンソールでは異なるエスケープコードが使用されるため、最初に使用されている用語を確認する必要があります。

~/.inputrc
$if term=linux
	set vi-ins-mode-string \1\e[?0c\2
	set vi-cmd-mode-string \1\e[?8c\2
$else
	set vi-ins-mode-string \1\e[6 q\2
	set vi-cmd-mode-string \1\e[2 q\2
$endif

詳細については、software cursor for VGA を参照してください。

高速な単語移動

XtermCtrl+LeftCtrl+Right による単語ごとの移動を デフォルトで サポートしています。他のターミナルエミュレータでもこの機能を使うには、適切な ターミナルコード を確認して、~/.inputrcbackward-wordforward-word にバインドしてください。

例えば urxvt の場合:

~/.inputrc
"\e[1;5D": backward-word
"\e[1;5C": forward-word

履歴

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

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

  • 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
j:history-search-forward
k:history-search-backward
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

高速な補完

タブ補完を実行するとき、タブを一回押すと入力している単語が部分的に補完されます。部分補完ができない場合、タブを二回押すと全ての補完候補が表示されます。

タブを一回押した時に二回押したときと同じ補完を実行するには、以下を設定:

~/.inputrc
set show-all-if-unmodified on

もしくは一回のタブで両方の補完を実行するように設定: 部分補完を実行して補完候補を全て表示:

~/.inputrc
set show-all-if-ambiguous on

カラー補完

colored-stats オプションを使うことでファイル名の補完に色を付けることができます。colored-completion-prefix で補完リストの一致部分に色を付けることも可能です。例:

~/.inputrc
# Color files by types
set colored-stats On
# Append char to indicate type
set visible-stats On
# Mark symlinked directories
set mark-symlinked-directories On
# Color the common prefix
set colored-completion-prefix On
# Color the common prefix in menu-complete
set menu-complete-display-prefix On

マクロ

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"

制御エコーを無効にする

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

set echo-control-characters off

参照