echodoc を使ってみた
概要
eldoc.elはエコーエリアに関数の引数を表示させることができるプラグインです。 これと同様なものとして、私はechodocを開発しました。 現在neocomplcacheが対応しています。 eldocのように対応プラグインが自由に機能を追加できるのですが、難点として、まだドキュメントがありません。
http://vim-users.jp/2010/12/hack189/
1.複数のプラグインから出力できる(cmdheightを大きくしないと意味がない)
http://lingr.com/room/vim/archives/2010/08/10#message-610766
2.優先度を設定できる
3.動的にプラグインを追加・削除できる
4.ハイライトを設定できる
5.neocomplcacheがインストールされていれば、context filetypeに対応できる
6.認識するファイルタイプは複数設定できる
少なくとも、ftpluginではこういうことはできません
statuslineに表示できないのはデメリットかもしれませんが。
とはいえ、statuslineに長い情報を載せるわけにはいかないので、
るびきちさんも画面最上部に表示するようにしていましたし
echo areaに表示しても問題はないと思います
syngan の解釈
- echodoc#register() で登録された dict を探索して, 見つかった情報をエコーエリアに表示する
- 対象となる文字はカーソル位置より前にある文字列?
- 一定時間カーソルが動作しない (autocmd CursorHold, CursorHoldI) ときに発動する.
autocmd CursorHold,CursorHoldI * call s:on_cursor_moved()
インストール
NeoBundle で. 最初は lazy じゃないほうがいいかも.
register() されたタイミングで動作するようになるので vim 起動時に動作するわけではないことに注意.
NeoBundle 'Shougo/echodoc', '', 'default' call neobundle#config('echodoc', { \ 'lazy' : 1, \ 'autoload' : { \ 'insert' : 1, \ }})https://github.com/Shougo/shougo-s-github/blob/36def7452ab88258d0160b1ec45dd6e799809811/vim/.vimrc#L135
insert (Number) If set to non-zero, neobundle will |:NeoBundleSource| on |InsertEnter| autocmd.https://github.com/Shougo/neobundle.vim/blob/436e4d4c5fff7023e95d93886724adfb690f3425/doc/neobundle.txt#L700
5/18 22:05 追記
lazy 設定すると, g:echodoc_enable_at_startup が有効にならない感じがする. issue あげていたからそのうち直ると思う.
5/20 21:00 追記
- 上記のバグは修正されました. neobundle の更新が必要
echodoc#register(name, dict)
独自でエコーエリアに表示させたいものがある場合には, echodoc#register を使って登録すれば良い.
- name は unregister で使用される. dict.name と同じ値を指定すれば良いと思う.
- dict: 辞書形式, 以下のキーを持つ
- name::string (必須)
- 任意につける名前. unregister 時のみに使われる.
- rank::integer (必須)
- 登録する dict の優先度. rank が小さいものから優先的に探索される.
- filetypes::dictionary (必須)
- dict を検索対象とする filetype を登録する. 辞書のキー名のみを使用し, 値は使用していない. dict.filetypes が空の場合には, すべての filetype に対して探索対象となる (必須)
- search::funcref(cur_text::string)
- 探索する関数. カーソル位置より前にある文字列?が cur_text に設定される. (@see echodoc#s:get_cur_text())
- 復帰値は dictionary の list. dictionary は以下のキーを持つ
- text: 出力する文字列 (必須)
- highlight echohl により設定される文字列のハイライト(任意)
- name::string (必須)
注意点
- 同じ名前で登録すると, 以前登録したものは削除される.
autoload/echodoc.vim
function! echodoc#register(name, dict) "{{{ call echodoc#unregister(a:name) call add(s:echodoc_dicts, a:dict) call sort(s:echodoc_dicts, 's:compare') endfunction"}}}
なぜか何もしなくても使える
Shougo Ware を install しているといくつかの plugin が register する
今のところ、neocomplcache や vimshell が対応している
Shougoの開発環境
実際, こんな感じで echodoc が追加されていた.
[ " neocomplcache {'rank': 5, 'name': 'include_complete', 'search': function('120'), 'filetypes': {}}, " neocomplcache {'rank': 10, 'name': 'vim_complete', 'search': function('144'), 'filetypes': {'vim': 1}}, " neosnippet {'rank': 100, 'name': 'neosnippet', 'search': function('102'), 'filetypes': {}}, {...} ]
登録部はこんな感じ
autoload/neocomplcache/sources/include_complete.vim
if neocomplcache#exists_echodoc() call echodoc#register('include_complete', s:doc_dict) endif
NOTE
- insert モードに入った時に echodoc が初期化されるが, そのときに echodoc#register() されるわけではないので, vim 起動時にすぐに動作するわけではない. neocomplcache 発動時などに登録される.
TODO
某言語のマニュアルを引くために, 外部コマンドを叩きにいくのだけど, これがとっても遅くて固まる.
非同期でやりたいけど vim 力不足により回避できないでございます.