ホーム > タグ > neocomplcache

neocomplcache

Vimテクニックバイブル紹介(Shougo版)

この記事について

この記事は、開発環境勉強会における「Vimテクニックバイブル」紹介スライドの完全版です。 「Vimテクニックバイブル」については、taku_oさんやmattnさんなども記事を書いていますが、 私の場合はできるだけ本の内容に触れたものにしています。 これを読んでVimテクニックバイブルを購入していただける人が増えれば、著者達にとって最高の喜びです。

Vimテクニックバイブルができた背景

以前にもブログの記事で触れていますが、Vim界には良質な記事や書籍が不足しています。 特に、まともにVim scriptを書ける人が書いた書籍がほとんどありません。 これはVim界の大きな損失であり、Vim scriptプログラマーが育たない大きな原因となっています。 私がVim勉強会に参加すると、必ずといっていいほど聞かれるのが 「Shougoさんは、Vimの書籍を書かないんですか?」ということです。 この声になかなか答えられないのは悲しいものがありました。

Vimテクニックバイブル

と、いうことで……今年ついにVimの書籍が刊行されます! 書名は「Vimテクニックバイブル」です。 中身は「Emacsテクニックバイブル」のVim版となっており、イメージカラーは当然Vimグリーンです。 そういえば、EmacsテクニックバイブルはEmacsブルー(パープル)でしたね。 キャッチコピーは、「unite.vimで進化する新しいVimの常識を教えます。あなたはVimの本当の姿を知っていますか?」 Emacsテクニックバイブルとは違い、unite.vimを全面に押し出しています。

執筆者紹介

執筆陣はかなり豪華です。おそらく、これだけの人達が一冊の書籍を作るために集まることはもうないでしょう。

taku_o

人気サイト「名無しのVim使い」の管理人です。雑誌にVimの記事を執筆したことがあります。 サイトで紹介しているだけあって、様々なプラグインについて、かなりの知見を持っています。

yukimi

章の基礎知識や用語の統一など、細かいところで手伝ってもらっています。Vim使いです。

mattn

webapi-vimやzencoding.vimの作者です。他にも細かなプラグインを作っています。 KaoriYaさんと同じく、昔からVimにパッチを多数送っており、Vimの内部実装や黒魔術に詳しいです。

thinca

quickrunやref.vim, scouter.vimなどの作者です。unite.vimのsourceやvital.vim, eskk.vimなどにも関わっています。 Vim scriptにかなり詳しいです。

fuenor

QFixHowm, QFixGrep, JPFormat.vimの作者で、Vim-UTF8を配布しています。 Windows環境での日本語の扱いについて詳しいです。

Shougo

neocomplcache, vimshell, vimproc, unite.vim, vimfilerなどを作っています。 メンテナンスしているプラグインが多すぎて、なかなか時間が足りないのが悩みです。Vimは環境だと思っています。

内容紹介

もう執筆がほぼ終わっているため、中身は確定しています。プラグインの紹介を中心とした豪華な内容となるようにしました。 紹介しているプラグインは定番からマイナーまで幅広く、作者自ら解説していることもあります。 まだ発売まで期間があるため、詳しい目次を挙げることはできませんが、以下のような内容が含まれています。

vimfiler

vimfilerの使い方や、キーマッピング、マニアックなところではvimfilerを用いた拡張リネーム機能について解説しています。

netrw

netrwによる遠隔地ファイル編集、netrwによるブックマーク、netrwによるファイル操作が解説されています。

quickrun

quickrunの使い方、各種オプション、設定方法について解説されています。

ref.vim

ref.vimの使い方、各種sourceについて解説されています。

vimshell(インタプリタ通信機能を含む)

vimshellの使い方、よく使われる内部コマンド、vimshellのインタプリタ通信機能を解説しています。 ちなみに、Emacsテクニックバイブルでは、eshellについて触れられていません。

Conque

Vimで端末を実現するプラグインであるConqueの使い方、vimshellとの違いについて解説しています。

skk.vim

SKKについて解説しています。eskk.vimも少しだけ書いてあります。それほどページはありません。

neocomplcache

neocomplcacheの使い方、設定方法、neocomplcacheのスニペット機能、スニペットの書き方、 neocomplcacheのsourceの作り方と、大変豪華な内容となっています。 以前Vim Hacksに書いた内容の完全版と言っても良いでしょう。

zencoding.vim

zencoding.vimの基本から、任意の言語への応用例まで挙げられています。

QFixHowm

QFixHowmの使い方、メモの作成方法、メモの検索、ToDo管理について解説されています。

QFixGrep

Windows環境のgrepの注意点についても解説されています。

JPFormat.vim

JPFormatによる日本語の整形方法について解説されています。

autodate.vim

webapi-vim

VimからWebサービスを扱う方法について解説されています。

project.vim

project.vimによるプロジェクト管理やproject.vimの設定方法について解説されています。

Vim scriptが分からない初心者でも安心!

Vimの設定や、Vim pluginについての解説を中心とした書籍となっていますが、 ある程度のVim scriptの知識は必要不可欠です。 そこで、次のような項目について解説しています。 これ以上の詳しい解説については、Vimのヘルプを参照してください。

