pecoを使って色々フィルタリングして便利なターミナル生活を過ごすためのメモ
調べればたくさん出てくるのであえてまとめる必要もないかもしれないけど、ある程度自分が使うように微修正したりしたのでまとめて残してみます
gitのブランチをフィルタリング
ブランチを切り替える際にいちいち入力するのが面倒、ということでブランチのリストから引っ張ってこれるようにしました
汎用的に使えるようにzshのキーバインドC-g,bでフィルタリングして、結果をコマンドラインに表示するようにしてます
エンターキーはあえてコマンドの中には入れてません、一応間違ってエンターおしてしまったとかそういうのを防ぐため
function peco-git-branch () {
local current_buffer=$BUFFER
local selected_branch_name="$(git branch -a | peco | tr -d ' ' | tr -d '*')"
case "$selected_branch_name" in
*-\>* )
selected_branch_name="$(echo ${selected_branch_name} | perl -ne 's/^.*->(.*?)\/(.*)$/\2/;print')";;
remotes* )
selected_branch_name="$(echo ${selected_branch_name} | perl -ne 's/^.*?remotes\/(.*?)\/(.*)$/\2/;print')";;
esac
if [ -n "$selected_branch_name" ]; then
BUFFER="${current_buffer}${selected_branch_name}"
# カーソル位置を末尾に移動
CURSOR=$#BUFFER
fi
}
zle -N peco-git-branch
bindkey '^gb' peco-git-branch

gitのコミットハッシュをフィルタリング
レビューとかでコミットハッシュを取得したい時などに使います
こちらも汎用的に使えるようにzshのキーバインドで起動できるようにしてますC-g,C-h
function peco-git-hash () {
local current_buffer=$BUFFER
local git_hash="$(git log --oneline --branches | peco | awk '{print $1}')"
BUFFER="${current_buffer}${git_hash}"
# カーソル位置を末尾に移動
CURSOR=$#BUFFER
}
zle -N peco-git-hash
bindkey '^gh' peco-git-hash

stashのIDを取得
stashのIDをいちいち入力するのも記号があったりして面倒なのでこちらも内容を見ながらフィルタリングできるようにしました。
function peco-git-stash () {
local current_buffer=$BUFFER
local stash="$(git stash list | peco | awk -F'[ :]' '{print $1}')"
BUFFER="${current_buffer}${stash}"
# カーソル位置を末尾に移動
CURSOR=$#BUFFER
}
zle -N peco-git-stash
bindkey '^gs' peco-git-stash

履歴のフィルタリング
よくある履歴からフィルタリングするやつです
function peco-select-history() {
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-select-history
bindkey '^r' peco-select-history
cheatsheetをフィルタリング
cheatというツールを結構使っていてたまにしか使わないコマンドだったりをメモがわりに残して置くことが多いのですが残したものをそのまま実行できたら楽だな、と思って組み合わせてみました
cheatsheetのコメントで何をするコマンドか明記することで思い出しつつコマンドを選択して実行することができるようにしました
実際に使う際に微妙に変えたいみたいな部分があったりしてあまり使う機会はないのですが。。。
function csp () {
unset CHEATCOLORS
BUFFER=$( cheat $1 | grep -v '^#' | peco --query "$LBUFFER" )
print -z "$BUFFER"
export CHEATCOLORS=true
}

aliasをフィルタリング
alias設定したはずだけどなんだっけ?みたいなことが結構発生していたので一覧で出てくれば思い出せるんじゃないか?と思い作ってみました
function aliasp () {
BUFFER=$(alias | peco --query "$LBUFFER" | awk -F"=" '{print $1}')
print -z "$BUFFER"
}

aws cliの結果をフィルタリングしてsshする
オートスケールなどでsshconfigを設定できない場合など、動的に決まるIPに対してsshしたい場合などのためにコマンドを書きました
aws-cli を使ってインスタンスリスト(PrivateIP,Tag)を1行にしてpecoに食わせsshに繋げる
こちらは業務で書いたのを抜粋したのでちょっと削ったりしてます。あれですがまぁ動くでしょう...
これは結構便利でよく使う
function ssh-peco(){
ip=$( aws ec2 describe-instances | jq -cr '.Reservations[].Instances[]|[.PrivateIpAddress,.Tags[].Value]' | peco --query "$BUFFER" | awk -F"[\"]" '{print $2}' )
ssh ${ip}
}
psからプロセスIDを取得する
これはよくあるプロセスをkillしたい時などにpecoからプロセスIDを取得するようにした感じです
C-g,pでフィルタリングして選択するという感じにしてます
function peco-ps () {
local current_buffer=$BUFFER
local process_id="$(ps auxf | peco | awk '{print $2}')"
BUFFER="${current_buffer}${process_id}"
# カーソル位置を末尾に移動
CURSOR=$#BUFFER
}
zle -N peco-ps
bindkey '^gp' peco-ps

まとめ
ほとんど関数化したものの実行まではさせずにコマンドラインへ表示するまでにとどめるようにしました、これは間違って実行してしまうのを防ぐため、いったん目視を挟むためですね
コマンドラインの途中までの入力を生かしたかったのでzshのzleを使ってコマンドラインのどこでも呼び出せるようにしました
こうすることで履歴にも残るので個人的には気に入っています