読者です 読者をやめる 読者になる 読者になる

Vim で PowerShell のコマンドレットを補完する poshcomplete-vim を作ってみた

この記事は Vim Advent Calendar 2013 71日目の記事です。

PowerShell 使い、かつ、Vimmer という人が、相当少なそうなので、 誰得ですが(と思ったら 70日目の記事PowerShell 関連なので、意外と居る??)、 PowerShell スクリプトVim で書いていたときに、捗らない感じだなあと思ったので作ってみました。

cd01/poshcomplete-vim

そもそも PowerShell って何なんです?

Vimmer で馴染みのある方が少なそうなので、簡単に説明しておきます。
PowerShellWindows に入っているシェルです。 細かい説明がほしい人には、ググってもらうとして、 個人的に下記の利点があるかなと思って、結構多用しています。

  • Windows7 以降ならデフォルトでインストールされている
    • サーバ・共用PCで自由にソフトをインストールできないときでも使える
  • オブジェクトで返ってくるので、パイプラインでつないだ後の処理とかがラク
  • .NET が使える
    • MingW とかで、がんばるよりも使える資源が豊富
  • 電卓として

使い方

  1. vimfiles に置く。もしくは、 NeoBundle cd01/poshcomplete-vim とかしてインストール
  2. _vimrcautocmd FileType ps1 :setl omnifunc=poshcomplete#CompleteCommand
  3. 補完したいところで、おもむろに <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 への愛着が増して便利ですね。

追記

特に注があるものを除いて、このサイトの内容物は Creative Commons Licence 表示 - 非営利 - 継承 2.1 のもとでライセンスされています。

© 2015 cd01