:helpの読み方

Vimの:helpをすぐに引けるかどうかは、初心者と初級者を分ける大変重要なファクターとなっています。 この本では、Vimの:helpの使い方について解説しています。

Vim script基礎文法最速マスター(改訂版)

これは、thincaさんが以前ブログで書いていた「Vim script基礎文法最速マスター」の改訂版です。 Vim scriptについて一通り学ぶことができます。

マッピングについて

Vimのキーマッピングは大変ややこしいですが、詳しく解説しています。

オプションについて

Vimのオプションには落とし穴が多数あります。Vimのオプションにおける仕様について解説しています。

Vimプラグインの管理

Vimのプラグインをインストールするなら、パッケージマネージャは必要不可欠です。 定番のVundle, pathogenから、vimballに至るまで解説をしています。

テキストオブジェクト

最近のVimを語るにはなくてはならない機能です。 テキストオブジェクトの拡張についても触れられています。

QuickFix

grepやmakeには欠かせない機能です。

:autocmd

外部インタフェース

ちょっとレベルが高いですが、Perl, Pythonの外部インタフェースについて解説されています。

最近のVimといえば、unite.vimは外せないよね!

当然unite.vimについては、1つのChapterを贅沢に使用して解説しています。 Emacsテクニックバイブルはanything.elについて2つのChapterを使っているので、そちらよりは若干量が減ります。 それでも、30ページくらいはあるため、十分満足できると思います。 unite.vimの章では、次の内容を解説しています。 これを読めばあなたもunite.vimマスターに!

vimfiler, vimshellなどといった他のプラグインとの連携

unite.vimの有用なsource

カスタマイズ方法についての解説

unite.vimの各種オプションについて、解説しています。 マニアックなところでは、buffer-name-optionについての解説もあります。

source, kind, action, filterの解説

特にsourceを自作する場合、source, kind, action, filterの概念は重要です。それぞれの仕様について詳しく解説しています。 作者が自ら書いているため、情報が正確で安心です。

sourceの作り方まで載っている!

サンプルsourceの作り方が書いてあります。マニアックなところでは、非同期sourceの仕様についても書いています。

unite.vim Ver.2.2対応(一応)

一応最新版のunite.vimの仕様に準拠しています。残念ながら、あまりにも新しい機能は解説できていません。 不変的な情報に絞って解説しています。 現在開発中のunite.vim Ver.3.0について少しだけ触れています。

もちろん、Emacsの人達にもオススメ

EmacsテクニックバイブルがVimmerにも有用な本であったように、 当然VimテクニックバイブルはEmacsを使っている方々にもオススメです。 Emacsを使っている人も、異文化交流は重要です。 同じ環境で満足していたら、何も生まれません。 auto-complete.elもVimの補完機能を参考にしています。 つまり、Emacs使いであってもVimや他のエディタからも刺激を受けるべきなのです。 この本を読めば、最近のVimの機能やプラグインについて分かります。 例えば、unite.vimとanything.elの違いが分かります。 新人にVimを教えざるをえないときにも使えます。 さらに、一身上の理由により、Vimに乗り換えざるをえないときもVimテクニックバイブルの知識があれば安心ですね。

現在確定している情報

ページ数は384Pで、Emacsテクニックバイブルと同じです。 値段は¥2, 980+税です。基本的に技術書というのは、¥3000を越えると購入までのハードルが上がってしまいます。 ページをできるだけ減らしたこともあり、税抜きでなんとか¥3000は切ったのですが、若干Emacsテクニックバイブルより高くなってしまいました。 発売日は9月中旬予定ですが、詳しい日付けの確定はしていません。 目次については、八月中に確定する予定なので、九月には詳しい情報が出せるでしょう。 まだ発売まで時間があるので、しばらくお待ちください。

残念ながら載せられなかった内容

できるだけ、著名なプラグインは載せるように心がけましたが、 ページ数の都合やその他様々な理由により載せられなかったプラグインがあります。 ここではそれらについて紹介します。

VCSとの連携

VCSと連携できるプラグインとしては、git-vimやfugitive.vimがありますが、決定版と呼べるようなものがなかったためです。 vcs.vimが候補だったんですが、未完成でした。

shadow.vim

時間とページ数の都合が付きませんでした。

snipMate

neocomplcacheのスニペット機能で十分だったためです。解説する人もいませんでした。 ちなみに、snippetsEmuはページ数が足りませんでした。

echodoc

入れてもよかったんですが、他のTipsが削られすぎて入れる暇がありませんでした。

netrwについての詳しい解説

時間とページ数の都合がつきませんでした。 ただし、一部のTipsでnetrwの機能について触れられています。

metarw

使っている人があまりに少ないため削られました。metarwがやっていることは、vimfiler+unite.vimでできるようになる予定です。

vimprocの使い方について

書籍では簡単にvimprocについて触れていますが、さすがに詳しい解説はできませんでした。 想定読者にとっては難しすぎるからです。vimprocをバリバリ使えるような層では、Vim scriptから使い方を解読するのも簡単だと思います。

vital.vim

