サイトロゴ

ターミナル操作をpecoで爆速に!コマンド履歴とディレクトリ移動

著者画像
Toshihiko Arai

はじめに

pecoは、シンプルでインタラクティブなフィルタリングツールです。標準入力からテキストを受け取り、リアルタイムでフィルタリング条件を入力することで、目的のテキスト行を素早く見つけ出すことができます。コマンドラインでの作業効率を大きく向上させることができる便利なツールです。 https://github.com/peco/peco

開発環境

項目 バージョン
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
ubuntu sudo apt install peco

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                                                                                       ...          
  1. QUERYで検索し候補を絞り込む
  2. 上下キーでコマンドを選択
  3. プロンプトにコマンドが入力される

と、このようにpeco導入後は、コマンド履歴検索が格段につかいやすくなりました。これなら頻繁に利用したいと思えます。

ところで履歴保存はデフォルトで1000件です。pecoの利便性を活かすためにも、10000件まで登録できるように設定することにしました。以下を追記します。

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000

HISTSIZE はメモリ内で保持する履歴の件数で、SAVEHIST は履歴ファイル(通常は ~/.zsh_history)に保存される履歴の件数です。

bashの場合

bashの場合は、以下のように設定します。

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
}

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

cdrでエラーが出る場合は、下記のディレクトリを作っておくと対処できるかもしれません。

$ 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

cdrをはじめたばかりなので、まだ移動履歴少なく活用できてませんが、今後履歴が増えるたびにpeco機能が便利になるに違いありません。

関連記事