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を実行した結果がこれです。