1/23 追記
Ressさんがzshプラグインにまとめてくれました。
39e/zsh-completions-anyenv: ZSH Completions for **env
それぞれのプラグインマネージャで
zgen load 39e/zsh-completions-anyenv
zplug "39e/zsh-completions-anyenv"
antigen bundle 39e/zsh-completions-anyenv
するなどして使ってください。
anyenv系のzsh補完が死亡している
自分はRuby・Node・Pythonのバージョン管理に各々の{rb,nod,py}envを使っています。
- rbenv/rbenv: Groom your app’s Ruby environment
- pyenv/pyenv: Simple Python version management
- nodenv/nodenv: Manage multiple NodeJS versions.
が、それぞれのパッケージで提供されているzshの補完ファイルが死亡していたので手元で修正して動くようにしました。
そんなに頻繁に使うコマンドじゃないからサブコマンドを覚えてないし、手癖でTab押すとファイル補完が入って毎回イライラしていたのでいいかげん対応したという感じです。例えば https://github.com/rbenv/rbenv/blob/master/completions/rbenv.zsh を見ると5年間更新されていません。
ちなみにzshのバージョンは5.4.2を使っています。
そんなに頻繁にバージョン変えないしそれぞれの実装がコピペっぽいし同じ死亡の仕方をしていたので同じ修正の仕方をして対応できたのでよかったです。
既存実装は
if [[ ! -o interactive ]]; then
return
fi
compctl -K _rbenv rbenv
_rbenv() {
local words completions
read -cA words
if [ "${#words}" -eq 2 ]; then
completions="$(rbenv commands)"
else
completions="$(rbenv completions ${words[2,-2]})"
fi
reply=("${(ps:\n:)completions}")
}
という感じなのですが、おそらく現在zshの一般的な補完になっている compinit
を使うと compctl
の部分でエラーを吐いて死亡します。(厳密にいうと compinit
を読んだあとに compctl
を使った補完を実行しようとすると死ぬ気がする。)
情報が少なかったのであまりちゃんと調べてられていないのですが、 compctl
は古いから使うなみたいな空気を感じました。
$ rbenv [Tab]
_rbenv:read:2: option valid only in functions called via compctl
Usage: rbenv completions <command> [arg1 arg2...]
のでこれらを compinit
で補完できるコードに書き換えます。
参考
- zshでサブコマンドとファイル名を手抜き補完する - Glide Note
- zsh の補完関数の自作導入編
既存実装の通り各種envには rbenv commands
と rbenv completions
のような便利コマンドが実装されているのでそれを使って雑に補完候補を出す方向でいきます。 fpath
の通ったところに _rbenv
_nodenv
_pyenv
を配置します。
fpath=(~/.zsh/completions $fpath)
#compdef rbenv
_rbenv() {
local -a cmds
if (( CURRENT == 2 )); then
cmds=( $(rbenv commands) )
_describe -t commands "all commands" cmds
else
cmds=( $(rbenv completions ${words[2]}) )
_describe -t commands "sub commands" cmds
fi
}
というような感じで設定します。設定後に rm -f ~/.zcompdump; compinit
するとよいと思います。
その後補完を試してみると
$ rbenv [Tab]
[all commands]
--version completions global hooks install prefix rehash shell uninstall version-file version-file-write version-origin whence
commands exec help init local realpath.dylib root shims version version-file-read version-name versions which
$ rbenv install [Tab]
[sub commands]
--force 1.8.7-p174 1.9.1-p376 1.9.3-p426 2.1.0-rc1 2.3.4 jruby-1.7.10 jruby-9.0.0.0.rc1 rbx-2.10 rbx-3.12 rbx-3.41 rbx-3.70
--help 1.8.7-p22 1.9.1-p378 1.9.3-p429 2.1.1 2.3.5 jruby-1.7.11 jruby-9.0.0.0.rc2 rbx-2.11 rbx-3.13 rbx-3.42 rbx-3.71
--keep 1.8.7-p248 1.9.1-p429 1.9.3-p448 2.1.10 2.3.6 jruby-1.7.12 jruby-9.0.1.0 rbx-2.2.10 rbx-3.14 rbx-3.43 rbx-3.72
--list 1.8.7-p249 1.9.1-p430 1.9.3-p484 2.1.2 2.4.0 jruby-1.7.13 jruby-9.0.3.0 rbx-2.2.2 rbx-3.15 rbx-3.44 rbx-3.73
--patch 1.8.7-p299 1.9.1-p431 1.9.3-p545 2.1.3 2.4.0-dev jruby-1.7.14 jruby-9.0.4.0 rbx-2.2.3 rbx-3.16 rbx-3.45 rbx-3.74
--skip-existing 1.8.7-p301 1.9.1-preview1 1.9.3-p547 2.1.4 2.4.0-preview1 jruby-1.7.15 jruby-9.0.5.0 rbx-2.2.4 rbx-3.17 rbx-3.46 rbx-3.75
--verbose 1.8.7-p302 1.9.1-preview2 1.9.3-p550 2.1.5 2.4.0-preview2 jruby-1.7.16 jruby-9.1.0.0 rbx-2.2.5 rbx-3.18 rbx-3.47 rbx-3.76
--version 1.8.7-p330 1.9.1-rc1 1.9.3-p551 2.1.6 2.4.0-preview3 jruby-1.7.16.1 jruby-9.1.0.0-dev rbx-2.2.6 rbx-3.19 rbx-3.48 rbx-3.77
1.8.5-p113 1.8.7-p334 1.9.1-rc2 1.9.3-preview1 2.1.7 2.4.0-rc1 jruby-1.7.16.2 jruby-9.1.1.0 rbx-2.2.7 rbx-3.2 rbx-3.49 rbx-3.78
1.8.5-p114 1.8.7-p352 1.9.2-p0 1.9.3-rc1 2.1.8 2.4.1 jruby-1.7.17 jruby-9.1.10.0 rbx-2.2.8 rbx-3.20 rbx-3.5 rbx-3.79
1.8.5-p115 1.8.7-p357 1.9.2-p136 2.0.0-dev 2.1.9 2.4.2 jruby-1.7.18 jruby-9.1.11.0 rbx-2.2.9 rbx-3.21 rbx-3.50 rbx-3.8
1.8.5-p231 1.8.7-p358 1.9.2-p180 2.0.0-p0 2.2.0 2.4.3 jruby-1.7.19 jruby-9.1.12.0 rbx-2.3.0 rbx-3.22 rbx-3.51 rbx-3.80
1.8.5-p52 1.8.7-p370 1.9.2-p290 2.0.0-p195 2.2.0-dev 2.5.0 jruby-1.7.2 jruby-9.1.13.0 rbx-2.4.0 rbx-3.23 rbx-3.52 rbx-3.81
1.8.6 1.8.7-p371 1.9.2-p318 2.0.0-p247 2.2.0-preview1 2.5.0-dev jruby-1.7.20 jruby-9.1.14.0 rbx-2.4.1 rbx-3.24 rbx-3.53 rbx-3.82
1.8.6-p110 1.8.7-p373 1.9.2-p320 2.0.0-p353 2.2.0-preview2 2.5.0-preview1 jruby-1.7.20.1 jruby-9.1.15.0 rbx-2.5.0 rbx-3.25 rbx-3.54 rbx-3.83
1.8.6-p111 1.8.7-p374 1.9.2-p326 2.0.0-p451 2.2.0-rc1 2.5.0-rc1 jruby-1.7.21 jruby-9.1.2.0 rbx-2.5.1 rbx-3.26 rbx-3.55 rbx-3.84
1.8.6-p114 1.8.7-p375 1.9.2-p330 2.0.0-p481 2.2.1 2.6.0-dev jruby-1.7.22 jruby-9.1.3.0 rbx-2.5.2 rbx-3.27 rbx-3.56 rbx-3.9
1.8.6-p230 1.8.7-p71 1.9.2-preview1 2.0.0-p576 2.2.2 jruby-1.5.6 jruby-1.7.23 jruby-9.1.4.0 rbx-2.5.3 rbx-3.28 rbx-3.57 ree-1.8.7-2011.03
1.8.6-p286 1.8.7-p72 1.9.2-preview3 2.0.0-p594 2.2.3 jruby-1.6.3 jruby-1.7.24 jruby-9.1.5.0 rbx-2.5.4 rbx-3.29 rbx-3.58 ree-1.8.7-2011.12
1.8.6-p287 1.8.7-preview1 1.9.2-rc1 2.0.0-p598 2.2.4 jruby-1.6.4 jruby-1.7.25 jruby-9.1.6.0 rbx-2.5.5 rbx-3.3 rbx-3.59 ree-1.8.7-2012.01
1.8.6-p36 1.8.7-preview2 1.9.2-rc2 2.0.0-p643 2.2.5 jruby-1.6.5 jruby-1.7.26 jruby-9.1.7.0 rbx-2.5.6 rbx-3.30 rbx-3.6 ree-1.8.7-2012.02
1.8.6-p368 1.8.7-preview3 1.9.3-dev 2.0.0-p645 2.2.6 jruby-1.6.5.1 jruby-1.7.27 jruby-9.1.8.0 rbx-2.5.7 rbx-3.31 rbx-3.60 topaz-dev
1.8.6-p369 1.8.7-preview4 1.9.3-p0 2.0.0-p647 2.2.7 jruby-1.6.6 jruby-1.7.3 jruby-9.1.9.0 rbx-2.5.8 rbx-3.32 rbx-3.61
1.8.6-p383 1.9.0-0 1.9.3-p105 2.0.0-p648 2.2.8 jruby-1.6.7 jruby-1.7.4 jruby-9.2.0.0-dev rbx-2.6 rbx-3.33 rbx-3.62
1.8.6-p388 1.9.0-1 1.9.3-p125 2.0.0-preview1 2.2.9 jruby-1.6.7.2 jruby-1.7.5 maglev-1.0.0 rbx-2.7 rbx-3.34 rbx-3.63
1.8.6-p398 1.9.0-2 1.9.3-p194 2.0.0-preview2 2.3.0 jruby-1.6.8 jruby-1.7.6 maglev-1.1.0-dev rbx-2.71828182 rbx-3.35 rbx-3.64
1.8.6-p399 1.9.0-3 1.9.3-p286 2.0.0-rc1 2.3.0-dev jruby-1.7.0 jruby-1.7.7 maglev-2.0.0-dev rbx-2.8 rbx-3.36 rbx-3.65
1.8.6-p420 1.9.0-4 1.9.3-p327 2.0.0-rc2 2.3.0-preview1 jruby-1.7.0-preview1 jruby-1.7.8 mruby-1.0.0 rbx-2.9 rbx-3.37 rbx-3.66
1.8.7 1.9.0-5 1.9.3-p362 2.1.0 2.3.0-preview2 jruby-1.7.0-preview2 jruby-1.7.9 mruby-1.1.0 rbx-3.0 rbx-3.38 rbx-3.67
1.8.7-p160 1.9.1-p0 1.9.3-p374 2.1.0-dev 2.3.1 jruby-1.7.0-rc1 jruby-9.0.0.0 mruby-1.2.0 rbx-3.1 rbx-3.39 rbx-3.68
1.8.7-p17 1.9.1-p129 1.9.3-p385 2.1.0-preview1 2.3.2 jruby-1.7.0-rc2 jruby-9.0.0.0.pre1 mruby-1.3.0 rbx-3.10 rbx-3.4 rbx-3.69
1.8.7-p173 1.9.1-p243 1.9.3-p392 2.1.0-preview2 2.3.3 jruby-1.7.1 jruby-9.0.0.0.pre2 mruby-dev rbx-3.11 rbx-3.40 rbx-3.7
となりました。
上手く補完できていますね。これで大分快適になりました。
PRを出そうかと思ったのですが動作としては安定しているからかあまり活発ではなさそうなので迷うところです。