pecoって快適ターミナル生活
インタラクティブにフィルタリングしてくれるgolang製のpecoというツールが
大変便利だったのでシェアしたいと思います。
記事を探してると2年前くらいに話題なったそうです。
pecoにデジャブを感じたのはおそらく当時その話題を見たからだと思います。
pecoのインストール
さくっとpecoをインストールします。
$ brew install peco
goのランタイムがあればgo get github.com/peco/peco
でもOKですが、公式でもstableであるbrewからのインストールを推奨しています。
試しにフィルタリングしてみましょう。
小さい機能を合成して大きな機能を実現するUnixの思想が踏襲されているのでパイプでつなげることができます。
$ ps -ef | peco
実行するとpecoのインタラクティブUIに変わりました。
ファジー検索なので適当にタイプすると徐々に絞り込まれていきます。
zshに変更する
ここからより便利にpecoるためにzshにしたいと思います。
なぜzshにしたいかというとautocomplite機能があることとグローバルエイリアスの設定できるのが理由です。
bashになっているのでzshに変更します。
現在のシェルの確認
$ echo $SHELL
# デフォルトシェルの変更
$ chsh -s /bin/zsh
ログインし直しzshに変更されていればOKです。
このままでは味気ないので.zshrc
を設定してあげればOKです。
oh-my-zshという集合知みたいなツールもあるのでこれを入れてもOKだと思います。
僕は自分で色々設定するのがめんどうだったのでこれ入れてます。
ghqとpecoのコンビネーション
ghqとはGit/Mercurialリポジトリの管理ツールです。ghq get [リポジトリ名]
で指定したパスへクローンし、統一的に管理することができます。
brewで入れたあと、git config --global ghq.root $GOPATH/src
で統一的に管理するパスの設定をしておきます。
使い方はgo getと似ていて、柔軟な形でクローンすることができます。
# こんな形でも
ghq get [email protected]:motemen/ghq.git
# こんな形でも
ghq get https://github.com/motemen/ghq
機能としては小さいですがpecoと組み合わせると絶大な効果を発揮します。
以下の関数を追加してリポジトリ移動を便利にしてみます。
# リポジトリ移動
function peco-src() {
local selected_dir=$(ghq list | peco --query "$LBUFFER")
if [ -n "$selected_dir" ]; then
BUFFER="cd ${GOPATH}/src/${selected_dir}"
zle accept-line
fi
zle redisplay
}
zle -N peco-src
stty -ixon
bindkey '^s' peco-src
ctrl+s
でインタラクティブUIに変わりリポジトリを選択すると移動することができます。
他にも便利にする関数を追加すると幸せになるかもしれません。
履歴検索
ctrl+r
# 履歴検索
function peco-select-history() {
BUFFER=$(fc -l -r -n 1 | peco --query "$LBUFFER")
CURSOR=$#BUFFER
zle redisplay
}
zle -N peco-select-history
bindkey '^r' peco-select-history
ファイル検索
ctrl+z
# ファイル検索
function peco-path() {
local filepath="$(find . | grep -v '/\.' | peco --prompt 'PATH>')"
[ -z "$filepath" ] && return
if [ -n "$LBUFFER" ]; then
BUFFER="$LBUFFER$filepath"
else
if [ -d "$filepath" ]; then
BUFFER="cd $filepath"
elif [ -f "$filepath" ]; then
BUFFER="$EDITOR $filepath"
fi
fi
CURSOR=$#BUFFER
}
zle -N peco-path
bindkey '^z' peco-path
プロセスkill
ctrl+k
# プロセスkill
function peco-kill-process () {
ps -ef | peco | awk '{ print $2 }' | xargs kill
zle clear-screen
}
zle -N peco-kill-process
bindkey '^k' peco-kill-process
まとめ
ターミナル生活が楽しくなりそうですね。
勉強用にpecoのRust実装でもしてみたいです。