目次
はじめに
シェルで操作をする際に何となく知っているキーバインディングを駆使して行入力の操作しています。
そういえば今まで体系だってここらへん学んだ事がないので、理解を深める意味でも、様々なシェルに影響を与えているとBash(GNU Readline)のリファレンスを確認し、どのようなキーバインディングが用意されているのか確認してみます。
ドキュメント
ドキュメントのどこら辺に該当の記載があるか
キーバインディングで行入力な話は上記の章でGNU Readlineが提供している事が説明されており。
インタラクティブシェルの行の編集の文脈で紹介されています。
なおデフォルトでは行の編集コマンドはemacsのコマンドと似ていますが、設定によってviスタイルの行編集インターフェースを選択する事も可能なようです。
このため本記事では8章の部分を読み込んで理解した内容を纏める形で記述していきます。
が、書いている途中でBashが提供している機能が多く記事が長くなってきたので
といった具合に記事を分割して記載していきます。
現時点ではまだ8.2 Readline Interactionの最後までしか読み込んでいないため、残りをどんな単位で分割するかは未定。 先は長い。
8.1 Introduction to Line Editing
8.1 Introduction to Line Editing
今回、本ページで記載しているキー操作の表記については、Bashのリファレンスに記載されている表記にそろえています。
上記ドキュメントにあるように、本資料では
- C-K => CTRLとKキーを同時に押す
- M-K => AltキーとKキーを同時に押す
といった形で記述します。
それにしても今現在のキーボードにはないMetaキーがドキュメントに出てくる時点で時代を感じます。
またリファレンスがキーボードのショートカット順で表記されているわけではなく、機能ごとに分かれて記述されているので、それに合わせて記載していきます。
8.2 Readline Interaction
インタラクティブなセッションで長いテキストを入力している場合、最初の単語が間違っている事に気が付くありますが、Readlineライブラリでは、入力中のテキストを操作するコマンドセットが用意されており全体を打ち直す必要がない点が説明されています。
BashではGNU Readlineでインタラクティブなセッションのテキスト操作に利用できるコマンドが提供されている事がわかります。また以降はこのRedlineコマンドの説明が続いていくため各章ごとに簡単にまとめていきます。
8.2.1 Readline Bare Essentials
8.2.1 Readline Bare Essentials
この章ではカーソル移動と文字入力、文字削除、Undoについて記載されていました。
C-b | カーソルを1文字左に移動 |
C-f | カーソルを1文字右に移動 |
DEL or Backspace | カーソルの左側の文字を削除 |
C-d | カーソルの下側の文字を削除 |
Printing caracters | カーソル位置に文字を挿入 |
C-_ or C-X C-U | 最後の編集コマンドを取り消し ※C-X C-U については C-X を押した後に続けて C-U を押す意味 |
リファレンスにも下側に注意書きとして記載がありますが、設定によってはDELキーとC-dはカーソルの右側の文字を削除するとあります。
今現在は、DELキーがカーソルの右側の文字を削除するのが一般的ななような気はします。
8.2.2 Readline Movement Commands
8.2.2 Readline Movement Commands
この章では入力行の編集に便利なキーストロークについて記述されていました。
C-a | 行の先頭に移動 |
C-e | 行の末尾に移動 |
M-f | 単語単位で次に移動 |
M-b | 単豪単位で前に移動 |
C-l | 画面をクリア、現在の行を画面の上部に再表示 |
欄外の注意ガキとして、C-fは文字単位で、M-fは単語単位となっており、コントロールキーの操作は文字単位、メタキーの操作は単語単位といった慣習があるらしい。
8.2.3 Readline Killing Commands
8.2.3 Readline Killing Commands
文字列の削除と再利用について記述されている章になります。
またkill & yank の用語について、これらの最近の言い換えが cut & paste と説明がありました。
killコマンドされたテキストはkill-ringに保存され、yankで引っ張りだされる。
以下はテキストをkillする操作
C-k | 現在のカーソル位置から行の末尾までをkill |
M-d | カーソルから現在の単語の末尾まで。単語間の場合は次の単語の末尾までkill |
M-DEL | カーソルから現在の単語の先頭まで。単語間の場合は前の単語の先頭までkill |
C-w | カーソルから前の空白までkill |
以下はkillしたテキストをyankする操作
C-y | 直近でkillされたテキストを入力 |
M-y | kill-ringをローリングさせ、新しいトップになったテキストをyankする。 このコマンドを実行する前提として、前に実行したコマンドがC-y または M-yである必要あり |
8.2.4 Readline Arguments
この章ではReadlineコマンドには数値引数渡す事ができると記載されています。
引数が繰り返し回数として利用する場合もあれば、引数に負の符号を渡すこともあります。
通常、前方向に動作するコマンドに負の引数を渡すと、逆の意味になり後ろ方向に動作します。
引数に負の符号を渡す例
M-- C-k | Altキーと-(マイナス)を押した後、CTRLキーとkキーを押した場合。 C-kが現在のカーソル位置から行の末尾までをkill という動作が逆方向に作用して、現在のカーソル位置から行の先頭までkillするコマンドとして実行される |
Altキーとマイナスキーを押した段階で、(arg: -1) と引数入力の画面が表示され、この画面の後にC-kを入力するとコマンドの意味が反転して行頭までkillされる。
引数に数値を渡す例
M-1 0 C-d | Altキーと1 を押した後、0キーを押し、続けてCTRLキーとdキーを押した場合。 C-dキーがカーソルの下側の文字を削除する動作が10回繰り返され、カーソルの下側の文字が10文字削除される動作になる |
カーソルを先頭に合わせた状態で M-1 0 を入力すると(arg-10)と引数の入力画面が表示され、この画面の後にC-dを入力すると、カーソル下の文字を削除が10回実行され10文字削除される
10文字分(foobarhell)が削除されされた。
8.2.5 Searching for Commands in the History
Readlineライブラリでは、指定された文字列を含むコマンド履歴を検索するためのコマンドが用意されており。検索モードには、インクリメンタルとノンインクリメンタルの2つがある。
インクリメンタル
検索文字列の各文字が入力されるとReadlineライブラリは履歴から一致するエントリを表示する。
インクリメンタルでは目的の履歴を見つけるために必要な文字数だけ入力すれば済む。
C-r | C-rを押した後に文字を入力すると履歴から一致する履歴が後方検索される |
C-s | C-sを押した後に文字を入力すると履歴から一致する履歴が前方検索される ※ただし現在ではBashでC-sはフロー制御に利用されており、デフォルトの状態でC-sを押すと出力が一時停止するので設定をいれないと使えない stty -ixonのようにターミナルのフロー制御を無効化したりする必要あり |
SAMPLE(C-r)
下準備としてecho foo , echo bar , echo hello を実行し履歴に書き込み。
この状態でC-rを押すと、インクリメンタルモードになりキーを打つごとに一致する履歴が表示される
下記はインクリメンタルモードになったあとにechoと打った画像。 echo が後方検索されて一番最初に合致するecho helloが履歴から検索され表示されている。
この状態でさらにC-rを押すと、一つ前のecho barが検索される
この状態で一つ先に戻りたければC-sを押せばよいが、何も設定していないデフォルトとの状態だとターミナルの出力が一時停止してしまうので注意。
C-sを押すと、前方検索モードになる。
もう一度C-sを押すと、一つ先の履歴であるecho helloが検索される
ノンインクリメンタル
検索文字列全体を入力してから履歴の一致する行を検索する。
M-p | M-pを押した後に飲検索文字列を入力してenterを押すと履歴が後方検索される |
M-n | M-pを押した後に検索文字列を入力してenterを押すと履歴が前方検索される |
SAMPLE(M-p)
下準備としてecho foo , echo bar , echo hello を実行し履歴に書き込み。
この状態でM-pを押すとノンインクリメンタルモードになるため echoを入力
検索する文字であるechoを入力
この状態でenterを押すと、履歴から一致する履歴が後方検索される
総評
Bashのキーバインディングってなんとなくで利用しているけど体系的に学んだ事がなかったので。
なんとなくBashのリファレンスで該当部分を読み始めて纏めましたが、機能が多岐にわたっているため一旦は8.2 Readline Interaction の最後までをまとめました。
この時点で個人的に全然つかったことない機能がたくさんといった感じなので、先は長そうです。
まとめた後に使いこなれせるようになるにはどういったトレーニングが考えられるのだろうか。