echodoc を使ってみて その2

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

難点として、まだドキュメントがありません。

http://vim-users.jp/2010/12/hack189/
echodoc を使ってみた - vim 初心者の作業メモ
  • 関数の I/F については, ドキュメント書いて pull req 送って取り込んでもらった. 英語がう○こだけど.
  • 日本語マニュアルは取り込まれないと *思う* ので, ここで.
    • 他の Shougo Ware のように更新が進むことはないと思われるので当分使えると思います.
    • 最新版との差異があっても自己責任でお願いします.
    • ドキュメント内の "思います" は syngan の感想文.

概要

echodoc はエコーエリアに情報を表示するプラグインです.
一定時間キー操作を行わなかった場合(autocmd CursorHold, CursorHoldI)にカーソル上にある文字列に対応する情報を表示します.

echodoc は以下の特徴を持ちます. 少なくともこれらの機能は ftplugin では実現できません.

  1. 複数のプラグインから出力する (cmdheight が十分大きな値を持っている必要があります)
  2. ドキュメントを検索する優先度を設定できます.
  3. プラグインをいつでも追加・削除できます.
  4. ハイライトの設定ができます.
  5. neocomplecache がインストールされていれば content filetype に対応できます.
  6. 認識するファイルタイプは複数設定できます.

インストール

NeoBundle (https://github.com/Shougo/neobundle.vim) を利用する場合には
.vimrc に以下のように記述してください.

NeoBundle 'Shougo/echodoc', '', 'default'
call neobundle#config('echodoc', {
      \ 'lazy' : 1,
      \ 'autoload' : {
      \ 'insert' : 1,
      \ }})

注意: 本設定では挿入モードが開始したときに echodoc がロードされます.

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

インターフェース:コマンド

:EchoDocEnable

echodoc を有効にします.

:EchoDocDisable

echodoc を無効にします.

インターフェース:変数

g:echodoc_enable_at_startup

本変数の値が 0 以外の場合には echodoc は起動時に自動的に有効になります.
デフォルト値は 0 (無効) です.

インターフェース:関数

echodoc#enable()

echodoc を有効にします. :EchoDocEnable の関数版です.

echodoc#disable()

echodoc を無効にします. :EchoDocDisable の関数版です.

echodoc#is_enabled()

echodoc が有効な場合に

echodoc#register({name}, {dict})

ドキュメント {dict} を {name} という名前で登録します.
もし同じ {name} のドキュメントが追加済みの場合には上書きされます.
{dict} は辞書型で以下を要素に持ちます:

  • "name" 文字列型 (必須)
    • このドキュメントの名前です. ユーザが任意に設定することができます.
    • 引数の {name} と同じ値であることが要求されます.
  • "rank" 数値型 (必須)
    • このドキュメントの検索優先度です. この値が小さいほど優先度が高くなります.
    • (注意: 1 を設定しておけば良いと思います.)
  • "filetypes" 辞書型 (必須)
    • このドキュメントを検索対象とする filetype を指定します. キー名が対象とするファイルタイプで

キー値は任意の値を設定します.

    • (注意: 1 を設定しておけば良いと思います. プラグイン内では使用されていません)
  • "search" 関数型 (必須)
    • 検索に使用する関数を指定します. この関数はカーソル位置より前にある文字列(?) が cur_text を引数として渡されます.
    • 復帰値は辞書型のリストです.
    • 辞書は以下の要素を持ちます.
      • "text" : 出力する文字列 (必須)
      • "highlight" : 出力する文字列に対するハイライト (任意)
echodoc#unregister({name})

名前が {name} であるドキュメントの登録を解除します.

  • (注意: echodoc#register の引数 {name} が対象ではないことに注意.)
echodoc#get({name})

名前が {name} である {dics} を返します. 登録されているか確認するのに利用できます.

対応している Shougo Ware

neocomplecache や neosnippet, vimshell を利用すると自動的に検索用のドキュメントが追加されます.

	[
		" 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': {}}, {...}
	]
register()
let s:sample_dict = {
\   'name' : 'sample',
\   'rank' : 1,
\   'filetypes' : {'text' : 1, 'vim' : 1},
\}

function! s:sample_dict.search(cur_text)
	let completion_length = 4
	let words = []
	let i = 0
	while i >= 0
		let word = matchstr(a:cur_text, "[0-9a-zA-Z]\\+", i)
		call add(words, word)
		let i = matchend(a:cur_text, "[0-9a-zA-Z]\\+", i)
	endwhile
	if len(words) == 0
		return []
	endif

	for word in reverse(words)
		if len(word) >= completion_length
			break
		endif
	endfor
	return [
		\ {'text' : word, 'highlight' : 'Identifier'},
		\ {'text' : ' is found'},
		\]
endfunction

call echodoc#register("sample", s:sample_dict)

注意事項

  1. showmode が有効になっていて, cmdheight=1 の時には, 挿入モードにおいて echodoc からの情報は表示されません. showmode を無効にするか, cmdheight に大きな値を設定してください.
  2. search 時に重たい処理を行うと vim が固まったように感じます. 検索に外部コマンドを用いるような場合には本プラグインには向いていないと思います.