このプラグインは、プラグイン制作者のためのものです。この本の対象読者にはレベルが高すぎました。 それに、ページ数の余裕もありませんでした。

内容の陳腐化への懸念について

書籍は生物です。コンピュータに関する書籍は出たばかりのときに購入しておかないと、役に立つ前に時代遅れとなってしまうでしょう。 だからこの本が必要なら、発売されたらすぐに購入するのが適切です。特に、一度絶版になってしまったら取り返しがつきません。 本の売り上げが上がると、出版社に対するVimへの印象が良くなり、続編などが企画されるかもしれません:-)

特に私のプラグインは進化が早いため、本が出たらすぐに時代遅れとならないか心配してくれている人がいるようです。 はい。それは正しい指摘です。 ただ、私もそのことは分かっていました。だからわざと新しすぎる機能や、あまり使われない機能については本の中では解説せず、 「適時:helpを参照してください」ということになっています。できるだけ不変であろうことについて解説するようにしています。 それでも現在の実装と齟齬がでてきてしまった場合は、正誤表にて何かしらのフォローをする予定です。

「:helpに全部書いてあるから書籍は必要ない」という意見について

これはある意味事実です。だからこそ、本の対象とする読者は「Vimの基本的な操作や設定はできるが、:helpを自在に引くことはできない層」なのです。 :helpはリファレンスマニュアル的であり、分からない語句を検索するときに使います。 初心者が通読するには向いていません。 本というのは初心者が参照しやすいように、重要な情報をふるい分けることに価値があると考えています。

ただし、私が自分の記事の中で気をつけたのは、できるだけ「設計思想や使い方について解説をする」ことです。 これは:helpに書いていないことが多いうえに、内容が陳腐化することも少ないと考えました。 だから、ヘルプを自由自在に参照することができる、レベルが高いVim使いにとっても役立つ書籍だとは思います。 これが本当かどうかは、自分の目で本を見て確認してください。

なぜ「Vimテクニックバイブル」はVim scriptを学ぶ本ではないのか

それは需要がないからです。考えてみてください。あなたの周囲にVim scriptをバリバリ書けるような人はいますか? Vimが好きだから、Vim scriptを本格的に学びたいと考えている人はいますか? まずいないでしょう。「Vimテクニックバイブル」の内容ですら出版社からはリスクがあると考えられている現状において、 日本でVim scriptを学ぶための書籍が出る確率は0です。おそらく売れません。 「Vimテクニックバイブル」にはVim scriptの解説がある程度書いてあります。 しかし、一流のVim scripterになるための道はまだまだ険しいのです。

それでもVim script本の構想を諦めきれない場合は、まず「Vimテクニックバイブル」を購入し、その本に書いてあることを全てマスターしてください。 さらに「Vimテクニックバイブル」を周囲に宣伝し、全国のVimmerのVimレベルを上昇させてください。 その暁には、Vim script本の出版リスクは低減され、いつの日か発売されるかもしれません。

オマケ

今後、vim-users.jpで「Vimテクニックバイブル」に関する何かが掲載されるかもしれません。こうご期待! ちなみに、Vimテクニックバイブルを購入してもらった場合、勉強会でShougoのサインが貰えるかもしれませんよ!

Shougo

Hack #193: neocomplcacheの設定について知る 後編

後編では残りの設定について解説をします。

設定例

    " Shell like behavior(not recommended).
    "set completeopt+=longest
    "let g:neocomplcache_enable_auto_select = 1
    "let g:neocomplcache_disable_auto_complete = 1
    "inoremap <expr><TAB>  pumvisible() ? "\<Down>" : "\<TAB>"
    "inoremap <expr><CR>  neocomplcache#smart_close_popup() . "\<CR>"
    
    " Enable omni completion.
    autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
    autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
    autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
    autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
    autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags
    
    " Enable heavy omni completion.
    if !exists('g:neocomplcache_omni_patterns')
        let g:neocomplcache_omni_patterns = {}
    endif
    let g:neocomplcache_omni_patterns.ruby = '[^. *\t]\.\w*\|\h\w*::'
    "autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete

Shell like behavior(not recommended).

set completeopt+=longest

let g:neocomplcache_enable_auto_select = 1

let g:neocomplcache_disable_auto_complete = 1

inoremap <expr><TAB> pumvisible() ? “\<Down>” : “\<TAB>”

inoremap <expr><CR> neocomplcache#smart_close_popup() . “\<CR>”

neocomplcacheをShellのような手動補完をするようにする設定です。 (not recommended)という文面からも分かる通り、オススメの設定ではありません。 要望が来たので対応させて、設定例として書いたものです。 これを設定すると自動補完が無効になる点に注意してください。

” Enable omni completion.

ここは、Vimに用意されているオムニ補完を有効化するものです。すでに設定されている場合は必要ありません。 neocomplcacheからオムニ補完を呼びたい場合には必要になります。 オムニ補完関数を設定するだけでは実際にはだめで、後述するg:neocomplcache_omni_patternsも同時に設定する必要があります。

” Enable heavy omni completion.

