Blog

.inputrc の設定 – Readlineのキーバインディングで開発生産性を向上させる –

この記事は、リレーブログ企画「24新卒リレーブログ」の記事です。

はじめに

こんにちは。新卒1年目のkeyliumです。開発生産性に関心があります。

シェルの入力でも普段使っているエディターのように、行・単語ごとのジャンプや削除などをしてみたいと思ったことはありませんか?
エディターでの快適な操作性をシェルでも再現できると、生産性がぐっと向上します。そんな便利な設定を可能にするのが、.inputrcファイルです。

筆者の環境

OS: Windows
Terminal: Windows Terminal
  Tera Termを使用している場合、一部のキーバインドや cat -v が期待通りに動作しないことがあります。
Shell: Bash (GitBash)

.inputrcとは?

.inputrcファイルは、GNU Readlineライブラリの設定ファイルです。Readlineは、Bashを始めとする多くのシェルやコマンドラインツールで使われており、コマンドラインでの入力編集を制御しています。
このファイルをカスタマイズすることで、自分好みのキーバインディングや入力方法を設定することができます。

デフォルトの設定

まずは、デフォルトでどのようなキーバインディングが設定されているのかを見てみましょう。
デフォルトのBashシェルはEmacsスタイルのキーバインディングを使用しています。以下に、いくつかの主要なデフォルト設定を紹介します:

  • Ctrl + A: 行の先頭に移動
  • Ctrl + E: 行の末尾に移動
  • Ctrl + K: カーソルから行の末尾まで削除
  • Ctrl + U: カーソルから行の先頭まで削除
  • Ctrl + W: カーソルの前の単語を削除
  • Ctrl + Backspace: カーソルの前の単語を削除
  • Ctrl + Delete: カーソルの後の単語を削除
  • Ctrl + L: 画面をクリアにする
  • Alt + F: 次の単語に移動
  • Alt + B: 前の単語に移動

これらのデフォルト設定を確認するために、シェルを開いて実際に試してみてください。

おすすめのキーバインディング

history-search-backward

  • デフォルトキーバインディング: PageUp
  • 動作: 現在のコマンドラインに部分的に入力されたテキストに一致する履歴のコマンドを、逆方向に検索します。
  • 使用例: 例えば、コマンドラインに「echo」と入力し、その状態でhistory-search-backwardを実行すると、履歴の中で「echo」で始まるコマンドを逆方向に検索して表示します。
  • 利点: 一部入力されたコマンドに基づいて履歴を絞り込みたい場合に便利です。

history-search-forward

  • デフォルトキーバインディング: PageDown
  • 動作: history-search-backwardの逆の操作です。

previous-history

  • デフォルトキーバインディング: Ctrl + P 
  • 動作: 現在のコマンドラインの入力に関係なく、単に履歴の中で1つ前のコマンドを表示します。
  • 使用例: コマンドラインに何も入力されていない状態でprevious-historyを実行すると、履歴の中で直前のコマンドが表示されます。
  • 利点: コマンド履歴を一つずつ遡って確認したい場合に便利です。

next-history

  • デフォルトキーバインディング: Ctrl + N 
  • 動作: previous-historyの逆の操作です。

reverse-search-history

  • デフォルトキーバインディング: Ctrl + R
  • 動作: インクリメンタルサーチを使用して、コマンド履歴を逆方向に検索します。検索中にリアルタイムで結果が更新されます。
  • 使用例: Ctrl+Rを押すと、(reverse-i-search)プロンプトが表示され、キーワードを入力するたびに、履歴から一致するコマンドが順次表示されます。
  • 利点: インタラクティブに履歴を検索できるため、目的のコマンドを素早く見つけることができます。

