echodoc を使ってみた

概要

Vimエコーエリアに情報を表示させるプラグイン.

eldoc.elはエコーエリアに関数の引数を表示させることができるプラグインです。 これと同様なものとして、私はechodocを開発しました。 現在neocomplcacheが対応しています。 eldocのように対応プラグインが自由に機能を追加できるのですが、難点として、まだドキュメントがありません。

http://vim-users.jp/2010/12/hack189/

1.複数のプラグインから出力できる(cmdheightを大きくしないと意味がない)
2.優先度を設定できる
3.動的にプラグインを追加・削除できる
4.ハイライトを設定できる
5.neocomplcacheがインストールされていれば、context filetypeに対応できる
6.認識するファイルタイプは複数設定できる
少なくとも、ftpluginではこういうことはできません
statuslineに表示できないのはデメリットかもしれませんが。
とはいえ、statuslineに長い情報を載せるわけにはいかないので、
るびきちさんも画面最上部に表示するようにしていましたし
echo areaに表示しても問題はないと思います

http://lingr.com/room/vim/archives/2010/08/10#message-610766
syngan の解釈
  1. echodoc#register() で登録された dict を探索して, 見つかった情報をエコーエリアに表示する
  2. 対象となる文字はカーソル位置より前にある文字列?
  3. 一定時間カーソルが動作しない (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 の更新が必要
NOTE
  • "-- 挿入 --" とかが表示されていて, insert モードで動作したことがない. Vim の設定で返れるのかな
    • 5/18 23:30 追記: ":set showmode" の影響. ":set cmdheight=2" とすれば insert モードでも表示できる.
  • なぜ動作しないのか, がなかなかわからない.
    1. register() されているかを確認する方法はない
    2. 対象とするキーワードが何になるかが予想と違った. カーソル位置にある単語が対象ではない
      • hoge の o の位置にカーソルがある場合には ho が検索対象になる

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 は以下のキーを持つ
      1. text: 出力する文字列 (必須)
      2. highlight echohl により設定される文字列のハイライト(任意)
注意点
  • 同じ名前で登録すると, 以前登録したものは削除される.

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 力不足により回避できないでございます.