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 への愛着が増して便利ですね。

追記

Windows に Chocolatey で Kaoriya Vim をインストールしてみる

Chocolatey のおかげで、Windows でもパッケージ管理ができて便利ですね。
ですが、Chocolatey のパッケージにないものもあり、一元管理できないのは若干面倒です。

そこで、試しに、Kaoriya Vim のパッケージを作ってインストールしてみました。

cd01/Chocolatey-KaoriyaVim
https://github.com/cd01/Chocolatey-KaoriyaVim

と言っても、設定用のXMLファイルを記述して、 chocolateyInstall.ps1 の中にインストールする処理を書くだけです。
しかも、インストールする処理も、ZIPファイルをダウンロードしてきて解凍してくれるコマンドが用意されているので、それに引数を与えるだけでした。
インストール後にPATHの通っているディレクトリにexeファイルのパスが書かれたバッチファイルを置いてくれたり、32bit と 64bit で別々にURLが指定できたりと、いろいろと便利な感じでした。

設定ファイルを作成後は、 chocolatey package コマンドを実行して、パッケージを作成し、その後、 cinst KaoriyaVim -source C:\path\to\Chocolatey-KaoriyaVim としてやればインストールできました。

本当は、GitHubに置いてあるファイルとかから、インストールできるといいなあと思ってたのですが( cinst KaoriyaVim -source https://github.com/cd01/Chocolatey-KaoriyaVim/raw/master/KaoriyaVim.7.4.nupkg みたいな感じ)、よく分からず、体力の限界なので、ここで止めておきます。

まあ、Chocolatey の大元の方に、作ったパッケージファイルをアップロードすれば、いいんでしょうが、なんかいろいろ面倒くさそうなので。まず、アカウントを作るところから面倒くさい。

あと、ローカルに置いたファイルからインストールできると、会社で社内向けツールをインストールするときに使うと便利かもと思いました。

see also

Vim ステッカーを買ったお話

怠慢

Vimステッカーを作ったお話 - Self Reference を読んで、 僕も PC に Vim ステッカーを貼っている 変態 人になりたい!と思いました。
そこでマネをしてステッカーを作ろうと思いましたが、データの入稿のやり方を 読んでいるあたりで、面倒くさくて挫折してしまいました。
僕にはレベルが高すぎます。
そして、「誰か作って売ってくれないかなー」と、思いました。

誰か = UnixSTickers

困ったときには Google 先生の出番と思いましたが、ここ1年くらいで、 「公式のページを見ろ」とか、 「:h hogehoge しろ」とか、
さんざんモヒカンの皆さんに教えていただいてきた気がするので、 まず http://www.vim.org/ を見てみると、 それらしきページ を発見しました!!
UnixSTickers で他の Unix 関連のステッカーと 共に売られているようです。
(最近、 Emacs のステッカーもラインナップに加わったようです。)

ポチる

UnixSTickersPaypal で支払いができるようでしたので、 その場で早速ポチりました。
注文したらあとはわくわくしながらステッカーの到着を待つだけ!

ステッカー キタ━━━━(゚∀゚)━━━━!!

f:id:cd01:20130419184523j:plain

f:id:cd01:20130419184635j:plain

会社の同僚に見せたかったのですが、見てくれそうな会社の同僚とか僕にはいませんでした!(泣)

送料も追跡なしだと、 2.99$ で結構安いし、みなさんも買ってみるとよいと思います!

おまけ

Vim 以外のステッカーもほしいと思って、ついでに入手してみました。

f:id:cd01:20130419184744j:plain

追記

UnixStickersでステッカー購入後、メールで、Emacsとか、Xfceとか、10種類くらい増やしたよ!というメールが来たので、まだこれからも種類が増えるのかなあと思います。
このエントリをブクマしてくれた人がステッカーを買って、種類が増えたりするといいなーとか思いました。

関連リンク

Vim ステッカーを結局作ったお話 - CD01_

PHP で zencoding-vim を使うと "$"が "1" に変わるのを防ぐ方法を教えてもらった

PHPzencoding-vim を使うと、 $1 に変わってしまって、毎回修正するのが面倒だなあと思って、なんとなく Twitter に書いたら、 mattn さんに教えてもらえました!

~/.vimrc に下記のように書くと、 $1 に変換されず、 PHP での Zencoding が捗ります!!

let g:user_zen_settings = { \ 'php' : { \ 'dollar_expr' : 0, \ }, \}

Gvimでフォントの表示が欠けないようにする方法

f:id:cd01:20130112111734p:plain

以前から、Vimを使っていて、Rictyの全角スペースを見るたびにフォントが欠けているなあと思いつつも、特に気にせずに使っていましたが、

"フォントは小数点以下の誤差が蓄積するんだと思われます。1.5ptの倍数だとその誤差が生じない。"

DirectWriteで描画したい · Issue #262 · vim-jp/issues
https://github.com/vim-jp/issues/issues/262#issuecomment-12171275

とのことで、フォントのサイズを1.5の倍数にしたら、欠けなくなりました。
今まで、13ptで使用していたので、13.5ptにしてみました。
WindowsGvimでしか試していないので、他の環境でもそうなのかは知りません。

" ~/.gvimrc set guifont=Ricty_Diminished_Discord_for_Po:h13.5 set guifontwide=Ricty_Diminished_Discord:h13.5

追記

  • 多分、ディスプレイのDPIと、OS側のDPIの兼ね合いで数値は変わる

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

© 2015 cd01