g:neocomplcache_omni_patternsは、neocomplcacheがオムニ補完の関数を呼び出すためのキーワードパターンを設定します。 主な言語にはデフォルトで対応していますが、RubyやPHPなど重いものは無効化されています。 設定例のようにすれば有効化できますが、Vimがフリーズする可能性もあります。自己責任で使用してください。

Shougo

Hack #185: neocomplcacheの設定について知る 中編

中編では、主にneocomplcacheのキーマッピングについて解説をします。

設定例

    " Plugin key-mappings.
    imap <C-k>     <Plug>(neocomplcache_snippets_expand)
    smap <C-k>     <Plug>(neocomplcache_snippets_expand)
    inoremap <expr><C-g>     neocomplcache#undo_completion()
    inoremap <expr><C-l>     neocomplcache#complete_common_string()
    
    " SuperTab like snippets behavior.
    "imap <expr><TAB> neocomplcache#sources#snippets_complete#expandable() ? "\<Plug>(neocomplcache_snippets_expand)" : pumvisible() ? "\<C-n>" : "\<TAB>"
    
    " Recommended key-mappings.
    " <CR>: close popup and save indent.
    inoremap <expr><CR>  neocomplcache#smart_close_popup() . "\<CR>"
    " <TAB>: completion.
    inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
    " <C-h>, <BS>: close popup and delete backword char.
    inoremap <expr><C-h> neocomplcache#smart_close_popup()."\<C-h>"
    inoremap <expr><BS> neocomplcache#smart_close_popup()."\<C-h>"
    inoremap <expr><C-y>  neocomplcache#close_popup()
    inoremap <expr><C-e>  neocomplcache#cancel_popup()
    
    " AutoComplPop like behavior.
    "let g:neocomplcache_enable_auto_select = 1

imap <C-k> <Plug>(neocomplcache_snippets_expand)

<C-k>でスニペットの展開をできるようにします。<C-k>が取られてしまうのが気に入らない場合は、 後述するneocomplcache#sources#snippets_complete#expandable()を使ったほうが良いでしょう。 smapも同時に設定しないと、デフォルト値が選択されているときに展開やジャンプがされません。

inoremap <expr><C-g> neocomplcache#undo_completion()

前回行われた補完をキャンセルします。

inoremap <expr><C-l> neocomplcache#complete_common_string()

補完候補のなかから、共通する部分を補完します。ちょうど、シェルの補完のような動作です。

imap <expr><TAB> neocomplcache#sources#snippets_complete#expandable() ? “\<Plug>(neocomplcache_snippets_expand)” : pumvisible() ? “\<C-n>” : “\<TAB>”

SuperTabの挙動をエミュレーションしています。スニペットが展開可能なら展開を、補完中なら次の候補を選択、そうでなければ<Tab>を挿入します。 普通の人には必要がないため、コメントアウトをしています。

inoremap <expr><C-h> neocomplcache#smart_close_popup().”\<C-h>”

<C-h><BS>を押したときに確実にポップアップを削除します。 これがなくてもneocomplcacheは動作しますが、このマッピングを使ったほうが確実です。 特に、g:neocomplcache_enable_auto_selectを有効にしている場合はこの設定をしないと確実に補完が誤爆します。

inoremap <expr><C-y> neocomplcache#close_popup()

現在選択している候補を確定します。 これがなくてもneocomplcacheは動作しますが、このマッピングを使ったほうが確実です。

inoremap <expr><C-e> neocomplcache#cancel_popup()

現在選択している候補をキャンセルし、ポップアップを閉じます。 これがなくてもneocomplcacheは動作しますが、このマッピングを使ったほうが確実です。 特にneocomplcacheは実装の関係で、2回<C-e>を押さなければポップアップを閉じることができません。 よって、このマッピングは設定しておくことをお勧めします。

let g:neocomplcache_enable_auto_select = 1

AutoComplPopのように最初の候補を選択するための設定です。 便利ですが誤爆しやすいため、デフォルトでは無効化しています。 この設定を有効化する場合、キーマッピングを工夫する必要があります。

Shougo

Hack #177: neocomplcacheの設定について知る 前編

最近、neocomplcacheはかなり有名になってきました。しかし設定項目が多いせいで使いこなせない、という人は後を絶たないようです。ヘルプを見れば解決する訳なのですが、膨大なヘルプをいちいち読んでいられない人も多いことでしょう。ということで、数回に分けてneocomplcacheの設定例について解説したいと思います。ちなみに、ヘルプに書いてあるneocomplcacheの設定例は私の普段使っている設定を元にしたものです。

設定例

今回は、下の設定について一行ずつ解説をしたいと思います。

    " Disable AutoComplPop.
    let g:acp_enableAtStartup = 0
    " Use neocomplcache.
    let g:neocomplcache_enable_at_startup = 1
    " Use smartcase.
    let g:neocomplcache_enable_smart_case = 1
    " Use camel case completion.
    let g:neocomplcache_enable_camel_case_completion = 1
    " Use underbar completion.
    let g:neocomplcache_enable_underbar_completion = 1
    " Set minimum syntax keyword length.
    let g:neocomplcache_min_syntax_length = 3
    let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*'
    
    " Define dictionary.
    let g:neocomplcache_dictionary_filetype_lists = {
        \ 'default' : '',
        \ 'vimshell' : $HOME.'/.vimshell_hist',
        \ 'scheme' : $HOME.'/.gosh_completions'
            \ }
    
    " Define keyword.
    if !exists('g:neocomplcache_keyword_patterns')
        let g:neocomplcache_keyword_patterns = {}
    endif
    let g:neocomplcache_keyword_patterns['default'] = '\h\w*'
    

