notebook

都内でWEB系エンジニアやってます。

pecoを使った便利な設定などのまとめ

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

f:id:swfz:20170125021526g:plain

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

f:id:swfz:20170125021631g:plain

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

f:id:swfz:20170125021723g:plain

履歴のフィルタリング

よくある履歴からフィルタリングするやつです

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
}

f:id:swfz:20170125021755g:plain

aliasをフィルタリング

alias設定したはずだけどなんだっけ?みたいなことが結構発生していたので一覧で出てくれば思い出せるんじゃないか?と思い作ってみました

function aliasp () {
  BUFFER=$(alias | peco --query "$LBUFFER" | awk -F"=" '{print $1}')
  print -z "$BUFFER"
}

f:id:swfz:20170125021812g:plain

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

f:id:swfz:20170125021833g:plain

まとめ

ほとんど関数化したものの実行まではさせずにコマンドラインへ表示するまでにとどめるようにしました、これは間違って実行してしまうのを防ぐため、いったん目視を挟むためですね

コマンドラインの途中までの入力を生かしたかったのでzshのzleを使ってコマンドラインのどこでも呼び出せるようにしました

こうすることで履歴にも残るので個人的には気に入っています