Linux

bashとzshでコマンド履歴からコマンドを検索して実行できるツールHSTR

はじめに

LinuxやmacOS、またはWSLでコマンドを使っている際に、長いコマンドやよく使うコマンドを何度も入力することがあると思います。HSTRは、コマンド履歴からコマンドを検索してそのまま実行できるツールです。この記事では、HSTRのインストール手順と使い方をまとめます。

HSTRについて

HSTRはbash、zshで動作し、Linux、macOS、Windows Subsystems for Linux(以降、WSL)にインストール可能です。私はWSL上のUbuntuにインストールして使用しています。
動作イメージは以下のGIF画像の通りです。HSTRをショートカットキーで呼び出すと、入力待ち状態になり、入力した内容に合致するコマンドを表示してくれます。表示されたコマンドをそのまま実行できます。

以下が公式リポジトリです。各ディストリビューションでのインストール方法などが詳しく記載されています。

HSTR

Easily view, navigate and search your command history with shell history suggest box for Bash and zsh.

前提と環境

この記事では、WSL上のUbuntu18.04にインストールしました。

  • OS : Ubuntu18.04 (WSL上)

HSTRをインストールする

インストール手順は簡単で、リポジトリを追加してaptでインストールするだけになります。

$ sudo add-apt-repository ppa:ultradvorka/ppa
$ sudo apt update
$ sudo apt install hstr

以上でインストールは完了です。最後に、以下のコマンドを実行してHSTRの設定をホームディレクトリにある.bashrcに書き込んでおきます。

hstr --show-configuration >> ~/.bashrc

上記コマンドを実行後、以下のコマンドで.bashrcを読み込んで書き込んだ内容を反映させます。

source ~/.bashrc

HSTRでコマンド履歴からコマンドを検索して実行する

HSTRを呼び出すには、デフォルトのショートカットキーであるCtrl + rを使います。ターミナル上でCtrl + rを押下すると、以下のようにコマンド検索用の入力待ち状態になります。そしてここで適当に入力すると、その入力内容に合致するコマンド候補を表示してくれます。後は表示されたコマンドが選択された状態で右矢印キーを押下すると、そのコマンドが入力されます。右矢印キーではなくEnterを押下すればそのまま実行されます。

Esc、もしくはCtrl + xで修了できます。

HSTRの設定を変更する

HSTRの基本的な使い方は以上ですが、設定を色々と変更、追加できカスタマイズも可能です。
なお、HSTRは、インストール時に実行したコマンドからもわかるようにホームディレクトリにある.bashrに設定を書き込んでいます。デフォルトの状態では、.bashrcの内容として以下が末尾に追記されていました。

# HSTR configuration - add this to ~/.bashrc
alias hh=hstr                    # hh to be alias for hstr
export HSTR_CONFIG=hicolor       # get more colors
shopt -s histappend              # append new history items to .bash_history
export HISTCONTROL=ignorespace   # leading space hides commands from history
export HISTFILESIZE=10000        # increase history file size (default is 500)
export HISTSIZE=${HISTFILESIZE}  # increase history size (default is 500)
# ensure synchronization between Bash memory and history file
export PROMPT_COMMAND="history -a; history -n; ${PROMPT_COMMAND}"
# if this is interactive shell, then bind hstr to Ctrl-r (for Vi mode check doc)
if [[ $- =~ .*i.* ]]; then bind '"\C-r": "\C-a hstr -- \C-j"'; fi
# if this is interactive shell, then bind 'kill last command' to Ctrl-x k
if [[ $- =~ .*i.* ]]; then bind '"\C-xk": "\C-a hstr -k \C-j"'; fi

上記の内容を変更することで設定変更を行います。

ショートカットキーを変更する

ショートカットキーを変更するにあたり、まず使用しているbashまたはzshのキーマップを確認します。bashではデフォルトではEmacsのキーマップとなっていますが、以下のコマンドを実行すると確かにEmacsになっていることが分かります。

$ bind -v | grep editing-mode
set editing-mode emacs
$ bind -v | grep keymap
set keymap emacs

以降では、キーマップがEmcasであることを前提とします。EmacsかViかによってショートカットキーに関する設定ファイルの書き方が異なります。
例えばもしショートカットキーをCtrl + Alt + rに変更したい場合は、該当部分を以下のように変更します。

# Ctrl + Alt
# if this is interactive shell, then bind hstr to Ctrl-r (for Vi mode check doc)
if [[ $- =~ .*i.* ]]; then bind '"\C-r": "\C-a hstr -- \C-j"'; fi

# Ctrl + Alt +r
# if this is interactive shell, then bind hstr to Ctrl-r (for Vi mode check doc)
if [[ $- =~ .*i.* ]]; then bind '"\e\C-r":"\C-ahstr -- \C-j"'; fi

キーマップがViになっている場合の変更方法やその他の設定変更については以下の公式ドキュメントに記載されています。

まとめ

日常的にターミナルを使用する方でかつ毎回同じコマンドを使っている場合には、中々に便利です。長いコマンドを何度も入力することはなくなると思います。

SPONSORED LINK

コメントを残す

メールアドレスが公開されることはありません。