let g:acp_enableAtStartup = 0

AutoComplPopを無効化する設定です。AutoComplPopとneocomplcacheは競合するためです。AutoComplPopがインストールされていない場合は必要ありません。

let g:neocomplcache_enable_at_startup = 1

neocomplcacheを起動時に有効化する設定です。AutoComplPopと違ってneocomplcacheは自動起動しないので、普段使用するにはこの設定が必要です。 そうでないと、毎回:NeoComplCacheEnableを実行しなければいけません。

let g:neocomplcache_enable_smart_case = 1

neocomplcacheのsmart case機能を有効化します。 smart caseは'smartcase'と同様に、大文字が入力されるまで大文字小文字の区別を無視するという機能です。

let g:neocomplcache_enable_camel_case_completion = 1

neocomplcacheのcamel case機能を有効化します。 camel caseは大文字を区切りとしたワイルドカードのように振る舞うという機能です。FAと入力すると、内部ではF*A*のように変換されます。 ただし若干重くなるので私は使っていません。Javaのように大文字を多様した長いキーワードが多い言語に有効です。

let g:neocomplcache_enable_underbar_completion = 1

こちらは_区切りの補完を有効化します。これは便利なことが多いでしょう。

let g:neocomplcache_min_syntax_length = 3

シンタックスをキャッシュするときの最小文字長を3にしています。デフォルトでは4です。 アセンブリ言語のレジスタ名など、短いキーワードもキャッシュしてくれるようになるのでオススメです。

let g:neocomplcache_lock_buffer_name_pattern = ‘*ku*’

neocomplcacheを自動的にロックするバッファ名のパターンを指定します。 ku.vimやfuzzyfinderなど、neocomplcacheと相性が悪いプラグインを使用する場合に設定します。

