Vim で PowerShell のコマンドレットを補完する poshcomplete-vim を作ってみた
この記事は Vim Advent Calendar 2013 71日目の記事です。
PowerShell 使い、かつ、Vimmer という人が、相当少なそうなので、 誰得ですが(と思ったら 70日目の記事 も PowerShell 関連なので、意外と居る??)、 PowerShell スクリプトを Vim で書いていたときに、捗らない感じだなあと思ったので作ってみました。
そもそも PowerShell って何なんです?
Vimmer で馴染みのある方が少なそうなので、簡単に説明しておきます。
PowerShell は Windows に入っているシェルです。
細かい説明がほしい人には、ググってもらうとして、
個人的に下記の利点があるかなと思って、結構多用しています。
- Windows7 以降ならデフォルトでインストールされている
- サーバ・共用PCで自由にソフトをインストールできないときでも使える
- オブジェクトで返ってくるので、パイプラインでつないだ後の処理とかがラク
- .NET が使える
- MingW とかで、がんばるよりも使える資源が豊富
- 電卓として
使い方
vimfiles
に置く。もしくは、NeoBundle cd01/poshcomplete-vim
とかしてインストール_vimrc
にautocmd FileType ps1 :setl omnifunc=poshcomplete#CompleteCommand
- 補完したいところで、おもむろに
<C-X><C-O>
して便利
作った理由
PowerShell のコマンドレットは、 動詞-名詞
のような構成になっていて(例えば、Get-Content とか)、
まず、Unix 系のコマンド等と比べて長いです。
また、一度書いたコマンドレットを再度書こうと思った場合に、 <C-p>
で補完しようと思っても、
ハイフンで区切られているため、動詞だけ、もしくは、名詞だけしか補完されません。
なので、PowerShell の補完プラギンは必要だなと。
また、PowerShell のシンタックスハイライト用のプラギン はあるのに、 補完プラギンがないのは、なんでもあるのではないかと思えるほどの豊富なプラギンがある Vim らしからぬことなのではないかと思ったので。
プラグインの構成
参考にするために見てみた Vim での補完プラグインは、 vim script で、どの補完候補を出せばよいのかを選択する処理を
がんばっているものが多いですが、 poshcomplete-vim は、 .NET の System.Management.Automation クラスにある
CommandCompletion メソッドで補完候補を取得しているので、候補の精度が良いです。(というか、自分では、ほとんど何もしていない
また、おそらく速度面でも vim script でがんばるよりかは速いです(比較はしていない
jedi-vim と似たような構成になるのかと思います。
vim.org にも上げてみた
今回で Vim プラギンを作成したのは2回目です。 前回の はネタプラギンで、役に立たなさそうだったからやらなかったけど、 vim.org にプラギンを上げてみたいなと思っていたので、今回のなら上げてみてもいいかな と思って、上げてみた。
poshcomplete-vim - Omni Completion for PowerShell : vim online
作ってみて気になったところ
- PowerShell スクリプトで、
.NET
のメソッドを呼んで、コンソールに出力してから、 vim script で eval しているので、ちょっと遅い。- 補完候補が、ある程度絞れるところまで打ってから補完すれば、そんなに気にならないので現状放置
- 速度が気になりだしたら、
if_lua
,if_python
などを検討する。
- 補完した時に、タスクバーにコマンドプロンプトのやつが出てちょっと気になる。
おわりに
Vim のオムニ補完が、どんな感じで動いているのか、全く知りませんでしたが、
今回プラグインを作ってみて、 omnifunc に、どんな関数を設定すれば良いかが分かって、
少し、いや、なんとなくの雰囲気は、わかったような気がします。
Vim のことを、より知ることができたかと思うと、 Vim への愛着が増して便利ですね。