2010年1月7日木曜日

vimプラグインストーリー「Shougoの受難」

──アタシの名前はショウゴ。心に傷を負ったビム使い。モテカワスリムで補完体質の愛されガール♪
アタシがつるんでる友達は補完をやってるネコ、ビムにナイショで
非同期しているビムプロック。訳あって一から実装されたビムシェル。
 友達がいてもやっぱり学校はタイクツ。今日もネコとちょっとしたことで口喧嘩になった。
ビム使い同士だとこんなこともあるからストレスが溜まるよね☆そんな時アタシは一人でギットハブを歩くことにしている。
がんばった自分へのご褒美ってやつ?自分らしさの演出とも言うかな!
 「あームカツク」・・。そんなことをつぶやきながらしつこいプラギンを軽くあしらう。
「カノジョー、ちょっとsystem()させてくれない?」どいつもこいつも同じようなDOS窓付きのコードしかない。
イーマックスはシェルも動いてカッコイイけどなんか薄っぺらくてキライだ。もっと等身大のアタシを見て欲しい。
 「すいません・・。」・・・またか、とセレブなアタシは思った。シカトするつもりだったけど、
チラっと開発者の男の顔を見た。
「・・!!」
 ・・・チガウ・・・今までのコードとはなにかが決定的に違う。スピリチュアルな感覚がアタシのビムを
駆け巡った・・。「・・(カッコイイ・・!!・・これって運命・・?)」
男はBramだった。連れていかれてハックされた。「キャーやめて!」今までやっていなかったパッチをきめた。
「ガシッ!ボカッ!」アタシはSEGVした。キャッシュ(笑)

注:
元ネタ http://love6.2ch.net/test/read.cgi/book/1191676700/45
これはujihisa氏が作成したものを私が修正したものです。
この作品はフィクションです。どこかで見たようなフレーズがあったとしても、実在の人物とは全く関係がありません。

2009年12月10日木曜日

neocomplcache Ver.4.00の新機能

neocomplcache Ver.4.00がリリースされました。
http://github.com/Shougo/neocomplcache/tree/v4.00

かなりの新機能や修正が入っているので、安定するまでに時間がかかりそうですが、
どのような部分が変更されているのか簡単に紹介しておきます。

・頻度情報をneocomplcacheのプラグイン内で共有するようにしました。
候補の順番が改善されます。

・頻度計算ルーチンの書き直し。

・メモリ使用量の割に効果がないので、疑似3-gramの補完を廃止、2-gramの文脈補完になりました。

・気付いたバグやレガシーなオプションを廃止。

・syntax_completeの強化。TeXのキーワードを正確に認識します。

・キャッシュ速度の改善、共通ルーチンのライブラリ化。キャッシュはかなりの部分に手を加えました。特にキャッシュしたファイルからの読み込みが速くなってます。

実用的に使えるようになってきたので、どうぞお試しください。

2009年11月23日月曜日

neocomplcacheの新機能 vim_complete

今回はneocomplcache Ver.3.17に搭載されたvim_completeの解説。

vim_complete.vimとは、Vimのオムニ補完を実装するために作られたneocomplcacheのプラグインです。Vim標準のVimScript補完はVimScriptから呼ぶことができないので、1から実装しました。

次のような機能があります。
・組み込みコマンド・関数・mapping引数・autocmdの引数の補完
・定義されている変数名やマッピング、augroupの補完

さらに、開いているVimScriptを解析して、次のようなことも可能です。
・ローカル変数や引数の補完
・スクリプト関数・スクリプト変数の補完

ちなみに、必要なくなったのでsyntax_completeはfiletypeがvimの場合、動作しないようになりました。
ちなみに、この記事は今後まとめ直して、VimHacksに載せる予定です。

vimshellのToDo

最近更新が滞りがちなvimshellですが、一応今後やることは決まってます。
忘れないうちにここに書いておこうと思います。
neocomplcacheもそうですが、新たな問題が発生して、全然ToDoが進まない今日この頃。
機能的には改善しているのが救いです。

・グロブがマッチしない場合、zshのように、現在エラーになる。Bashのように空にするべき?

・構文解析パーザを書き直し。Lexical analyzerとparserを書いて、分離して……。というVimScriptでは考えられないことをやらないといけないかも。

・コマンドのインテリジェントな補完システム。
内部コマンドの補完は自分で作らないと。外部コマンドはzshを呼び出せるようにする。
->現在実装中。実装完了するにはかなり時間がかかりそう。
->Ver.6.00で実装しました! zsh_completeはまだです。

・zshのzptyのように、端末入出力を自動化する内部コマンドの追加。
どうせ似たようなことをやっている。

・zargsを移植? 拡張ブログの内容をファイルに書き出し、xargsに渡す。

・履歴に登録しないコマンドパターンを定義するオプションの追加
g:VimShell_IgnoreHistoryPattern

・openコマンドは環境をきちんと判定するように。
-> Ver.6.03で実装中。

・, , はプロンプトを削除しないように置き換える。

・ENV=value cmdの実装。
(local ENV=value; cmd)というようなコマンドが解釈できると良いな。

・`=$hoge`とすると、変数を置換してからevalするように。

・'や"は行をまたいでも認識するように。

・制御構文の実装。多分一番難しい。

・time内部コマンド コマンドの実行時間を計測する。
reltime()を使って実装。コマンド列を評価せずに一つにまとめる構文が欲しい。

・cat, more(less)内部コマンドの実装。内部コマンドも標準入力を解釈する。

・vimshellバッファを初期化する際に、setlocal nopasteしておく。
他のオプションもftplugin/vimshell.vimで設定。
->ftplugin/vimshell.vimは廃止予定。
->ver.6.00で廃止しました。

