この記事は、リレーブログ企画「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: 前の単語に移動
これらのデフォルト設定を確認するために、シェルを開いて実際に試してみてください。
おすすめのキーバインディング
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# PageUp キーで履歴検索 "\e[5~": history-search-backward # PageDown キーで履歴検索 "\e[6~": history-search-forward # Ctrl + P で前のコマンドを表示する (上キーでも可) "\C-p": previous-history # Ctrl + N で次のコマンドを表示する (下キーでも可) "\C-n": next-history # Ctrl+R でコマンド履歴を逆方向から検索 "\C-r": reverse-search-history # Alt + R で行を元に戻す "\er": revert-line |
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
ファイルはホームディレクトリに置き、以下のような形式で設定を記述します。この設定は私が使っている設定です。:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# コメントは#で始めます # Alt + qで行削除 "\eq": kill-whole-line # ↑↓キーで履歴検索(PageUp, PageDownが押しづらい人向け) "\e[A": previous-history "\e[B": next-history # TABキーで、補完する単語を可能な補完リストの 1 つの一致に置き換えます。 # menu-completeを繰り返し実行すると、可能な補完リストを順に進み、各一致を順番に挿入します。 TAB: menu-complete # Shift + TAB で逆方向にmenu-complete "\e[Z": menu-complete-backward # 補完で大文字小文字を無視する set completion-ignore-case on |
.inputrc
ファイルの変更を適用するには3つの方法があります。以下のどれかを実行しましょう。
- シェルを再起動する
- 以下のコマンドを実行する:
- bind -f ~/.inputrc
C-x C-r
を押す(Ctrl + xを押してからCtrl + rを押す)
これで .inputrc
に書いた機能が有効になったはずです。
履歴に関する環境変数
履歴を参照することが多いため、履歴に関する環境変数を紹介します。以下の設定は.bashrc
に書きます。この設定は私が使っている設定です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 重複する連続コマンドと、先頭に半角スペースが入っているコマンドを履歴に記録しない export HISTCONTROL=ignoredups:ignorespace # 履歴に保存するコマンドの最大数を設定(デフォルトは500) export HISTSIZE=10000 # 履歴ファイルに保存するコマンドの最大数を設定(デフォルトは500) export HISTFILESIZE=10000 # 履歴に保存しないコマンドのパターンを指定. # 複数ある場合は":"で区切る export HISTIGNORE="ls" # 履歴に保存されるコマンドのタイムスタンプの形式を指定 export HISTTIMEFORMAT="%F %T " |
HISTCONTROL
HISTCONTROL
は、シェル(特に Bash)でコマンド履歴の動作を制御するための環境変数です。HISTCONTROL
を使用すると、コマンド履歴に保存されるコマンドの種類を制御できます。以下に、HISTCONTROL
の主なオプションを説明します。
HISTCONTROL
のオプション
ignoredups
- 重複する連続したコマンドを履歴に保存しません。
- 例:
ls
コマンドを2回連続で実行すると、1回分だけ履歴に保存されます。
ignorespace
- 空白で始まるコマンドを履歴に保存しません。
- 例:
ls
(スペースが前にあるls
)は履歴に保存されません。
ignoreboth
ignoredups
とignorespace
の両方を適用します。- 重複する連続コマンドと、空白で始まるコマンドを履歴に保存しません。
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
コマンドを使うことです。このコマンドは、入力されたキーシーケンスをそのまま表示してくれます。
- シェルを開き、
cat -v
コマンドを実行します: - 次に、調べたいキーを押します。例えば、Ctrlキーを押しながら左矢印キーを押し、Enterを押すと、
^[OD
が出力されるはずです。これは、Ctrl + 左矢印キーが\eOD
に対応することを意味します。^[
は\e
に対応し、OD
がそのまま制御文字として使用されます。 - 終了するには、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でニフティグループに
参加いただくと
イベントの
お知らせが届きます!