LoginSignup
6
2

More than 5 years have passed since last update.

LL言語の各種envのzsh補完関数が死亡していたので修正した

Last updated at Posted at 2018-01-01

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 commandsrbenv completions のような便利コマンドが実装されているのでそれを使って雑に補完候補を出す方向でいきます。 fpath の通ったところに _rbenv _nodenv _pyenv を配置します。

.zshrc
fpath=(~/.zsh/completions $fpath)
~/.zsh/completions/_rbenv
#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を出そうかと思ったのですが動作としては安定しているからかあまり活発ではなさそうなので迷うところです。

6
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2