2010年2月24日水曜日

諸君 私は補完が好きだ

諸君 私は補完が好きだ
諸君 私は補完が好きだ
諸君 私は補完が大好きだ

手動補完が好きだ
自動補完が好きだ
インテリセンスが好きだ
スペルチェックが好きだ
シェルが好きだ
予測補完が好きだ
オムニ補完が好きだ

Vimで Emacsで 秀丸で
zshで bashで
ATOKで skkで GoogleIMEで
携帯で スマートフォンで
Visual Studioで Eclipseで

このプログラム上で行われる ありとあらゆる補完作業が大好きだ

Vimがバッファからキーワード補完を行うのが好きだ
zshがコマンドの引数を予想して適切な候補を提示した時など心がおどる

ATOKが間違った日本語を訂正するのが好きだ
複雑なテンプレートを使用したC++のコードを
Visual Studioのインテリセンスで補完したときなど胸がすくような気持ちだった

zshが補完の世界を蹂躙するのが好きだ
補完を知らない初心者がシェルの引数をちまちまと入力している様など感動すら覚える
履歴補完をしらない輩を<C-r>で吊るし上げていく様などはもうたまらない

泣き叫ぶバグ入りのコードが私の這い回る<TAB>の指さばきとともに
補完によってあっというまに正常に書き換えられるのも最高だ

統合開発環境に目茶苦茶にされるのが好きだ
必死に守るはずだったエディタとシェルの牙城が蹂躙され
元祖のキーバインドがWindowsライクに変更されていく様はとても悲しいものだ

anything.elの物量に押し潰されて殲滅されるのが好きだ
VimとEmacsの宗教論争に追い回され、統合開発環境にその主導権を奪われるのは屈辱の極みだ

諸君 私は補完を 最強の補完を望んでいる
諸君 私に付き従うエディタユーザー諸君
君達は一体何を望んでいる?

完全なるオムニ補完を望むか?
情け容赦のない糞の様なスペル訂正を望むか?
肥大化の限りを尽くし数多のエディタを葬る悪魔の様な統合開発環境を望むか?

zsh: <TAB>!!
Emacs: <TAB>!!
Vim: <TAB>!!

よろしい ならば補完だ

我々は渾身の力をこめて今まさに<TAB>キーを押し下げんとする左手小指だ
だがこの黒い画面の上で四半世紀もの間堪え続けて来た我々に
<TAB>の打鍵すらもはや必要ない!!

更なる補完を!!
最強の自動補完を!!

我らはエディタと補完をこよなく愛する一派に過ぎない
だが諸君は一騎当千の古強者だと私は信仰している
ならば我らは諸君と私で究極の自動補完プラグインneocomplcacheとなる

我々を忘却の彼方へと追いやり眠りこけている連中を叩き起こそう
髪の毛をつかんで引きずり降ろし眼を開けさせ思い出させよう

連中にCUIの世界を思い出させてやる
連中に我々の<TAB>キーの打鍵音を思い出させてやる

自動補完には奴らの哲学では思いもよらない世界が広がっている事を知らしめてやる
一千人のVimの戦闘団でソースコードを書き換え尽くしてやる

「neocomplcacheインストール開始」
「:NeoComplCacheEnable!」
「最後のVimユーザーより全エディタユーザーへ」

第二次 自動補完作戦 状況を開始せよ
征くぞ 諸君


ついカッとなってやった。反省はしていない。

※:ご好評にお応えして、追記しました。

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