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 への愛着が増して便利ですね。
追記
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
- chocolatey で Haskell Platform 用のパッケージを作る - apatheia.info http://apatheia.info/blog/2013/02/08/create-chocolatey-package/
- CreatePackages · chocolatey/chocolatey Wiki https://github.com/chocolatey/chocolatey/wiki/CreatePackages
- Apt Windows: Let’s Get Chocolatey! Part 2 : Multiple Installs and Package Creation - .NET tutorial - developer Fusion http://www.developerfusion.com/article/145913/apt-windows-lets-get-chocolatey-part-2-multiple-installs-and-package-creation/
Vim ステッカーを買ったお話
怠慢
Vimステッカーを作ったお話 - Self Reference を読んで、
僕も PC に Vim ステッカーを貼っている 変態 人になりたい!と思いました。
そこでマネをしてステッカーを作ろうと思いましたが、データの入稿のやり方を
読んでいるあたりで、面倒くさくて挫折してしまいました。
僕にはレベルが高すぎます。
そして、「誰か作って売ってくれないかなー」と、思いました。
誰か = UnixSTickers
困ったときには Google 先生の出番と思いましたが、ここ1年くらいで、
「公式のページを見ろ」とか、 「:h hogehoge しろ」とか、
さんざんモヒカンの皆さんに教えていただいてきた気がするので、
まず http://www.vim.org/ を見てみると、
それらしきページ を発見しました!!
UnixSTickers で他の Unix 関連のステッカーと
共に売られているようです。
(最近、 Emacs のステッカーもラインナップに加わったようです。)
ポチる
UnixSTickers は Paypal で支払いができるようでしたので、
その場で早速ポチりました。
注文したらあとはわくわくしながらステッカーの到着を待つだけ!
ステッカー キタ━━━━(゚∀゚)━━━━!!
会社の同僚に見せたかったのですが、見てくれそうな会社の同僚とか僕にはいませんでした!(泣)
送料も追跡なしだと、 2.99$ で結構安いし、みなさんも買ってみるとよいと思います!
おまけ
Vim 以外のステッカーもほしいと思って、ついでに入手してみました。
- Tumblr
- tumblr 社から tumblr ステッカーを貰う(前編) - ltcmdr927osterous
http://ltcmdr927.posterous.com/tumblr-tumblr
- tumblr 社から tumblr ステッカーを貰う(前編) - ltcmdr927osterous
- Github
- github:shop http://shop.github.com/
追記
UnixStickersでステッカー購入後、メールで、Emacsとか、Xfceとか、10種類くらい増やしたよ!というメールが来たので、まだこれからも種類が増えるのかなあと思います。
このエントリをブクマしてくれた人がステッカーを買って、種類が増えたりするといいなーとか思いました。
関連リンク
PHP で zencoding-vim を使うと "$"が "1" に変わるのを防ぐ方法を教えてもらった
PHPで zencoding-vim を使うと、 $
が 1
に変わってしまって、毎回修正するのが面倒だなあと思って、なんとなく Twitter
に書いたら、 mattn
さんに教えてもらえました!
@cd01_ オプションでphpだけ無効に出来ます。dollar_expr というキーになります。
— mattnさん (@mattn_jp) 11月 28, 2012
~/.vimrc
に下記のように書くと、 $
が 1
に変換されず、 PHP
での Zencoding
が捗ります!!
let g:user_zen_settings = {
\ 'php' : {
\ 'dollar_expr' : 0,
\ },
\}
Gvimでフォントの表示が欠けないようにする方法
以前から、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にしてみました。
WindowsのGvimでしか試していないので、他の環境でもそうなのかは知りません。
" ~/.gvimrc
set guifont=Ricty_Diminished_Discord_for_Po:h13.5
set guifontwide=Ricty_Diminished_Discord:h13.5
追記
- 多分、ディスプレイのDPIと、OS側のDPIの兼ね合いで数値は変わる
- 作者: DrewNeil,新丈径
- 出版社/メーカー: KADOKAWA / アスキー・メディアワークス
- 発売日: 2014/01/28
- メディア: Kindle版
- この商品を含むブログ (3件) を見る