character-search

  • デフォルトキーバインディング: Ctrl + [
  • 動作: カーソルから順方向に特定の文字を検索し、最初に見つかった位置にカーソルを移動します。
  • 使用例: Ctrl+[ を押して、特定の文字を入力すると、カーソルから順方向にその文字を検索します。
  • 利点: コマンドライン内の特定の文字にすばやく移動したい場合に便利です。

character-search-backward

  • デフォルトキーバインディング: Alt + Ctrl + [
  • 動作: character-search-backward の逆の動作です。

revert-line

  • デフォルトキーバインディング: Alt + R
  • 動作: カーソルのある行を元の状態に戻します。元の状態とは、行が最初に表示された時の内容です。コマンドを編集してしまった場合に、編集前の状態に戻すことができます。
  • 使用例: 例えば、history-search-backwardなどで現在の行に入力されたコマンド を変更してしまったが、元のコマンドに戻したい場合に使用します。

kill-whole-line

  • デフォルトキーバインディング: これはデフォルトでは設定されていません。次の章で設定します。
  • 動作: カーソルのある行全体を削除します。
  • 使用例: 例えば、現在の行に長いコマンドが入力されていて、その行全体を削除したい場合に使用します。

.inputrcを使ってカスタマイズする

デフォルト設定を理解したら、自分のニーズに合わせて.inputrcファイルをカスタマイズしてみましょう。.inputrcファイルはホームディレクトリに置き、以下のような形式で設定を記述します。この設定は私が使っている設定です。:

.inputrcファイルの変更を適用するには3つの方法があります。以下のどれかを実行しましょう。

  • シェルを再起動する
  • 以下のコマンドを実行する:
    • bind -f ~/.inputrc
  • C-x C-r を押す(Ctrl + xを押してからCtrl + rを押す)

これで .inputrcに書いた機能が有効になったはずです。

履歴に関する環境変数

履歴を参照することが多いため、履歴に関する環境変数を紹介します。以下の設定は.bashrcに書きます。この設定は私が使っている設定です。

HISTCONTROL

HISTCONTROL は、シェル(特に Bash)でコマンド履歴の動作を制御するための環境変数です。HISTCONTROL を使用すると、コマンド履歴に保存されるコマンドの種類を制御できます。以下に、HISTCONTROL の主なオプションを説明します。

HISTCONTROL のオプション

  1. ignoredups
    • 重複する連続したコマンドを履歴に保存しません。
    • 例: ls コマンドを2回連続で実行すると、1回分だけ履歴に保存されます。
  2. ignorespace
    • 空白で始まるコマンドを履歴に保存しません。
    • 例: ls(スペースが前にある ls)は履歴に保存されません。
  3. ignoreboth
    • ignoredupsignorespace の両方を適用します。
    • 重複する連続コマンドと、空白で始まるコマンドを履歴に保存しません。
  4. erasedups
    • 履歴全体から重複するコマンドを削除します。最新のものだけが保存されます。
    • 例: 履歴に ls が複数回含まれている場合、最新の ls だけが残ります。

HISTSIZEとHISTFILESIZE

HISTSIZE

  • 履歴に保存するコマンドの最大数を設定します。
  • この設定は、シェルがメモリ内で保持する履歴の数を制御します。
  • シェルセッション中に使用され、シェルを閉じるとクリアされます(履歴ファイルに保存されない場合)。

HISTFILESIZE

  • 履歴ファイルに保存するコマンドの最大数を設定します。
  • これは、シェルセッションが終了するときに .bash_history などの履歴ファイルに保存されるコマンドの数を制御します。
  • 次のシェルセッションで履歴を読み込むために使用されます。

HISTTIMEFORMAT

HISTTIMEFORMAT

  • 履歴に保存されるコマンドのタイムスタンプの形式を指定します。
  • フォーマットは date コマンドの形式と同じです。

export HISTTIMEFORMAT="%F %T "という設定を行うと、履歴にタイムスタンプが追加されます。
historyコマンドを使うとYYYY-MM-DD HH:MM:SS の形式で表示されます。

Q&A

Q: キーがどの制御文字に対応するかを知る方法は?

A: cat コマンドを使う

最も簡単な方法の一つは、シェルで cat コマンドを使うことです。このコマンドは、入力されたキーシーケンスをそのまま表示してくれます。

  1. シェルを開き、cat -v コマンドを実行します:
  2. 次に、調べたいキーを押します。例えば、Ctrlキーを押しながら左矢印キーを押し、Enterを押すと、^[ODが出力されるはずです。これは、Ctrl + 左矢印キーが \eOD に対応することを意味します。^[\e に対応し、OD がそのまま制御文字として使用されます。
  3. 終了するには、Ctrl + D を押します。

機能しない機能

forward-search-history (C-s)

履歴を最初の方から検索する機能。実行するとフリーズする。C-cで抜けられます。

set mark (C-@)

矩形選択を行う機能。これも機能しません。

参考資料

Readline – ArchWiki
https://wiki.archlinux.jp/index.php/Readline

readline(3) — Arch manual pages
https://man.archlinux.org/man/readline.3

history コマンドに日時を付与する – Qiita
https://qiita.com/bezeklik/items/56a597acc2eb568860d7

 

最後に

シェルの入力設定をカスタマイズすることで、コマンドラインでの作業効率を大幅に向上させることができます。.inputrc ファイルを利用して、自分好みのキーバインドや動作を設定することで、コマンドライン操作がより直感的で便利になるでしょう。

シェルのカスタマイズを通じて、日々の作業がよりスムーズに、そして効率的に進むことを願っています。

以上、.inputrc の設定 -Readlineのキーバインディングを知って開発生産性を向上させる-でした。

ありがとうございました。

次回は山本さんです。

楽しみにしています。

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!