history不要!pecoでLinuxコマンド履歴を爆速で検索

  • このエントリーをはてなブックマークに追加
  • Pocket

こんにちは。タクマ™ [@suwaru_blog] です。

Web 開発の仕事をしていてつくづく思うのですが

実は「不便」な行動をしているのに、それが当たり前になっているので、
本人はその「不便さに気づいてすらいない」ことってあると思います。

Linux コマンド履歴の調べ方

あなたは 「Linux コマンドを履歴から実行したい」とき、どうしていますか?

  • 十字キーで一個ずつコマンドを遡る?
  • history コマンドで番号から探す?
  • ⌃ r で欲しいコマンド名を前方検索する?

これ、実は「不便」な方法です…

今回はシェルの ⌃ r で起動する「前方検索」によるコマンド履歴検索から、
「インクリメンタルサーチ」によるコマンド履歴検索に進化させる方法を紹介します!

説明では zsh というシェルで peco というライブラリの設定を行います。
当ブログでは zsh インストール方法も紹介しているので、そちらも参考にしてみてください。

peco とは

標準入力 で受け取ったデータに対して、
インクリメンタルサーチをかけて行選択して、
標準出力するライブラリです。

peco について、言葉で説明すると分かりにくいですが…
実際に動かしてみると直感的にわかります。今は難しく考えなくて OK です。

【ゴール】peco を使ったコマンド履歴検索

⌃ r で peco が起動します。コマンド履歴が表示されます
1文字打つごとに履歴候補が絞られます

peco インストール方法

Mac 環境

Homebrew を使うと簡単に peco をインストールできます。

brew install peco

Linux 環境

ここから peco linux 版の最新バージョンの URL を確認しておいてください。

# 確認した URL から peco をダウンロードする
sudo wget https://github.com/peco/peco/releases/download/v0.5.3/peco_linux_386.tar.gz
sudo tar xzvf peco_linux_386.tar.gz
sudo rm peco_linux_386.tar.gz
cd peco_linux_386
sudo chmod +x peco

# PATH が通っているところにファイルをコピー
sudo cp peco /usr/local/bin
cd ..
sudo rm -r peco_linux_386/

peco の基本的な使い方

[なんらかのコマンド] | peco と覚えておけば大丈夫です。

  1. なんらかのコマンドの実行結果が peco に渡されます
  2. peco でその実行結果をインクリメンタルサーチできます
  3. peco が絞り込んだ検索結果を選択・Enter で標準出力します
    • 検索内容は十字キーなどで選択できます

たとえば、以下のように使ってみてください。

# ファイルの中身をインクリメントサーチ。行ごとに絞り込んで出力する
less [ファイル名] | peco

インクリメンタルサーチの抜け方

⌃ c でインクリメンタルサーチを終了することができます。

peco を利用したコマンドを zsh に定義

コマンドライン上に標準出力されるだけではおいしくないので、
zsh 設定ファイルに「コンボ」を記述していきます。

定義するコマンド一覧

コマンド処理
fc現在ディレクトリ以下のディレクトリを絞り込んだ後に移動する
fe現在ディレクトリ以下のファイルを絞り込んだ後に Emacs で開く
pk実行中のプロセスを選択して kill する
⌃ rコマンド履歴を絞り込んだあと Enter で実行する

fe コマンドは Emacs 使いじゃないとあまりおいしくないかもです。
vim 使いの人は、次の .zshrc の emacs 部分を vim に書き換えてみてください。

個人的によく使うのは pk⌃ r ですかね。

~/.zshrc

~/.zshrc
# fc コマンドでカレントディレクトリ以下のディレクトリを絞り込んだ後に移動する
function find_cd() {
    cd "$(find . -type d | peco)"
}
alias fc="find_cd"

# fe コマンドでカレントディレクトリ以下のファイルを絞り込んだ後に emacs で開く
function find_emacs() {
    emacs "$(find . -type f | peco)"
}
alias fe="find_emacs"

# pk で実行中のプロセスを選択して kill
function peco-pkill() {
  for pid in `ps aux | peco | awk '{ print $2 }'`
  do
    kill $pid
    echo "Killed ${pid}"
  done
}
alias pk="peco-pkill"

⌃ r でコマンド履歴検索できるように定義する

~/.zshrc
# ⌃ r で peco で history 検索
function peco-history-selection() {
    BUFFER=`history -n 1 | tail -r  | awk '!a[$0]++' | peco`
    CURSOR=$#BUFFER
    zle reset-prompt
}

zle -N peco-history-selection
bindkey '^R' peco-history-selection

しかし oh-my-zsh だと設定エラーになるので、次の設定を使ってください。

oh-my-zsh を使っている人はこちら
~/.zshrc
# ⌃ r で peco で history 検索
function peco-history-selection() {
    local tac
    if which tac > /dev/null; then
        tac="tac"
    else
        tac="tail -r"
    fi

    BUFFER=$(\history -n 1 | \
        eval $tac | \
        peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle clear-screen
}
zle -N peco-history-selection
bindkey '^r' peco-history-selection

関連記事

zsh ロードマップ

お仕事ください!

僕が代表を務める 株式会社 EeeeG では Web 制作・システム開発・マーケティング相談を行っています。
なにかお困りごとがあれば、Twitter DM や Web サイトからお気軽にご相談ください。

コメント

コメントを残す

*