基本、デモをしながらやっていきます。
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}'
Choosed: ruby-build/
- 管理している対象がたくさんある場合
- 頻繁に絞り込んで一つを見つけ出したい場合
- 標準入力から受け取って、別のプログラムに標準出力で渡せる場合
function hi () {
echo -n Hello
}
zle -N hi
# '^[' はエスケープシーケンス
bindkey '^[;^[h' hi- ✅ メタキーとしてOptionを使用
$ . ./example.zsh
$ # <- Hit Meta-; Meta-hfunction 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## 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の標準入力に食わせる
$()で選んだものを取得して後ろの方で加工すると良い (※ワンライナーでシェルの文字列にしてそのまま食わせる派閥もある。お好みで)
# ワンライナーで全てをやっていく例... しかしsshだとptyの問題で大変かも。ptyの話は宿題。
curl -s http://localhost:18500/v1/catalog/nodes | jq -r '.[].Node' | sed 's/$/.myproject/g' | peco | sed 's/^/ssh /g' | bash


