Humanity

Edit the world by your favorite way

Vimのコマンドライン補完がこんなに強力な訳がない

コマンドライン補完は貧弱」
そう思っていた時期が、私にもありました。
コマンドライン補完が貧弱だからomni補完が使えるcmdwin*1があるのだと、そう思っていました。
しかしVimは歴史あるソフトウェア、やはりそんなことはありませんでした...
とかVim Hacksでもないし前口上はいいのでとっとと本題に入ると、
以下のエントリでコマンドライン補完をzshライクにする方法を知りました。

set wildmode=list,full

vimの補完をzshみたいにする - World Wide Wonderful

これでzshライクにできるらしい。
help読んだりした結果、自分は次のが一番気に入った。

set wildmode=longest:full,full

最初にを叩くとまずzshライクな補完(longest:full)をする。
次にを叩くとcmd.exeのような補完(full)をする。

longest:fullとlistの違い

d:id:orangehatさんの設定は「longest:full」の代わりに「list」を使ってました。
これらの違うところは、statuslineに表示させるのではなく

次のように複数行で表示するのが違う。

自分が「longest:full」を選んだのは、statuslineに一貫して表示してくれた方が視線移動が少ないと思ったから。
候補数が多い時一行だけじゃ困るのではないかという点については、
コマンドライン*2とやれば複数行で表示してくれるので困らないと判断した。


あと「longest:full」に限らず「longest」とついてるものは、共通する最長の文字列を自動的に挿入してくれる。
これも混乱するので勝手に挿入されたくない、とかいろいろ好みが分かれるところ。

コマンドライン補完の欠点

LingrによくいるVimmer達が気にしそうなこと。
それは組み込みなこと。ようするにプラグインで拡張できない。
まぁでもこれだけ強力であれば僕は満足です。
というかこれはインサートモードの補完も一緒か。


zshの補完に足りないと言えばcorrect機能とか「/u/l/a/co」で「/usr/local/apache/conf/」とかならないことでしょうか。
僕はパスごとにを押して決定するのであんまりこれ必要になりません。そんなに遠くないし。
correct機能に関してはちょっと欲しいかも。

longest:fullの欠点

あ、今「longest:full」の新たな欠点に気がついた。
UIの問題なんだけど、longest:fullでを押した時、
最初の項目がハイライトされてて選択されてるかのような印象を受ける(上の画像でも分かる通り)。

でもコマンドラインに挿入されてはいないので誤解する。
たとえば「:help c_ctrl-d」と入力した場合、によって次のような状態になる(:helpじゃなく:Helpになってるけど)。

見てわかる通り、このままエンターを押せば「c_CTRL-D@ のような項目はない」と言われる。
これはあと一回分のが足りないためにこうなるわけで、誤解させるUIが悪いと思う。
慣れればコマンドラインのみを見て今は挿入されてないと判断できるのかもしれないけど。

*1::help cmdwin

*2::help c_CTRL-D