![](https://suwaru.tokyo/images/2019/07/search_01-1024x676.jpg)
こんにちは。タクマ™ [@suwaru_blog] です。
Web 開発の仕事をしていてつくづく思うのですが
本人はその「不便さに気づいてすらいない」ことってあると思います。
Linux コマンド履歴の調べ方
![](https://suwaru.tokyo/images/2019/07/pc_02-e1562376059963.png)
あなたは 「Linux コマンドを履歴から実行したい」とき、どうしていますか?
- 十字キーで一個ずつコマンドを遡る?
history
コマンドで番号から探す?⌃ r
で欲しいコマンド名を前方検索する?
これ、実は「不便」な方法です…
⌃ r
で起動する「前方検索」によるコマンド履歴検索から、「インクリメンタルサーチ」によるコマンド履歴検索に進化させる方法を紹介します!
説明では zsh というシェルで peco というライブラリの設定を行います。
当ブログでは zsh インストール方法も紹介しているので、そちらも参考にしてみてください。
peco とは
標準入力 で受け取ったデータに対して、
インクリメンタルサーチをかけて行選択して、
標準出力するライブラリです。
peco について、言葉で説明すると分かりにくいですが…
実際に動かしてみると直感的にわかります。今は難しく考えなくて OK です。
【ゴール】peco を使ったコマンド履歴検索
peco インストール方法
![](https://suwaru.tokyo/images/2019/10/remote_work_02-e1572515423745.png)
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
と覚えておけば大丈夫です。
- なんらかのコマンドの実行結果が peco に渡されます
- peco でその実行結果をインクリメンタルサーチできます
- peco が絞り込んだ検索結果を選択・Enter で標準出力します
- 検索内容は十字キーなどで選択できます
たとえば、以下のように使ってみてください。
# ファイルの中身をインクリメントサーチ。行ごとに絞り込んで出力する
less [ファイル名] | peco
インクリメンタルサーチの抜け方
⌃ c
でインクリメンタルサーチを終了することができます。
peco を利用したコマンドを zsh に定義
![](https://suwaru.tokyo/images/2019/07/pc_03-e1563929119965.png)
コマンドライン上に標準出力されるだけではおいしくないので、
zsh 設定ファイルに「コンボ」を記述していきます。
定義するコマンド一覧
コマンド | 処理 |
---|---|
fc | 現在ディレクトリ以下のディレクトリを絞り込んだ後に移動する |
fe | 現在ディレクトリ以下のファイルを絞り込んだ後に Emacs で開く |
pk | 実行中のプロセスを選択して kill する |
⌃ r | コマンド履歴を絞り込んだあと Enter で実行する |
fe
コマンドは Emacs 使いじゃないとあまりおいしくないかもです。
vim 使いの人は、次の .zshrc
の emacs 部分を vim に書き換えてみてください。
個人的によく使うのは pk
と ⌃ r
ですかね。
~/.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
でコマンド履歴検索できるように定義する
# ⌃ 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 を使っている人はこちら
# ⌃ 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 サイトからお気軽にご相談ください。
カテゴリ「Develop」の最新記事
コメント