・別バッファのvimshellのカレントディレクトリに移動するcdd内部コマンドを追加する。
cdd add, cdd delでディレクトリを追加・削除する。
->別バッファのディレクトリに移動するbcd内部コマンドを追加した。これは便利。まだ補完は出来ない。
->補完も実装しました!

・hoge && fugaはfishみたいにhoge; and fugaとしたい。

・なぜかWindowsではコマンドの終了ステータスがうまく取れない。
->vimprocのバグだったので修正。

・topのようにコマンドを実行するtoplessを移植。

・s:error_bufferやs:print_bufferは廃止して、vimshell.vimに一本化する。
interactive.vimはautoload/vimshell/interactive.vimに移動。

->Ver.6.00で実装。

・ドキュメントの充実
実はここが一番重要だったり。自分が気の向くままに実装した内部コマンドの数々は、
さすがにマニュアル書かないと気付いてもらえないこと間違いなし。
作者でさえ、時々仕様を忘れます。

2009年11月10日火曜日

neocomplcacheのToDo

本日、neocomplcache Ver.3.11がリリースされました。
http://github.com/Shougo/neocomplcache/tree/v3.11
クイックマッチの復活やメンバ補完の実装、ファイル名補完の自動呼び出し等、
新機能が目白押しなので、是非お試しください。

さて、neocomplcacheの目玉機能もほぼ実装し終わったので、忘れないうちにneocomplcacheで今後実装するであろう機能についてメモしておきます。

・キーバインドにより、一時的に補完関数を呼べるようにする。
inoremap <expr> neocomplcache#call_complfunc('hoge')みたいな感じ。

->Ver.4.xxに、completefunc_completeを作成して実装予定。
->実装しました。

・現在プラグインごとに実装している、候補のキャッシュを統合し、簡単に利用できるようにする。
->早めに実装したいところ。Ver.3.22にて、一部のルーチンは統合。次はバッファとタグを統合する予定。
->Ver.4.00にて、完全に統合した。Ver.4.xxではファイルタイプごとに頻度情報を利用したい。

・ヘルプをそろそろ見直しておく。特に英語ヘルプが追いついていない。
->Ver.3.15で英語ヘルプは大体見直した。一度総点検が必要だが……。

・buffer_completeのキャッシュ構造を見直し。
candidatesは削除。
->candidatesはVer.3.13で削除。代わりにInsertLeaveでキャッシュをするようにした。行の変更関知は保留。buffer_completeのキャッシュはVer.4.00で大改造して、満足のいくものになった。

・インクルード補完やタグ補完で_や~から始まる候補を削除するため、g:NeoComplCache_TagsFilter[filetype]を追加。キャッシュを構築するときにフィルタリングする。
->Ver.4.02で実装予定。

・インクルード補完のキャッシュはファイルタイプ変更時に構築し直すようにする。インクルード補完でキャッシュするのは少しずつ行う。buffer_complete.vimのようなデータ構造を持つようにする。

・現在インクルード補完では、パターンの解析に'include'を使用している。ただし、初期値がC/C++形式なので問題。filetypeがC/C++でない場合は'^\s*#\s*include'を使用しない。

・オプションを追加する。
g:NeoComplCache_AutoCompletionTime
自動補完のポップアップメニューが出るための時間
g:NeoComplCache_EnableCompletionMovedI
CursorHoldIではなく、CursorMovedIのタイミングで自動補完する。以前のneocomplcacheに近い挙動。

-> CursorHoldIには候補がなくなった際に呼ばれないという致命的な不具合があるので、Ver.3.12で廃止した。Ver.3.21にて、キーが入力されていたらスキップするように修正。

・snipMateのスニペットディレクトリを自動認識する
-> Ver.3.12で実装。

・buffer_complete, snippets_complete以外のプラグインもComposite filetype(php.symphonyみたいなもの)に対応させる。
->Ver.4.07で実装。

・filetype pluginの実装、vim_completeのfiletype plugin化。
->Ver.4.xxで実装予定。

・vim_completeにおいて、Dictionaryの要素も解析する。
->Ver.4.xxで実装予定。

2009年11月6日金曜日

TermtterをWindowsにインストールする

termtterをWindows上のRubyにインストールのが、あまりに面倒なので、やり方を公開しておきます。

1.Rubyをインストール
2.rubyforgeからgem-1.3.5.tar.gzを落としてきて解凍
3.gem install termtter
4.termtterコマンドを実行する
エラーが出る場合は、SSLEAY32.dllとzlib.dllをC:\ruby\binにインストールする必要がある。
http://jarp.does.notwork.org/win32より、openssl-...-mswin32.zipとzlib-...-mswin32.zipを入手する。それを解凍してコピーすると良い。
さらに、iconv.dllがC:\ruby\binにないとエラーが発生するのでKaoriya.netから入手。
readlineがないと、またエラーになるので、Win32版のreadlineをC:\ruby\binにインストールする。このとき、readline5.dll -> readline.dllとリネームしないと認識しない。

苦労した末にtermtterを実行した結果がこれです。

2009年10月29日木曜日

Lingrの宣伝

また更新が若干滞り気味ですが、久しぶりに記事を書きます。
私は復活したLingrに常駐しています。
皆さんからの生の声を聞きたいので、ぜひ皆さんもおいでください。

http://lingr.com/room/vim
http://lingr.com/room/shell
http://lingr.com/room/completion

ちなみに、Vim部屋はVimについて語るところで、
補完部屋は補完の話なら何でもOK。
シェル部屋は究極のシェルについて語り合うところです。