let g:neocomplcache_dictionary_filetype_lists = {

ファイルタイプ毎にneocomplcacheのディクショナリを設定することができます。 neocomplcacheは'dictionary'も見ますが、こちらを優先します。 g:neocomplcache_dictionary_filetype_listsはcontext filetypeでも参照できるので、できればこちらを設定するべきです。 私はvimshellの履歴ファイルをディクショナリに設定し、簡単にコマンドを入力できるようにしています。

let g:neocomplcache_keyword_patterns['default'] = ‘\h\w*’

キーワードパターンの設定です。 neocomplcacheが対応していない独自の言語を使いたい場合は、これを変更しないといけません。 let g:neocomplcache_keyword_patterns['default']を変更しているのは、 デフォルトが\k\+となっていて、日本語も収集してしまう仕様が個人的に好きではないからです。

Shougo

Hack #169: neocomplcacheを拡張する 後編

前編からかなり間が空いてしまいましたが、ここではneocomplcacheのプラグインの記述方法を解説します。neocomplcache Ver.5.1ではプラグインの構成がかなり変化したので、この記事を参考にしてください。

プラグインの仕様

プラグインはautoload/neocomplcache/sourcesにインストールしたものが自動的に読み込まれます。 プラグインには、neocomplcache#sources#プラグイン名#define()が絶対必要です。 これはneocomplcacheが初期化するときに呼ばれ、neocomplcacheにディクショナリ変数を渡します。 ここではディクショナリ変数に必要な要素について説明をします。

name

プラグインの名前です。

kind

プラグインの種類を現します。plugin, ftplugin, complfuncの三種類があります。これらの違いについては後述します。

filetypes

ftpluginにのみ存在します。どのファイルタイプで補完するかを表すディクショナリ変数です。

initialize()

プラグインの初期化時に呼ばれます。コマンドの登録等を行います。ftpluginの場合、これが呼ばれるのはfiletypesに対応するバッファで補完されたときです。

finalize()

neocomplcacheの無効化されるときに呼ばれます。ここで不要になったコマンドやautocmdを削除します。

get_keyword_list(cur_keyword_str)

pluginにのみ存在します。a:cur_keyword_strにマッチするリストを返すために呼ばれる関数です。get_keyword_list()が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。詳しくは「補完リストの仕様」の項を参照してください。

get_keyword_pos(cur_text)

ftpluginとcomplfuncに存在します。cur_textにマッチする補完位置を返します。

get_complete_words(cur_keyword_pos, cur_keyword_str)

ftpluginとcomplfuncに存在します。a:cur_keyword_strにマッチするリストを返すために呼ばれます。get_complete_words()が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。詳しくは「補完リストの仕様」の項を参照してください。

補完リストの仕様

get_keyword_list()get_complete_words()が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。一部のキー以外はVim標準の補完で使用するものと同じです。

word, abbr, menu, info, icase, dup

Vim標準の補完で使用するものと同じです。word以外は省略することができます。詳しい解説は、[Hack #14: ]Insert mode補完 自作編を参照してください。 menuはどのプラグインの候補で補完しているかを[B]のような記号で表す習慣になっています。ftpluginは[vim]や[ghc]のように、長めの文字列を使います。

プラグイン用ヘルパ関数

autoload/neocomplcache.vimには、プラグインから呼び出せるようにヘルパ関数が実装されています。ここでは、よく使われる関数について解説します。

neocomplcache#keyword_filter(list, cur_keyword_str)

get_keyword_list()で使用できる、単純なフィルターです。a:listの中から、a:cur_keyword_strにマッチするリストを返します。filter()とは違って、listは変更されるとは限りません。

neocomplcache#unpack_dictionary(dict)

リストの辞書をリスト化して返します。

neocomplcache#unpack_dictionary_dictionary(dict)

辞書の辞書をリスト化して返します。

neocomplcache#keyword_escape(cur_keyword_str)

a:cur_keyword_strをマッチングに使えるようにエスケープします。

neocomplcache#get_cur_text()

現在のカーソル文字列を取得します。

neocomplcache#get_completion_length(plugin_name)

plugin_nameの自動補完する文字列長を返します。

neocomplcache#set_completion_length(plugin_name)

plugin_nameの自動補完する文字列長を設定します。ただし、これはプラグイン側で初期値を設定するためのもので、ユーザーが補完文字列長を設定している場合、そちらが優先されます。

neocomplcache#get_keyword_pattern_end(filetype)

文字列の最後にマッチするfiletypeのキーワードパターンを返します。filetypeは省略可能で、省略すると現在のバッファのfiletypeを参照します。

neocomplcache#get_keyword_pattern(filetype)

文字列にマッチするfiletypeのキーワードパターンを返します。filetypeは省略可能で、省略すると現在のバッファのfiletypeを参照します。

neocomplcache#is_auto_complete()

自動補完の時に1を返します。

neocomplcache#print_caching(string)

キャッシュ時のメッセージを表示します。

neocomplcache#print_error(string)

エラーメッセージを表示します。

キャッシュ用ヘルパ関数

autoload/neocomplcache/cache.vimには、プラグインから呼び出せるキャッシュのヘルパ関数が含まれます。 量が多いので、ここでは詳しく説明することは避けますが、うまく利用すると簡単にキャッシュを使ったプラグインを記述できます。 ちなみに、neocomplcache Ver.4以降では、ほとんどのプラグインがキャッシュ用ヘルパ関数を使うように書き直されています。

プラグインのサンプル

neocomplcacheに標準添付のプラグインを参考にしても良いのですが、機能が複雑化しているため、プラグイン作りの勉強のために見るのは大変です。 eagletmtさんが作成したghc_completeはfiletype pluginでほどよい長さなので、勉強に最適でしょう。

plugin, ftplugin, complfuncの違い

neocomplcache Ver.3.00より、complfuncが実装され、より自由度の高い補完が実装できるようになりました。 pluginとcomplfuncの違いは、pluginはカーソル前のキーワードから補完しますが、complfuncは独自に補完位置を決定できるというところです。 ftpluginとはneocomplcacheのオムニ補完です。 基本的な仕様はcomplfuncと同じです。ただし、必要な時にのみ初期化や呼び出しされるというところが違います。

Shougo

Hack #165: neocomplcache Hacks(6) インクルード補完

今回はインクルード補完です。neocomplcacheに実装されたインクルード補完はあらかじめ設定しておく必要がありますが、使いこなせばタグ補完を越えた使い勝手となります。

インクルード補完とは

インクルード補完とは、バッファ中のインクルード文を解析して、補完候補に加える補完のことです。Vim自体にもインクルード補完が備わっていますが、Perlなど'path'が多数のディレクトリに設定されている言語では重すぎて使いものになりません。neocomplcacheのインクルード補完は結果をキャッシュすることで、Vim標準のインクルード補完に存在する欠点を補うために開発されました。タグ補完と比較すると、インクルードしているファイルだけ解析するので補完候補が多すぎる問題が発生しにくい、あらかじめタグファイルを生成する必要がない、といった利点があります。

インクルード補完の制限

インクルード補完は強力ですが、万能ではありません。'path''includeexpr', 'include'といったオプションが適切に設定されている必要があります。特にWindows環境では、ftpluginなどで設定する必要があるかもしれません。インクルード補完ではctagsを利用するので、システムにインストールされている必要があります。ctagsが存在しなかったり、ctagsに対応していない言語の場合(D言語など)はバッファをそのまま解析するので、buffer_completeと動作が同じになります。

今後のインクルード補完

現在実装されているインクルード補完はまだ実験的な意味合いが強いです。 今後は、gtagsへの対応やechodocへの対応、遅延キャッシュなどを考えています。 ただしgtagsはカレントディレクトリにタグファイルを作るらしく、ctagsのように簡単に解析するのは難しそうです。

参考文献

neocomplcache.vim のインクルード補完の使い方 thincaさんのインクルード補完解説記事。neocomplcache Ver.3.06を対象としていて、neocomplcache Ver.5.0がリリースされた現在では変数名等が古くなっていますが、参考になると思います。

Shougo

Hack #161: Command-line windowを使いこなす

普段我々が何げなく使っているCommand-line modeですが、使いこなすうちに様々な欠点が目につきます。このHackでは、Command-line modeを捨て去ってしまうことを提唱します。

Command-line modeの欠点

なぜCommand-line modeが使えないかというと、次のような欠点があるからです。

編集能力が貧弱

Command-line modeは基本的にラインエディタなので、シェル並の編集しかできません。テキストオブジェクトといった便利な機能も使えないのです。

自動補完ができない

もはや筆者は自動補完のある環境が普通になってしまい、neocomplcacheがないと仕事になりませんが、残念ながらCommand-line modeでは使えません。さらに、Command-line modeは補完も貧弱なので、困ったものです。

設定が分散する

Insert modeとCommand-line modeは独立しているので、キーマップ等は別々に定義しなければなりません。これは不便です。

履歴検索が面倒

Command-line modeでは、履歴検索が簡単にはできません。

cnoremap <C-n>          <Down>
cnoremap <C-p>          <Up>

とキーマップを定義する手はあります。これなら現在入力されているものにマッチする候補を検索することができます。しかしvimshellのように一覧から履歴を検索する方法はなく、そもそも設定が面倒です。検索にはfuzzyfinderkuを使うという手もありますが、この程度のことで外部プラグインに依存するというのもどうでしょうか。

Command-line window

そこで、本HackではCommand-line modeの代わりに、Command-line windowという機能を使うことを提案します。 Command-line windowとは何かというと、Vimに組み込まれている、Ex commandを実行できるバッファのことです。 Command-line windowは'filetype'がvimであるため、Vimのvim filetype pluginがすべて使えます。 特にneocomplcacheはVimのオムニ補完を搭載し、ユーザー定義のコマンドも解析できるため、併用するとneocomplcacheのパワーを存分に発揮することができます。 neocomplcacheは補完だけでなく、コマンドの引数情報をエコー領域に表示することもできます。 neocomplcacheに実装されている、Vimのオムニ補完は仕組みが複雑なので、今後のVim Hacksで詳しく解説する予定です。 Command-line windowについて詳しい情報は、:help cmdwinを参照してください。

Command-line windowを設定する

Command-line windowはウインドウに入ったときにInsert modeにならなかったり、neocomplcacheと相性が悪かったりして使いづらいので、カスタマイズする必要があります。筆者は.vimrc中で、次のように設定しています。この設定では:を入力したときにCommand-line windowに遷移するようにしています。CmdwinEnterにautocmdを設定すれば簡単にカスタマイズできるので、皆さんも最適な設定を探してみてください。

nnoremap <sid>(command-line-enter) q:
xnoremap <sid>(command-line-enter) q:
nnoremap <sid>(command-line-norange) q:<C-u>

nmap :  <sid>(command-line-enter)
xmap :  <sid>(command-line-enter)

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

  " Completion.
  inoremap <buffer><expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"

  startinsert!
endfunction

追記: Command-line windowでは、altercmdが使用できません。これでは不便なので、tyruさんがCommand-line windowでも使えるように改造したものを公開しているので、こちらを使ってください。 私は次のように設定しています。

function! s:init_cmdwin()
        call altercmd#define('b', 'gr[ep]', 'Grep', 'i')
        " AlterCommand <buffer><mode:i> gr[ep] Grepでも可
endfunction
Shougo

Hack #157: neocomplcache Hacks(5) タグ補完 ディクショナリ補完

今回はタグ補完とディクショナリ補完です。タグ補完は微妙ですが、ディクショナリ補完は便利に使えるでしょう。

タグ補完とは

タグ補完とは、’tags’から補完候補を取ってくることで補完することです。 Vim標準では<C-x><C-v>を用います。 neocomplcacheではtags_completeというプラグインによって実装されています。 .->といったg:neocomplcache_member_prefix_patterns[&filetype]にマッチする入力のあるときに補完を行うと、 クラスのメンバのみが補完候補となる機能を持っています。 要望があったので実装しましたが、私は個人的にタグ補完が好きではありません。なぜなら、タグ補完は候補が多くなりすぎるからです。 候補が多いとneocomplcacheのキャッシュや補完動作が明らかに遅くなります。 そこでtags_complete.vimでは、g:neocomplcache_caching_limit_file_sizeよりも大きいタグファイルは自動的にキャッシュしません。 どうしても使いたいならば、:NeoComplCacheCachingTagsコマンドを実行してください。 ctagsではタグを生成できない言語も多いので、現在ではより高機能なインクルード補完を用いるべきでしょう。インクルード補完については、今後のVim Hacksで解説予定です。

ディクショナリ補完とは

ディクショナリ補完とは、登録された辞書ファイルから補完候補を取ってくることで補完することです。 前回解説したシンタックス補完も一種のディクショナリ補完と言えます。 Vim標準では<C-x><C-k>を用います。 neocomplcacheではdictionary_completeというプラグインによって実装されています。 g:neocomplcache_dictionary_filetype_lists[&filetype]に辞書ファイルを登録しておけば、自動的にキャッシュされます。 例えば、vimshellでは履歴ファイルを辞書ファイルとして登録しておけば便利です。 g:neocomplcache_dictionary_filetype_lists[&filetype]が存在していない場合、自動的に’dictionary’の値が使われます。

Shougo

Hack #147: neocomplcache Hacks(4) シンタックス補完

四回目の今回はシンタックス補完を解説します。

シンタックス補完とは

シンタックス補完とは、標準添付プラグインのautoload/syntaxComplete.vimをさらに汎用的にし、neocomplcacheのプラグインとして独自実装したものです。 内部動作としては:syn listの結果を解析し、キーワードを補完候補に加えます。 1度目は候補をキャッシュするので、若干時間がかかりますが、その後は高速に動作します。 Vimの豊富なシンタックスキーワードを有効活用するので、辞書を別途用意する必要はなく、非常に便利です。

autoload/syntaxComplete.vimとの比較

autoload/syntaxComplete.vimはキーワード文字列しか解析できませんが、neocomplcacheのシンタックス補完は正規表現のパターンも解析するので、HaskellやTeXといったファイルタイプでもシンタックス補完が使えます。 ただし()や[]を使った複雑な正規表現では、上手くパースできないことがあります。 ご了承下さい。

Same FileType Completion

シンタックス補完はneocomplcache独自の補完機能である、Same FileType Completionに対応しています。 Same FileType CompletionとはCとC++のように、似たファイルタイプを関連付けて相互参照できるようにす機能です。 これにより、vimshellのiexeから起動したirbのバッファ上でRubyキーワードを補完できます。

使用上の注意

Action scriptやVim Scriptのautocmdを補完するとき、シンタックスの補完候補が小文字になってしまうことがあります。 これはシンタックスファイルの syn case ignore が悪さをしているせいです。プラグイン側では対処しようがないので、気になるようだったら直接シンタックスファイルを修正してください。

Shougo

Hack #128: neocomplcache Hacks(3) キーワード補完

三回目の今回はneocomplcacheのキーワード補完と拡張プラグインを解説します。

キーワード補完とは

neocomplcacheのキーワード補完は、<C-n><C-p>で呼び出すことのできるVim組み込みのキーワード補完を模倣して設計されています。 言語ごとにキーワードパターンを定義して、一括して候補を検索できるのが最大の特徴です。 使用するキーワードパターンはg:NeoComplCache_KeywordPatternsで定義されています。

pluginとcomplfuncの違い

neocomplcacheには補完候補を収集するために、pluginとcomplfuncという二つの拡張プラグインが存在します。 それぞれ、autoload/neocomplcache/pluginautoload/neocomplcache/complfuncに配置します。 pluginはkeyword_complete.vimから一括して呼びだされる拡張プラグインで、単純なため実装が比較的簡単です。 complfuncは補完開始位置を拡張プラグイン側で計算しないといけません。 その代わり、補完開始位置は自由に決定できるので、ファイル名補完のような複雑な補完を実装できます。 初期のneocomplcacheでは、complfuncは一つのプラグインしか呼べないという制限がありました。 現在のバージョンでは、complfuncの候補も統合できるように改良されているため、そのような制限はありません。

標準添付のplugin

buffer_complete.vim

開いているバッファから補完候補を収集するプラグインです。バッファ内の単語を解析することで、使用頻度の学習も行います。

dictionary_complete.vim

g:NeoComplCache_DictionaryFileTypeListsから補完候補を収集するプラグインです。

include_complete.vim

バッファで開いているインクルードファイルから補完候補を収集するプラグインです。Vimにもインクルード補完はありますが、より拡張されています。

snippets_complete.vim

スニペットを補完するプラグインです。補完するだけではなく、単体でスニペット展開プラグインとしても動作します。

syntax_complete.vim

シンタックスファイルからキーワードを補完するプラグインです。Vim標準添付のsyntaxcomplete.vimよりも高機能であり、結果をキャッシュするので高速です。複雑なTeXのシンタックスも解析できます。

tags_complete.vim

タグファイルからキーワードを補完するプラグインです。

標準添付のcomplfunc

completefunc_complete.vim

補完関数を登録することで、自動呼び出しするプラグインです。neocomplcacheはcompletefuncを上書きしてしまうので、その対策に使えます。 手動補完として補完関数を個別に呼び出しすることもできます。

filename_complete.vim

ファイル名を補完するプラグインです。詳しい解説は、[Hack #119: neocomplcache Hacks(2) オムニ補完]を参照してください。

keyword_complete.vim

pluginから候補を収集し、キーワードを補完するプラグインです。

omni_complete.vim

オムニ補完を呼び出し、候補を収集するプラグインです。詳しい解説は、[Hack #119: neocomplcache Hacks(2) オムニ補完]を参照してください。

vim_complete.vim

Vimのオムニ補完機能を提供するプラグインです。Vim標準の<C-x><C-v>よりも機能が拡張されていて、ローカル変数や引数の補完も可能です。

Shougo

Home > Tags > neocomplcache

Search
Feeds
Links
  • 公式
  • 勉強会
  • 情報
  • コミュニティ
  • Meta
    Etc
    Creative Commons License
    This blog is licensed under a Creative Commons License.

    Return to page top