ターミナル操作をpecoで爆速に!コマンド履歴とディレクトリ移動
pecoは、シンプルでインタラクティブなフィルタリングツールです。標準入力からテキストを受け取り、リアルタイムでフィルタリング条件を入力することで、目的のテキスト行を素早く見つけ出すことができます。コマンドラインでの作業効率を大きく向上させることができる便利なツールです。 GitHub - peco/peco: Simplistic interactive filtering tool開発環境
項目 | バージョン |
---|---|
macOS | 14.2 |
zsh | 5.9 (x86_64-apple-darwin23.0) |
peco | v0.5.11 |
OS | インストールコマンド |
---|---|
macOS | brew install peco |
Rocky Linux | sudo dnf install golang go install github.com/peco/peco/cmd/peco@latest |
Rocky Linuxの場合
Rocky Linuxの場合は、インストール後パスを通す必要があります。以下は、rootと一般ユーザーの両方で、pecoを使えるようにする設定です。
$ sudo mv $(go env GOPATH)/bin/peco /usr/local/bin/
$ echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
基本的な使い方
pecoはパイプ(|)を通して他のコマンドの出力をフィルタリングするために使用されます。例えば、findコマンドの出力をpecoでフィルタリングして、特定のファイルを探したい場合は以下のようにします。find ~/Projects -name 'filename' | peco
このコマンドを実行すると、pecoのインタラクティブなUIが表示され、findコマンドの出力結果がリストとして表示されます。そこでキーボードを使ってフィルタリング条件を入力すると、条件にマッチする結果のみがリアルタイムで絞り込まれて表示されます。キャンセルする場合はCtrl+Cを入力してインタラクティブモードを終了します。
コマンドの履歴検索を爆速にする
CTRL + R で過去に実行したコマンドを選択できるようにする
zshの設定ファイル~/.zshrcに以下を追記します。
function peco-select-history() {
BUFFER=$(\history -n -r 1 | peco --query "$LBUFFER")
CURSOR=$#BUFFER
zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history
今までの履歴検索では...
$ [control + r]
bck-i-search: 検索ワード_
デフォルトの履歴機能は、1行しか表示されないので、似たようなコマンドがある場合にうまく抽出できません。正直、使い辛すぎてほとんど使っていませんでした。
peco導入後では...
CTRL + Rを入力すると、いままでの検索モードとはちがって、pecoのインタラクティブモードへ切り替わります。キーワードを入力して検索結果をしぼりこみ、上下ボタンでコマンドを選択できます。QUERY>
source ~/.zshrc ...
- QUERYで検索し候補を絞り込む
- 上下キーでコマンドを選択
- プロンプトにコマンドが入力される
と、このようにpeco導入後は、コマンド履歴検索が格段につかいやすくなりました。これなら頻繁に利用したいと思えます。
ところで履歴保存はデフォルトで1000件です。pecoの利便性を活かすためにも、10000件まで登録できるように設定することにしました。以下を追記します。
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
HISTSIZE はメモリ内で保持する履歴の件数で、SAVEHIST は履歴ファイル(通常は ~/.zsh_history)に保存される履歴の件数です。
bashの場合
bashの場合は、以下のように設定します。
# pecoを使ってコマンド履歴を選択する関数
peco-select-history() {
local selected_cmd=$(history | tac | peco --query "$READLINE_LINE")
if [ -n "$selected_cmd" ]; then
# 行番号とコマンド部分を分けてコマンド部分のみ取得
selected_cmd=$(echo "$selected_cmd" | sed 's/^[ ]*[0-9]\+[ ]*//')
READLINE_LINE="$selected_cmd"
READLINE_POINT=${#READLINE_LINE}
fi
}
# Ctrl+rにpeco-select-historyをバインド
bind -x '"\C-r": peco-select-history'
# コマンド履歴の設定
HISTFILE=~/.bash_history
HISTSIZE=10000
HISTFILESIZE=10000
ディレクトリ移動を爆速にする
履歴だけでなく、ディレクトリ移動にもpecoを応用することができます。以下は、過去のディレクトリ移動の履歴から、pecoのインタラクティブモードでディレクトリ移動の補助をする設定です。
cdrを有効化する
まずはzshの機能である、cdrを有効化しておきます。
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
add-zsh-hook chpwd chpwd_recent_dirs
$ mkdir -p ~/.cache/shell
キーバインドの設定
つぎに、履歴の時と同様、pecoを使ったファンクションを登録して、キーボードにバインドさせます。ここでは、CTRL + K で登録しました。
zstyle ':chpwd:*' recent-dirs-max 500
function peco-cdr-selection {
BUFFER="cd $(cdr -l | awk '{ print $2 }' | peco)"
CURSOR=$#BUFFER
zle clear-screen
}
zle -N peco-cdr-selection
bindkey \^k peco-cdr-selection