Instantly share code, notes, and snippets.

Embed
What would you like to do?
社内勉強会「シェル大活用講座」

peco だよ〜

基本、デモをしながらやっていきます。

peco っち何?

Simplistic interactive filtering tool

即試す

$ brew install peco
$ peco --version
peco version v0.5.3 (built with go1.10)
ls /usr/local/Cellar/ | peco | awk '{print "Choosed:", $0}'

2018-08-24 15 02 17

Choosed: ruby-build/

peco に向いている仕事

  • 管理している対象がたくさんある場合
    • 頻繁に絞り込んで一つを見つけ出したい場合
  • 標準入力から受け取って、別のプログラムに標準出力で渡せる場合

サンプル

事前説明: zsh のキーボードショートカット

function hi () {
    echo -n Hello
}

zle -N hi
# '^[' はエスケープシーケンス
bindkey '^[;^[h' hi

2018-08-24 18 30 14

  • メタキーとしてOptionを使用
$ . ./example.zsh
$ # <- Hit Meta-; Meta-h

ghq管理のリポジトリを絞り込んで飛ぶ

function peco-ghq-go () {
    local selected_dir=$(ghq list -p | peco)
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-ghq-go
bindkey '^[;g' peco-ghq-go

2018-08-24 18 31 21

Consul のノードカタログからssh先を絞り込んで入る

## staging-orchestrator-1.myproject はConsulのサーバモードのノード
$ ssh -L 18500:localhost:8500 staging-orchestrator-1.myproject

## 別ターミナルからAPIを叩く
$ curl -s http://localhost:18500/v1/catalog/nodes | jq -r '.[].Node'                        
staging-api-1
staging-api-2
staging-api-3
staging-app-1
staging-app-2
staging-app-3
staging-appcache-1
staging-appcache-2
...

$ curl -s http://localhost:18500/v1/catalog/nodes | jq -r '.[].Node' | sed 's/$/.myproject/g'
staging-api-1.myproject
staging-api-2.myproject
staging-api-3.myproject
staging-app-1.myproject
staging-app-2.myproject
staging-app-3.myproject
staging-appcache-1.myproject
staging-appcache-2.myproject

この状態前提で関数を書く

function peco-myproject-login() {
    local node=$(curl -s http://localhost:18500/v1/catalog/nodes | jq -r '.[].Node' | sed 's/$/.myproject/g' | peco)
    if [ -n "$node" ]; then
        BUFFER="ssh ${node}"
        zle accept-line
    fi
    # zle clear-screen お好みで
}
zle -N peco-myproject-login
bindkey '^[;^[m' peco-myproject-login

スッと選んだノードに入るデモをする。

まとめ: pecoを便利に使うには

  • 管理しているものを縦に並べる
  • pecoの標準入力に食わせる
  • $() で選んだものを取得して後ろの方で加工すると良い (※ワンライナーでシェルの文字列にしてそのまま食わせる派閥もある。お好みで)
# ワンライナーで全てをやっていく例... しかしsshだとptyの問題で大変かも。ptyの話は宿題。
curl -s http://localhost:18500/v1/catalog/nodes | jq -r '.[].Node' | sed 's/$/.myproject/g' | peco | sed 's/^/ssh /g' | bash
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment