poshcomplete-vim の補完方法とかいろいろ変更した

いろいろ変更して自分でも、よく分からなくなりそうなので備忘録的に書く

cd01/poshcomplete-vim

screencast

ローカルサーバ立てるようにした

最初に作ったときは、PowerShellスクリプトで補完候補を標準出力して、 その結果から補完していたけど、それだと、補完候補を更新するたびに、 PowerShell が起動するので遅かった。
OmniSharp を見てみると、Nancy という .NETSinatra ライクなフレームワーク を使ってローカルサーバを立てて、そこから補完候補を取得するようになってた ので、ローカルサーバに POST して、補完候補を JSON で取得するようにしたら、 かなり速度が改善した。

いちいちローカルサーバを立てるのが面倒だけど、 call poshcomplete#StartServer() を呼び出すと、バックグラウンドで実行し続けるようにできた(要 vimproc)ので、 面倒なので、タスクスケジューラで vim.exe -c "set ft=ps1 | call poshcomplete#StartServer() | q" とか起動してると面倒くさくないから、とりあえずそうしてみている。
常に起動していても、30MB くらいしかメモリ食わないので、 Chrome とかインストールしてると起動してなくても、なんかメモリ食いまくってたりするので、 30MB くらいなら、まあいいかという感じ。

自動でローカルサーバを起動するようにすると、思ったよりイベントが発生してたりして、 今度は起動がモッサリしてウザかったので、自分で起動するようにしてる。

補完できるものが増えた

@sgur さんが、いろいろ試してくれていて、そういったものをいくつか取り込ませてもらった。
その中で、 CommandCompletion.MapStringInputToParsedInput というのがあって、これを使うようにしたので、 以前は、コマンドレットとオプションくらいしか補完できなかったので、 定義済みの変数とか、オブジェクトの持っているメソッドとかも補完できるようになった。

AppVeyor

AppVeyor で CI を回すようにした。
Vim プラグインのテストを AppVeyor 上で動かすのに困っていたけど、thinca さんの themis.vim のおかげで、できるようになった。
ついで、ビルドしたものとかをまとめて ZIP ファイルにすることもできるようになったので、 とりあえずインストールしてもらうのとかは、ちょっとラクになった気がする。
ただ、それを使うと、ローカルサーバを立てる exe ファイルを起動するときに セキュリティの警告が出るので、それを解除しないと、 call poshcomplete#StartServer() できない。

Requirements

  • ローカルサーバとやりとりしたり、JSON 使いたかったので、if_python 使ってみてたけど、 webapi-vim を使うことにした。
    • なのでついでに、curlwget が必要
  • vimproc も使ってるけど、ローカルサーバを起動するときくらいにしか使ってないので、ローカルサーバさえ起動すれば、 なくても動く。

その他

  • ここで書いているのは、バージョンとしては、0.0 から、0.1 にしたときのもの

僕の IRKit の LED が眩しすぎる

IRKit 買ったけど、LED が眩しくて、常時 ON にするのが辛い感じだった。
ネット見てたら、 つくる人を増やす:学習リモコン IRKit 開発者インタビュー - Engadget Japanese

ー 青い LED が常時点いていて眩しいというコメントはよくありますけど。
そのコメントは多くて、3月から発売しているやつはLEDの光を弱めました。
ー それは物理的にですか?
そうですね、抵抗値を替えました。

とあって、3月以前に買ったので、光を弱める前のやつを持ってるらしい。
IRKit は GitHub で中身を公開してるので、そういった変更がないかなあと見てみると、 make full color led darker · c09d185 · irkit/device という変更を見つけた。
自力で抵抗変えるにしても、どのくらいがベストかっていうのを調べるのは、 なかなか大変なので、このまま真似してみることにした。

とりあえず、チップ抵抗買おうと思ったけど、50個で3000円のやつとかしか見つけられなくて、 手持ちのハンダこても、あまり細かい作業に向いてなさそうなのしか持ってないので、カーボン抵抗買った。

で、付けてみたら、かなり雑な感じになってしまったけど、そこまで眩しすぎる感じではなくなったので、 まあ、こんなもんかといったところ。

f:id:cd01:20140621185032j:plain

もしかしたら、もうちょい暗い方が、寝るときとかに気にならないかもと、ちょっと思ったけど、 そのへんの微調整は、抵抗付け替えるのも、まあまあ大変なので、 減光シール で良いかなあと。

追記

結局,まぶしかったので,青のところだけ断線させて使ってる.

LED 減光シールを買ってみた

いろいろなガジェット的なものが増えてくると、結構な割合でアホほど眩しい LED が付いてきて、 目が疲れやすくなる感じがするし、気が散るし、寝ようと思って電気を消しても、 結構明るいままで眠りづらくなったりしてイラっとくる。
特に青の LED が、色的にも目に厳しくて、ブルーライトとは何だったのか?となってしまう。

それで油性マジックで黒く塗りつぶしたりしていたけど、LED を減光させる用のシールが Amazon に売られていたので買ってみた。

カメラで撮ると雰囲気が結構変わってしまうけど、だいたい下のような感じで減光できる感じ。
ただ LED の輝度が高すぎると、一枚貼っても、あんまり変わった気がしないので、重ねて貼ったりした。
あと、粘着部分が結構ベタつきそうなので、糊が残るのが嫌な場合使えない。

銀色のを買ったけど、黒のもあるっぽい

Raspberry Pi の設定をした

f:id:cd01:20140503194104j:plain

Raspberry Pi(以下、raspi)の購入自体は結構前にしていたのだけど、 あまりまとまった時間を取れなかったり、ハマったりしていたのもあって、 なかなか使える状態にならなかったので、かなり時間が経ってしまった。

購入したのは、MODEL A というメモリが 256MB の安い方。
raspi のメリットは安いところだと思うので、低スペックでも安いのに慣れておいて、 同じ予算なら、多く購入できたほうができることが増えそうと思ったので。

ただ、LAN ケーブル刺すところ無いのと、USB ポート 1 つしかないのは、結構キツいなと感じた。

ラズベリーパイRASPBERRY PI, MODEL A, 256MB、正規品

ラズベリーパイRASPBERRY PI, MODEL A, 256MB、正規品

以下、ハマったところとかのメモ。

ケース

Raspberrypi making lego case を参考にして、作ってみた。

USB Hub

raspi に USB ポートが 1 つしかないので、SSH で接続できるようになるまでは、USB ハブでキーボードとか 接続したいので、USB ハブをつないで、作業しようとしていましたが、なんか色々おかしいし、 勝手に再起動したりして、なぜ??と思っていたら、電力不足みたいでした。

AC アダプター付きの自分で電力を調達してきてくれる USB ハブにしたら問題なく動作するようになりました。

無線 LAN アダプタ

最初は、USB のかなり小型のもの(↓のやつみたいな刺しても、ほとんど出っ張らないやつ)を使っていた けれど、Amazon のレビューを見ても書いてあるけど、起動してから時間が経つと熱をもって、速度が極端に落ちたり、 そもそも繋がらなくなったりした。

BUFFALO 無線LAN子機 コンパクトモデル 11n技術・11g/b対応 WLI-UC-GNM

BUFFALO 無線LAN子機 コンパクトモデル 11n技術・11g/b対応 WLI-UC-GNM

なので、ちょっと高いけど、大きめのサイズのやつ(↓のやつ)にした。

BUFFALO Air Station NFINITI HighPower 11n/g/b USB用 無線子機 WLI-UC-GNHP

BUFFALO Air Station NFINITI HighPower 11n/g/b USB用 無線子機 WLI-UC-GNHP

これだと、今のところ特に速度低下もしていないと思う。

WLAN Settings

これはググるといっぱい出てくる。
ただ自分の場合、全然うまくいかなくて、原因が分からなくて放置してた。
結果的に設定を typo してたのが原因だった ...

下記のコマンドを実行するとテストできるらしく、これで、パースエラーみたいなのが出てて、 やっと typo に気づいた。

sudo wpa_supplicant -iwlan0 -Dwext /etc/wpa_supplicant/wpa_supplicant.conf -dddt -c /etc/wpa_supplicant/wpa_supplicant.conf

あと、とりあえず、ネットにつなぐだけなら、WiMAX を直接 USB ポートに接続してしまえば、つながるっぽいので、 ある程度使えるようにするまでなら、これで良かったかも。

SSH

raspi 側で、いちいち IP 確認するの面倒なので、接続する側の PC から nmap コマンドで IP 確認した。

sudo nmap -sP 192.168.0.0-255

感想

なんか 3000円PC みたいなキャッチコピーで登場してた気がするけど、本体以外にも、SDカードは必須だし、 無線接続しようとしたら USB の無線LANアダプタもほしいし、電源用に microUSB ケーブルとかも必要だし、 ケースも・・・とかやってると、全然 3000 円じゃ足りない!

今回の設定で、USBハブも外して、USB の無線 LAN アダプタ 1 つと、電源用のケーブルだけで使えるようになって、 SSH での接続もできるようになった。 消費電力も少ないので、サーバみたいにして、ちょっとしたタスクを実行させたり、いろいろ遊べそうな感じ。

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 のもとでライセンスされています。

© 2012 cd01