<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Vim-users.jp &#187; neocomplcache</title>
	<atom:link href="http://vim-users.jp/tag/neocomplcache/feed/" rel="self" type="application/rss+xml" />
	<link>http://vim-users.jp</link>
	<description>日本の Vim ユーザのためのハブサイト</description>
	<lastBuildDate>Thu, 09 Sep 2010 00:24:18 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<atom:link rel='hub' href='http://vim-users.jp/?pushpress=hub'/>
		<item>
		<title>Hack #169: neocomplcacheを拡張する　後編</title>
		<link>http://vim-users.jp/2010/08/hack169/</link>
		<comments>http://vim-users.jp/2010/08/hack169/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 15:00:05 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv3]]></category>
		<category><![CDATA[neocomplcache]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1648</guid>
		<description><![CDATA[				前編からかなり間が空いてしまいましたが、ここではneocomplcacheのプラグインの記述方法を解説します。neocomplcache Ver.5.1ではプラグインの構成がかなり変化したので、この記事を参考にし [...]]]></description>
			<content:encoded><![CDATA[				<p>前編からかなり間が空いてしまいましたが、ここではneocomplcacheのプラグインの記述方法を解説します。neocomplcache Ver.5.1ではプラグインの構成がかなり変化したので、この記事を参考にしてください。</p>
				
				<h2>プラグインの仕様</h2>
				
				<p>プラグインはautoload/neocomplcache/sourcesにインストールしたものが自動的に読み込まれます。
				プラグインには、neocomplcache#sources#プラグイン名#define()が絶対必要です。
				これはneocomplcacheが初期化するときに呼ばれ、neocomplcacheにディクショナリ変数を渡します。
				ここではディクショナリ変数に必要な要素について説明をします。</p>
				
				<h3>name</h3>
				
				<p>プラグインの名前です。</p>
				
				<h3>kind</h3>
				
				<p>プラグインの種類を現します。plugin, ftplugin, complfuncの三種類があります。これらの違いについては後述します。</p>
				
				<h3>filetypes</h3>
				
				<p>ftpluginにのみ存在します。どのファイルタイプで補完するかを表すディクショナリ変数です。</p>
				
				<h3>initialize()</h3>
				
				<p>プラグインの初期化時に呼ばれます。コマンドの登録等を行います。ftpluginの場合、これが呼ばれるのはfiletypesに対応するバッファで補完されたときです。</p>
				
				<h3>finalize()</h3>
				
				<p>neocomplcacheの無効化されるときに呼ばれます。ここで不要になったコマンドやautocmdを削除します。</p>
				
				<h3>get_keyword_list(cur_keyword_str)</h3>
				
				<p>pluginにのみ存在します。<code>a:cur_keyword_str</code>にマッチするリストを返すために呼ばれる関数です。<code>get_keyword_list()</code>が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。詳しくは「補完リストの仕様」の項を参照してください。</p>
				
				<h3>get_keyword_pos(cur_text)</h3>
				
				<p>ftpluginとcomplfuncに存在します。<code>cur_text</code>にマッチする補完位置を返します。</p>
				
				<h3>get_complete_words(cur_keyword_pos, cur_keyword_str)</h3>
				
				<p>ftpluginとcomplfuncに存在します。<code>a:cur_keyword_str</code>にマッチするリストを返すために呼ばれます。<code>get_complete_words()</code>が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。詳しくは「補完リストの仕様」の項を参照してください。</p>
				
				<h2>補完リストの仕様</h2>
				
				<p><code>get_keyword_list()</code>や<code>get_complete_words()</code>が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。一部のキー以外はVim標準の補完で使用するものと同じです。</p>
				
				<h3>word, abbr, menu, info, icase, dup</h3>
				
				<p>Vim標準の補完で使用するものと同じです。word以外は省略することができます。詳しい解説は、<em>[Hack #14: ]Insert mode補完 自作編</em>を参照してください。
				menuはどのプラグインの候補で補完しているかを[B]のような記号で表す習慣になっています。ftpluginは[vim]や[ghc]のように、長めの文字列を使います。</p>
				
				<h2>プラグイン用ヘルパ関数</h2>
				
				<p>autoload/neocomplcache.vimには、プラグインから呼び出せるようにヘルパ関数が実装されています。ここでは、よく使われる関数について解説します。</p>
				
				<h3>neocomplcache#<code>keyword_filter(list, cur_keyword_str)</code></h3>
				
				<p><code>get_keyword_list()</code>で使用できる、単純なフィルターです。<code>a:list</code>の中から、<code>a:cur_keyword_str</code>にマッチするリストを返します。<code>filter()</code>とは違って、listは変更されるとは限りません。</p>
				
				<h3>neocomplcache#<code>unpack_dictionary(dict)</code></h3>
				
				<p>リストの辞書をリスト化して返します。</p>
				
				<h3>neocomplcache#<code>unpack_dictionary_dictionary(dict)</code></h3>
				
				<p>辞書の辞書をリスト化して返します。</p>
				
				<h3>neocomplcache#<code>keyword_escape(cur_keyword_str)</code></h3>
				
				<p><code>a:cur_keyword_str</code>をマッチングに使えるようにエスケープします。</p>
				
				<h3>neocomplcache#<code>get_cur_text()</code></h3>
				
				<p>現在のカーソル文字列を取得します。</p>
				
				<h3>neocomplcache#<code>get_completion_length(plugin_name)</code></h3>
				
				<p><code>plugin_name</code>の自動補完する文字列長を返します。</p>
				
				<h3>neocomplcache#<code>set_completion_length(plugin_name)</code></h3>
				
				<p><code>plugin_name</code>の自動補完する文字列長を設定します。ただし、これはプラグイン側で初期値を設定するためのもので、ユーザーが補完文字列長を設定している場合、そちらが優先されます。</p>
				
				<h3>neocomplcache#<code>get_keyword_pattern_end(filetype)</code></h3>
				
				<p>文字列の最後にマッチする<code>filetype</code>のキーワードパターンを返します。<code>filetype</code>は省略可能で、省略すると現在のバッファの<code>filetype</code>を参照します。</p>
				
				<h3>neocomplcache#<code>get_keyword_pattern(filetype)</code></h3>
				
				<p>文字列にマッチする<code>filetype</code>のキーワードパターンを返します。<code>filetype</code>は省略可能で、省略すると現在のバッファの<code>filetype</code>を参照します。</p>
				
				<h3>neocomplcache#<code>is_auto_complete()</code></h3>
				
				<p>自動補完の時に1を返します。</p>
				
				<h3>neocomplcache#<code>print_caching(string)</code></h3>
				
				<p>キャッシュ時のメッセージを表示します。</p>
				
				<h3>neocomplcache#<code>print_error(string)</code></h3>
				
				<p>エラーメッセージを表示します。</p>
				
				<h2>キャッシュ用ヘルパ関数</h2>
				
				<p><code>autoload/neocomplcache/cache.vim</code>には、プラグインから呼び出せるキャッシュのヘルパ関数が含まれます。
				量が多いので、ここでは詳しく説明することは避けますが、うまく利用すると簡単にキャッシュを使ったプラグインを記述できます。
				ちなみに、neocomplcache Ver.4以降では、ほとんどのプラグインがキャッシュ用ヘルパ関数を使うように書き直されています。</p>
				
				<h2>プラグインのサンプル</h2>
				
				<p>neocomplcacheに標準添付のプラグインを参考にしても良いのですが、機能が複雑化しているため、プラグイン作りの勉強のために見るのは大変です。
				eagletmtさんが作成した<a href="http://gist.github.com/489268">ghc_complete</a>はfiletype pluginでほどよい長さなので、勉強に最適でしょう。</p>
				
				<h2>plugin, ftplugin, complfuncの違い</h2>
				
				<p>neocomplcache Ver.3.00より、complfuncが実装され、より自由度の高い補完が実装できるようになりました。
				pluginとcomplfuncの違いは、pluginはカーソル前のキーワードから補完しますが、complfuncは独自に補完位置を決定できるというところです。
				ftpluginとはneocomplcacheのオムニ補完です。
				基本的な仕様はcomplfuncと同じです。ただし、必要な時にのみ初期化や呼び出しされるというところが違います。</p>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/08/hack169/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #165: neocomplcache Hacks(6)　インクルード補完</title>
		<link>http://vim-users.jp/2010/08/hack165/</link>
		<comments>http://vim-users.jp/2010/08/hack165/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 15:00:14 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>
		<category><![CDATA[neocomplcache]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1646</guid>
		<description><![CDATA[				今回はインクルード補完です。neocomplcacheに実装されたインクルード補完はあらかじめ設定しておく必要がありますが、使いこなせばタグ補完を越えた使い勝手となります。
				
				インクルード補完とは [...]]]></description>
			<content:encoded><![CDATA[				<p>今回はインクルード補完です。neocomplcacheに実装されたインクルード補完はあらかじめ設定しておく必要がありますが、使いこなせばタグ補完を越えた使い勝手となります。</p>
				
				<h2>インクルード補完とは</h2>
				
				<p>インクルード補完とは、バッファ中のインクルード文を解析して、補完候補に加える補完のことです。Vim自体にもインクルード補完が備わっていますが、Perlなど<code class="option">'path'</code>が多数のディレクトリに設定されている言語では重すぎて使いものになりません。neocomplcacheのインクルード補完は結果をキャッシュすることで、Vim標準のインクルード補完に存在する欠点を補うために開発されました。タグ補完と比較すると、インクルードしているファイルだけ解析するので補完候補が多すぎる問題が発生しにくい、あらかじめタグファイルを生成する必要がない、といった利点があります。</p>
				
				<h2>インクルード補完の制限</h2>
				
				<p>インクルード補完は強力ですが、万能ではありません。<code class="option">'path'</code>や<code class="option">'includeexpr'</code>, <code class="option">'include'</code>といったオプションが適切に設定されている必要があります。特にWindows環境では、ftpluginなどで設定する必要があるかもしれません。インクルード補完ではctagsを利用するので、システムにインストールされている必要があります。ctagsが存在しなかったり、ctagsに対応していない言語の場合(D言語など)はバッファをそのまま解析するので、<code>buffer_complete</code>と動作が同じになります。</p>
				
				<h2>今後のインクルード補完</h2>
				
				<p>現在実装されているインクルード補完はまだ実験的な意味合いが強いです。
				今後は、gtagsへの対応や<a href="http://github.com/Shougo/echodoc">echodoc</a>への対応、遅延キャッシュなどを考えています。
				ただしgtagsはカレントディレクトリにタグファイルを作るらしく、ctagsのように簡単に解析するのは難しそうです。</p>
				
				<h2>参考文献</h2>
				
				<p><a href="http://d.hatena.ne.jp/thinca/20091026/1256569191">neocomplcache.vim のインクルード補完の使い方</a>
				thincaさんのインクルード補完解説記事。neocomplcache Ver.3.06を対象としていて、neocomplcache Ver.5.0がリリースされた現在では変数名等が古くなっていますが、参考になると思います。</p>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/08/hack165/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #161: Command-line windowを使いこなす</title>
		<link>http://vim-users.jp/2010/07/hack161/</link>
		<comments>http://vim-users.jp/2010/07/hack161/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 15:00:09 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>
		<category><![CDATA[neocomplcache]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1553</guid>
		<description><![CDATA[				普段我々が何げなく使っているCommand-line modeですが、使いこなすうちに様々な欠点が目につきます。このHackでは、Command-line modeを捨て去ってしまうことを提唱します。
				
 [...]]]></description>
			<content:encoded><![CDATA[				<p>普段我々が何げなく使っているCommand-line modeですが、使いこなすうちに様々な欠点が目につきます。このHackでは、Command-line modeを捨て去ってしまうことを提唱します。</p>
				
				<h2>Command-line modeの欠点</h2>
				
				<p>なぜCommand-line modeが使えないかというと、次のような欠点があるからです。</p>
				
				<h3>編集能力が貧弱</h3>
				
				<p>Command-line modeは基本的にラインエディタなので、シェル並の編集しかできません。テキストオブジェクトといった便利な機能も使えないのです。</p>
				
				<h3>自動補完ができない</h3>
				
				<p>もはや筆者は自動補完のある環境が普通になってしまい、<a href="http://github.com/Shougo/neocomplcache">neocomplcache</a>がないと仕事になりませんが、残念ながらCommand-line modeでは使えません。さらに、Command-line modeは補完も貧弱なので、困ったものです。</p>
				
				<h3>設定が分散する</h3>
				
				<p>Insert modeとCommand-line modeは独立しているので、キーマップ等は別々に定義しなければなりません。これは不便です。</p>
				
				<h3>履歴検索が面倒</h3>
				
				<p>Command-line modeでは、履歴検索が簡単にはできません。</p>
				
				<pre>
cnoremap &lt;C-n&gt;          &lt;Down&gt;
cnoremap &lt;C-p&gt;          &lt;Up&gt;
</pre>
				
				<p>とキーマップを定義する手はあります。これなら現在入力されているものにマッチする候補を検索することができます。しかし<a href="http://github.com/Shougo/vimshell">vimshell</a>のように一覧から履歴を検索する方法はなく、そもそも設定が面倒です。検索には<a href="http://www.vim.org/scripts/script.php?script_id=1984">fuzzyfinder</a>や<a href="http://www.vim.org/scripts/script.php?script_id=2337">ku</a>を使うという手もありますが、この程度のことで外部プラグインに依存するというのもどうでしょうか。</p>
				
				<h2>Command-line window</h2>
				
				<p>そこで、本HackではCommand-line modeの代わりに、Command-line windowという機能を使うことを提案します。
				Command-line windowとは何かというと、Vimに組み込まれている、Ex commandを実行できるバッファのことです。
				Command-line windowは<code class="option">'filetype'</code>がvimであるため、Vimのvim filetype pluginがすべて使えます。
				特にneocomplcacheはVimのオムニ補完を搭載し、ユーザー定義のコマンドも解析できるため、併用するとneocomplcacheのパワーを存分に発揮することができます。
				neocomplcacheは補完だけでなく、コマンドの引数情報をエコー領域に表示することもできます。
				neocomplcacheに実装されている、Vimのオムニ補完は仕組みが複雑なので、今後のVim Hacksで詳しく解説する予定です。
				Command-line windowについて詳しい情報は、<code>:help cmdwin</code>を参照してください。</p>
				
				<h2>Command-line windowを設定する</h2>
				
				<p>Command-line windowはウインドウに入ったときにInsert modeにならなかったり、neocomplcacheと相性が悪かったりして使いづらいので、カスタマイズする必要があります。筆者は.vimrc中で、次のように設定しています。この設定では:を入力したときにCommand-line windowに遷移するようにしています。CmdwinEnterにautocmdを設定すれば簡単にカスタマイズできるので、皆さんも最適な設定を探してみてください。</p>
				
				<pre>
nnoremap &lt;sid&gt;(command-line-enter) q:
xnoremap &lt;sid&gt;(command-line-enter) q:
nnoremap &lt;sid&gt;(command-line-norange) q:&lt;C-u&gt;

nmap :  &lt;sid&gt;(command-line-enter)
xmap :  &lt;sid&gt;(command-line-enter)

autocmd MyAutoCmd CmdwinEnter * call s:init_cmdwin()
function! s:init_cmdwin()
  nnoremap &lt;buffer&gt; q :&lt;C-u&gt;quit&lt;CR&gt;
  nnoremap &lt;buffer&gt; &lt;TAB&gt; :&lt;C-u&gt;quit&lt;CR&gt;
  inoremap &lt;buffer&gt;&lt;expr&gt;&lt;CR&gt; pumvisible() ? "\&lt;C-y&gt;\&lt;CR&gt;" : "\&lt;CR&gt;"
  inoremap &lt;buffer&gt;&lt;expr&gt;&lt;C-h&gt; pumvisible() ? "\&lt;C-y&gt;\&lt;C-h&gt;" : "\&lt;C-h&gt;"
  inoremap &lt;buffer&gt;&lt;expr&gt;&lt;BS&gt; pumvisible() ? "\&lt;C-y&gt;\&lt;C-h&gt;" : "\&lt;C-h&gt;"

  " Completion.
  inoremap &lt;buffer&gt;&lt;expr&gt;&lt;TAB&gt;  pumvisible() ? "\&lt;C-n&gt;" : "\&lt;TAB&gt;"

  startinsert!
endfunction
</pre>
				
				<p>追記： Command-line windowでは、<a href="http://www.vim.org/scripts/script.php?script_id=2675">altercmd</a>が使用できません。これでは不便なので、tyruさんがCommand-line windowでも使えるように改造したものを公開しているので、<a href="http://github.com/tyru/vim-altercmd">こちら</a>を使ってください。
				私は次のように設定しています。</p>
				
				<pre>
function! s:init_cmdwin()
        call altercmd#define('b', 'gr[ep]', 'Grep', 'i')
        " AlterCommand &lt;buffer&gt;&lt;mode:i&gt; gr[ep] Grepでも可
endfunction
</pre>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/07/hack161/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #157: neocomplcache Hacks(5)　タグ補完　ディクショナリ補完</title>
		<link>http://vim-users.jp/2010/06/hack157/</link>
		<comments>http://vim-users.jp/2010/06/hack157/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 15:00:41 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>
		<category><![CDATA[neocomplcache]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1638</guid>
		<description><![CDATA[				今回はタグ補完とディクショナリ補完です。タグ補完は微妙ですが、ディクショナリ補完は便利に使えるでしょう。
				
				タグ補完とは
				
				タグ補完とは、&#8217;tags&#8217;から補 [...]]]></description>
			<content:encoded><![CDATA[				<p>今回はタグ補完とディクショナリ補完です。タグ補完は微妙ですが、ディクショナリ補完は便利に使えるでしょう。</p>
				
				<h2>タグ補完とは</h2>
				
				<p>タグ補完とは、&#8217;tags&#8217;から補完候補を取ってくることで補完することです。
				Vim標準では<kbd>&lt;C-x&gt;&lt;C-v&gt;</kbd>を用います。
				neocomplcacheでは<code>tags_complete</code>というプラグインによって実装されています。
				<code>.</code>や<code>-&gt;</code>といった<code>g:neocomplcache_member_prefix_patterns[&amp;filetype]</code>にマッチする入力のあるときに補完を行うと、
				クラスのメンバのみが補完候補となる機能を持っています。
				要望があったので実装しましたが、私は個人的にタグ補完が好きではありません。なぜなら、タグ補完は候補が多くなりすぎるからです。
				候補が多いとneocomplcacheのキャッシュや補完動作が明らかに遅くなります。
				そこでtags&#95;complete.vimでは、<code>g:neocomplcache_caching_limit_file_size</code>よりも大きいタグファイルは自動的にキャッシュしません。
				どうしても使いたいならば、<code>:NeoComplCacheCachingTags</code>コマンドを実行してください。
				ctagsではタグを生成できない言語も多いので、現在ではより高機能なインクルード補完を用いるべきでしょう。インクルード補完については、今後のVim Hacksで解説予定です。</p>
				
				<h2>ディクショナリ補完とは</h2>
				
				<p>ディクショナリ補完とは、登録された辞書ファイルから補完候補を取ってくることで補完することです。
				前回解説したシンタックス補完も一種のディクショナリ補完と言えます。
				Vim標準では<kbd>&lt;C-x&gt;&lt;C-k&gt;</kbd>を用います。
				neocomplcacheでは<code>dictionary_complete</code>というプラグインによって実装されています。
				<code>g:neocomplcache_dictionary_filetype_lists[&amp;filetype]</code>に辞書ファイルを登録しておけば、自動的にキャッシュされます。
				例えば、vimshellでは履歴ファイルを辞書ファイルとして登録しておけば便利です。
				<code>g:neocomplcache_dictionary_filetype_lists[&amp;filetype]</code>が存在していない場合、自動的に&#8217;dictionary&#8217;の値が使われます。</p>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/06/hack157/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #147 : neocomplcache Hacks(4)　シンタックス補完</title>
		<link>http://vim-users.jp/2010/05/hack147/</link>
		<comments>http://vim-users.jp/2010/05/hack147/#comments</comments>
		<pubDate>Sat, 15 May 2010 15:00:25 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>
		<category><![CDATA[neocomplcache]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1512</guid>
		<description><![CDATA[				四回目の今回はシンタックス補完を解説します。
				
				シンタックス補完とは
				
				シンタックス補完とは、標準添付プラグインのautoload/syntaxComplete.vimをさらに汎用 [...]]]></description>
			<content:encoded><![CDATA[				<p>四回目の今回はシンタックス補完を解説します。</p>
				
				<h2>シンタックス補完とは</h2>
				
				<p>シンタックス補完とは、標準添付プラグインの<code>autoload/syntaxComplete.vim</code>をさらに汎用的にし、neocomplcacheのプラグインとして独自実装したものです。
				内部動作としては<code>:syn list</code>の結果を解析し、キーワードを補完候補に加えます。
				１度目は候補をキャッシュするので、若干時間がかかりますが、その後は高速に動作します。
				Vimの豊富なシンタックスキーワードを有効活用するので、辞書を別途用意する必要はなく、非常に便利です。</p>
				
				<h2>autoload/syntaxComplete.vimとの比較</h2>
				
				<p><code>autoload/syntaxComplete.vim</code>はキーワード文字列しか解析できませんが、neocomplcacheのシンタックス補完は正規表現のパターンも解析するので、HaskellやTeXといったファイルタイプでもシンタックス補完が使えます。
				ただし&#40;&#41;や[]を使った複雑な正規表現では、上手くパースできないことがあります。
				ご了承下さい。</p>
				
				<h2>Same FileType Completion</h2>
				
				<p>シンタックス補完はneocomplcache独自の補完機能である、Same FileType Completionに対応しています。
				Same FileType CompletionとはCとC++のように、似たファイルタイプを関連付けて相互参照できるようにす機能です。
				これにより、vimshellのiexeから起動したirbのバッファ上でRubyキーワードを補完できます。</p>
				
				<h2>使用上の注意</h2>
				
				<p>Action scriptやVim Scriptのautocmdを補完するとき、シンタックスの補完候補が小文字になってしまうことがあります。
				これはシンタックスファイルの
				<code>syn case ignore</code>
				が悪さをしているせいです。プラグイン側では対処しようがないので、気になるようだったら直接シンタックスファイルを修正してください。</p>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/05/hack147/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #128: neocomplcache Hacks(3)　キーワード補完</title>
		<link>http://vim-users.jp/2010/03/hack128/</link>
		<comments>http://vim-users.jp/2010/03/hack128/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 15:00:04 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>
		<category><![CDATA[neocomplcache]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1240</guid>
		<description><![CDATA[				三回目の今回はneocomplcacheのキーワード補完と拡張プラグインを解説します。
				
				キーワード補完とは
				
				neocomplcacheのキーワード補完は、&#60;C-n&#62; [...]]]></description>
			<content:encoded><![CDATA[				<p>三回目の今回はneocomplcacheのキーワード補完と拡張プラグインを解説します。</p>
				
				<h2>キーワード補完とは</h2>
				
				<p>neocomplcacheのキーワード補完は、<code>&lt;C-n&gt;</code>や<code>&lt;C-p&gt;</code>で呼び出すことのできるVim組み込みのキーワード補完を模倣して設計されています。
				言語ごとにキーワードパターンを定義して、一括して候補を検索できるのが最大の特徴です。
				使用するキーワードパターンは<code>g:NeoComplCache_KeywordPatterns</code>で定義されています。</p>
				
				<h2>pluginとcomplfuncの違い</h2>
				
				<p>neocomplcacheには補完候補を収集するために、pluginとcomplfuncという二つの拡張プラグインが存在します。
				それぞれ、<code>autoload/neocomplcache/plugin</code>と<code>autoload/neocomplcache/complfunc</code>に配置します。
				pluginは<code>keyword_complete.vim</code>から一括して呼びだされる拡張プラグインで、単純なため実装が比較的簡単です。
				complfuncは補完開始位置を拡張プラグイン側で計算しないといけません。
				その代わり、補完開始位置は自由に決定できるので、ファイル名補完のような複雑な補完を実装できます。
				初期のneocomplcacheでは、complfuncは一つのプラグインしか呼べないという制限がありました。
				現在のバージョンでは、complfuncの候補も統合できるように改良されているため、そのような制限はありません。</p>
				
				<h2>標準添付のplugin</h2>
				
				<h3>buffer_complete.vim</h3>
				
				<p>開いているバッファから補完候補を収集するプラグインです。バッファ内の単語を解析することで、使用頻度の学習も行います。</p>
				
				<h3>dictionary_complete.vim</h3>
				
				<p><code>g:NeoComplCache_DictionaryFileTypeLists</code>から補完候補を収集するプラグインです。</p>
				
				<h3>include_complete.vim</h3>
				
				<p>バッファで開いているインクルードファイルから補完候補を収集するプラグインです。Vimにもインクルード補完はありますが、より拡張されています。</p>
				
				<h3>snippets_complete.vim</h3>
				
				<p>スニペットを補完するプラグインです。補完するだけではなく、単体でスニペット展開プラグインとしても動作します。</p>
				
				<h3>syntax_complete.vim</h3>
				
				<p>シンタックスファイルからキーワードを補完するプラグインです。Vim標準添付のsyntaxcomplete.vimよりも高機能であり、結果をキャッシュするので高速です。複雑なTeXのシンタックスも解析できます。</p>
				
				<h3>tags_complete.vim</h3>
				
				<p>タグファイルからキーワードを補完するプラグインです。</p>
				
				<h2>標準添付のcomplfunc</h2>
				
				<h3>completefunc_complete.vim</h3>
				
				<p>補完関数を登録することで、自動呼び出しするプラグインです。neocomplcacheは<code>completefunc</code>を上書きしてしまうので、その対策に使えます。
				手動補完として補完関数を個別に呼び出しすることもできます。</p>
				
				<h3>filename_complete.vim</h3>
				
				<p>ファイル名を補完するプラグインです。詳しい解説は、<em>[Hack #119: neocomplcache Hacks(2) オムニ補完]</em>を参照してください。</p>
				
				<h3>keyword_complete.vim</h3>
				
				<p>pluginから候補を収集し、キーワードを補完するプラグインです。</p>
				
				<h3>omni_complete.vim</h3>
				
				<p>オムニ補完を呼び出し、候補を収集するプラグインです。詳しい解説は、<em>[Hack #119: neocomplcache Hacks(2) オムニ補完]</em>を参照してください。</p>
				
				<h3>vim_complete.vim</h3>
				
				<p>Vimのオムニ補完機能を提供するプラグインです。Vim標準の<code>&lt;C-x&gt;&lt;C-v&gt;</code>よりも機能が拡張されていて、ローカル変数や引数の補完も可能です。</p>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/03/hack128/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #119: neocomplcache Hacks(2) 　オムニ補完</title>
		<link>http://vim-users.jp/2010/01/hack119/</link>
		<comments>http://vim-users.jp/2010/01/hack119/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 15:00:51 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>
		<category><![CDATA[neocomplcache]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1183</guid>
		<description><![CDATA[				二回目の今回はオムニ補完です。AutoComplPopでも自動呼び出しが可能ですが、neocomplcacheでは、それに改良を加え、設定しやすくなっています。
				
				オムニ補完とは
				
			 [...]]]></description>
			<content:encoded><![CDATA[				<p>二回目の今回はオムニ補完です。AutoComplPopでも自動呼び出しが可能ですが、neocomplcacheでは、それに改良を加え、設定しやすくなっています。</p>
				
				<h2>オムニ補完とは</h2>
				
				<p>オムニ補完とは、Vim組み込みで用意されている補完とは違い、文脈を解析して行う補完です。関数を<code>'omnifunc'</code>に設定し、<code>&lt;C-x&gt;&lt;C-o&gt;</code>のキーシーケンスを入力することで呼び出されます。標準でもいくつかの言語のオムニ補完関数が用意されていますが、ユーザーが自分で定義することができます。</p>
				
				<p><code>inoremap &lt;expr&gt;&lt;C-x&gt;&lt;C-o&gt;  &amp;filetype == 'vim' ? "\&lt;C-x&gt;&lt;C-v&gt;&lt;C-p&gt;" : neocomplcache#manual_omni_complete()</code></p>
				
				<p>私はこのようにキーマッピングを設定し、Vim組み込みのオムニ補完を置き換えています。</p>
				
				<h2>拡張機能</h2>
				
				<p>neocomplcacheのオムニ補完には次のような拡張機能があります。</p>
				
				<h3>自動補完の文脈定義</h3>
				
				<p><code>g:NeoComplCache_OmniPatterns[filetype]</code>を設定すれば、呼び出し条件をカスタマイズしたり、呼び出しを無効化することができます。</p>
				
				<h3>多数の言語に対応</h3>
				
				<p>AutoComplPopでは標準でPerl/Ruby/html/CSS/Pythoのオムニ補完が可能です。neocomplcacheではPerl以外の確認できたすべての言語に対応しています。キーワードパターンに追加するだけなので、新たな言語に対応させることが容易です。</p>
				
				<h3>補完スキップ</h3>
				
				<p><code>g:NeoComplCache_EnableSkipCompletion</code>が1ならば（デフォルト）、候補の取得に時間がかかりすぎる場合、補完をスキップすることができます。</p>
				
				<h3>ワイルドカード</h3>
				
				<p>ほかの補完と同様、ワイルドカードによる絞り込みに対応しています。</p>
				
				<h3>エラーを出さない</h3>
				
				<p>特定のオムニ補完では、変な場所で呼び出すとエラーを出したりすることがあります。neocomplcacheではエラーをcatchしているので、neocomplcache内部にバグがない限り、オムニ補完中にエラーになることはありません。</p>
				
				<h3>補完環境の厳密な判定</h3>
				
				<p>PythonやRubyのオムニ補完は<code>:python</code>や<code>:ruby</code>が正常に動作する環境でなければ動作しません。よって、内部で判定しています。</p>
				
				<h3>ファイル名補完やバッファ名補完との同時呼び出し</h3>
				
				<p>オムニ補完とほかの補完を同時に呼び出せないAutoComplPopとは違い、neocomplcacheのオムニ補完はほかの補完と統合されています。
				よって、同時に候補を出すことができるので、さらに便利に使えます。
				ただし、オムニ補完の開始パターンが先にマッチした場合、オムニ補完の候補のみが計算されて表示されます。
				これはVim自体の仕様です。これを防ぐためには、一度補完のポップアップを閉じて、補完を再呼び出しするしかありません。</p>
				
				<h3>キーワードの収集</h3>
				
				<p>空文字列でオムニ補完を呼び出してキーワードを収集してキャッシュし、オムニ補完候補として利用することができます。</p>
				
				<h2>neocomplcacheからオムニ補完関数を呼び出すときの注意</h2>
				
				<p>neocomplcacheは大抵のオムニ補完関数に対応していますが、オムニ補完関数を内部で無理矢理呼んで変換するという動作を行っているので、呼び出す関数によっては補完がうまく働かないことがあります。現在、<code>complete_add()</code>関数を内部で呼んでいる場合には動作がおかしくなることがわかっています。これはオムニ補完関数側が<code>complete_add()</code>を呼ばないようにするしかありません。
				他に、Rubyのオムニ補完は時々フリーズする現象があることが報告されています。
				これはRubyのオムニ補完が外部インタフェースを内部で使用しているためだと思われます。
				Vimの外部インタフェース機能は不安定なので、時々エラーをはいたりフリーズすることがあります。
				無効にしたい場合は.vimrcで</p>
				
				<pre>
if !exists('g:NeoComplCache_OmniPatterns')
let g:NeoComplCache_OmniPatterns = {}
endif
let g:NeoComplCache_OmniPatterns['ruby'] = ''
</pre>
				
				<p>と設定すると、無効にできます。これでは不便なので、Rubyのオムニ補完を書き直してくれる人を現在募集中です。</p>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/01/hack119/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #111: neocomplcache Hacks(1)　ファイル名補完</title>
		<link>http://vim-users.jp/2009/12/hack111/</link>
		<comments>http://vim-users.jp/2009/12/hack111/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 15:00:47 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>
		<category><![CDATA[neocomplcache]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=971</guid>
		<description><![CDATA[				neocomplcache Hacksでは、neocomplcacheの機能を詳細に解説していきます。一回目の今回はファイル名補完です。一見地味な補完ですが、うまく活用すると非常に便利です。
				
				フ [...]]]></description>
			<content:encoded><![CDATA[				<p>neocomplcache Hacksでは、neocomplcacheの機能を詳細に解説していきます。一回目の今回はファイル名補完です。一見地味な補完ですが、うまく活用すると非常に便利です。</p>
				
				<h2>ファイル名補完とは</h2>
				
				<p>ファイル名補完とは、Vim組み込みで用意されているファイル名補完を置き換えるためにneocomplcache上で実装した補完です。Ver.3.0より機能が分離され、neocomplcacheの１プラグインとなっています。<script language="vim-script">glob()</script>を解析して候補を出すため、組み込みのファイル名補完と同じように動作しますが、機能が大幅に拡張されています。特にファイル名を指定するときや、シェル拡張系のプラグインを使用するときに効果を発揮します。</p>
				
				<pre>
inoremap &lt;expr&gt;&lt;C-x&gt;&lt;&lt;C-f&gt;  neocomplcache#manual_filename_complete()
</pre>
				
				<p>私はこのようにキーマッピングを設定し、Vim組み込みのファイル名補完を置き換えています。</p>
				
				<h2>拡張機能</h2>
				
				<p>neocomplcacheのファイル名補完には次のような拡張機能があります。</p>
				
				<h3>ワイルドカードに対応</h3>
				
				<p>＊.txtのような、ワイルドカード文字が補完に使えます。
				実行ファイル、読み取り専用ファイル、ディレクトリの表示
				表示をわかりやすくするため、ファイルの種類を判別し、実行ファイルには＊を、読み取り専用ファイルには[-]を、ディレクトリには/をそれぞれ付加します。
				Windowsでは$PATHEXTを参照するので、より正確な判別が可能です。</p>
				
				<h3>短縮ファイル名補完</h3>
				
				<p>/u/s/lのようにディレクトリの先頭名だけ入力することで、/u＊/s＊/lのように解釈されます。素早く補完したいときに便利ですが、候補が多いと重くなります。</p>
				
				<h3>補完スキップ</h3>
				
				<p>g:NeoComplCache_EnableSkipCompletionが1ならば（デフォルト）、ファイル名の取得に時間がかかりすぎる場合、補完をスキップすることができます。</p>
				
				<h3>Cygwin対応</h3>
				
				<p>Vim組み込みのファイル名補完では/cygdrive/の入力で補完が重くなってしまいますが、neocomplcacheのファイル名補完では対策されています。</p>
				
				<h3>&#8230;-&gt;../..変換</h3>
				
				<p>&#8230;を../..に変換して解釈することができます。上のディレクトリを参照するときに便利です。</p>
				
				<h3>_, -, .による区切り補完</h3>
				
				<p>_, -, .を区切り文字として曖昧補完ができます。たとえば、h_.txtはh<em>_</em>.txtと同じ意味です。</p>
				
				<h3>環境変数を展開しない</h3>
				
				<p>組み込みのファイル名補完の場合、環境変数が勝手に展開されてしまうので、逆に邪魔になってしまうことが多々あります。neocomplcacheのファイル名補完は環境変数とマッチする部分はそのままにするので、便利に使うことができます。</p>
				
				<h2>zshとの比較</h2>
				
				<p>neocomplcacheのファイル名補完は自動的に候補が表示できるのが一番の魅力で、特にvimshellとの連携はすばらしいです。zshでも設定すれば自動補完ができないことはないのですが、誤爆の可能性も高く、おすすめできません。自動でファイル名補完ができることに慣れてしまうと、いちいち&lt;TAB&gt;を連打しなくてはいけないシェルの補完が煩わしく感じることでしょう。</p>
				
				<h2>vimshellとの併用</h2>
				
				<p>neocomplcacheのファイル名補完は元々<a href="http://github.com/Shougo/vimshell">vimshell</a>上で利用するために作られました。vimshellとはVim上でシェルを実装したプラグインです。neocomplcacheとは独立していますが、neocomplcacheがインストールされている場合、補完時にneocomplcacheの機能を使用します。vimshellはneocomplcacheと比較しても複雑なプラグインなので、機会があれば詳しく解説したいと思います。</p>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2009/12/hack111/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>USSR#1: neocomplcache ソースコード読解会</title>
		<link>http://vim-users.jp/2009/12/ussr1/</link>
		<comments>http://vim-users.jp/2009/12/ussr1/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 07:36:02 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[イベント]]></category>
		<category><![CDATA[neocomplcache]]></category>
		<category><![CDATA[Vim script]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1220</guid>
		<description><![CDATA[				文責: ujihisa, Shougo, sorah
				
				今日は neocomplcache-4.0.3/autoload/neocomplcache.vim を読みました。
				
				勉強 [...]]]></description>
			<content:encoded><![CDATA[				<p>文責: <a href="http://ujihisa.blogspot.com/">ujihisa</a>, <a href="http://vinarian.blogspot.com/">Shougo</a>, <a href="http://codnote.net/">sorah</a></p>
				
				<p>今日は <code>neocomplcache-4.0.3/autoload/neocomplcache.vim</code> を読みました。</p>
				
				<p>勉強会チャットログはこちら: <a href="http://lingr.com/room/vim/archives/2009/12/22">http://lingr.com/room/vim/archives/2009/12/22</a></p>
				
				<p>特にしっかりと読んだ関数:</p>
				
				<ul>
				<li><code>function! neocomplcache#enable()</code></li>
				<li><code>function! s:complete()</code></li>
				<li><code>function! s:integrate_completion(complete_result)</code></li>
				</ul>
				
				<p>APIとなる<code>neocomplcache#</code>ではじまる関数群が<code>autoload/neocomplcache.vim</code>の上部にまとめて定義されています。
				また、内部で使う関数群が続いて下部にスクリプトローカルで定義されています。</p>
				
				<p>興味深い部分の抜粋:</p>
				
				<pre><code>echo ''
redraw
</code></pre>
				
				<p><code>redraw!</code>だと画面がちらつくので、そういうときはこの二行で、ということだそうです。</p>
				
				<h2>まとめ</h2>
				
				<p>&#8220;neocomplcacheのソースコードは<em>魔界</em>&#8220;</p>
				
				<p>コード自体はすばらしく整理されているものの、
				Vim自体とその周囲の問題を解決するために涙が止まらない努力が随所に見られます。</p>
				
				<ul>
				<li>ATOK</li>
				<li>画面のチラツキ</li>
				<li>速度 (skip)</li>
				<li>プラグイン</li>
				<li>補完の統合</li>
				<li>頻度解析</li>
				</ul>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2009/12/ussr1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
