-
Notifications
You must be signed in to change notification settings - Fork 135
/
neocomplcache.txt
833 lines (667 loc) · 40.4 KB
/
neocomplcache.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
neocomplcache
究極のVim的補完環境
Shougo
--------------------------------
neocomplcacheとは?
VimScriptによって実装された究極の補完環境。
auto-complete.elのように、自動補完のインタフェースを一つに統合することができます。
タグ補完やディクショナリ補完も自前で実装しています。
通称ネオコン、もしくはnecoと呼ばれています。
--------------------------------
入手方法
http://github.com/Shougo/neocomplcache/tree/master
vim.orgにも登録しました!
ただし、最新版はgithubにあります。
http://www.vim.org/scripts/script.php?script_id=2620
--------------------------------
使い方
まず、githubにある配布ファイルをVimのユーザディレクトリにインストールします。
Windowsの場合は$VIM/vimfiles/、MacやLinuxの場合は$HOME/.vim/が一般的です。
http://github.com/Shougo/neocomplcache/tarball/master
最近はファイルが増えてきたため、フォルダごとコピーした方がよいでしょう。
そして、.vimrcで
let g:NeoComplCache_EnableAtStartup = 1
と設定すると、Vimの起動時に自動的に有効になります。
手動で有効にしたいときには、
:NeoComplCacheEnableを実行してください。
:NeoComplCacheDisableで無効になります。
--------------------------------
アップグレード方法
neocomplcacheは更新が頻繁にあるので、簡単にアップグレードできると便利です。
残念ながらWindowsでは使えないですが、drryさんがワンライナーを作ってくれました。
wget -qO - http://github.com/Shougo/neocomplcache/tarball/master | tar -xzC ~/.vim --strip-components=1 --exclude=presen
Windowsでも使えるワンライナーを現在募集中です。
--------------------------------
似た機能を持ったスクリプト
・autocomplpop.vim
・auto-complete.el
どちらも有名なプラグインですので、ここで簡単に比較をしておきましょう。
--------------------------------
autocomplpop.vimの良いところ
・Vim標準の補完を呼ぶので高速
・一部の言語はオムニ補完にも対応
・情報が多い
・仕様が安定している
autocomplpop.vimの悪いところ
・カスタマイズがしづらい
・補完機能はVimの機能に制限されてしまう
・ATOK X3で暴走する
・日本語入力中も補完候補が出る
・なかなか更新されない
最近作者さんに時間ができたようなので、今後に期待です。
ただし基本的にVim標準の補完を呼び出すので、大幅な機能追加は望めないでしょう。
あまり設定をしなくても、それなりに動作します。
--------------------------------
auto-complete.elの良いところ
・補完機能のカスタマイズがしやすい
・キーバインドのカスタマイズが容易
・情報が多い
・プラグインで拡張でき、用意されているプラグインも豊富
・比較的開発が盛ん
・yasnippets.elを呼び出して、スニペットを検索できる
auto-complete.elの悪いところ
・Emacsen専用なので、Vimmerには使えない
・設定が面倒
・補完候補のスクロールができない
・標準では候補の絞り込みができない(別途プラグインをインストールすれば可)
・標準では部分マッチが使えない(別途プラグインをインストールすれば可)
・補完候補の情報が表示されない
提供する機能はシンプルですが、カスタマイズしやすいのはよいですね。
ただしプラグインを作成するためには、ソースコードを解析しないといけません。
--------------------------------
neocomplcacheの良いところ
・候補の絞り込みができる
・標準で部分マッチもできる
・単語の出現頻度によってソートができる
・補完機能のカスタマイズがしやすい
・補完機能はほとんど自前実装
・プラグインを追加することで拡張できる
・タグ補完やシンタックス補完が強力
・毎週のように更新
・スニペットを検索できる
・vimshellと連携できる
neocomplcacheの悪いところ
・行数の多いバッファを開くときに重い
・大量のバッファを開いていると遅くなる(ことがある)
・開発が早いので、不安定(なことがある)
・内部でcompletefuncを使っている
・メモリを大量に使う
・まだ発展途上なので、仕様変更が頻繁にある
・バグが多い
高機能なのが最大の魅力です。ただし良くも悪くも発展途上です。
仕様は予告無く変更される場合があります。
autocomplpopに満足できない、アルファギーク向け。
安定した物が良ければ、vim.orgに置いてある物を使ってください。
http://www.vim.org/scripts/script.php?script_id=2620
こちらも一ヶ月に一度は更新されると思います。
--------------------------------
neocomplcacheの歴史
これまで愛用していたautocomplpop.vimが
Linux GVim上のATOK X3でおかしくなる
↓
それなら自分で作ってしまえ!
↓
部分マッチも欲しいなぁとか思い始める
↓
それなら自分で作ってしまえ!
↓
補完が遅いなぁと思い始める
↓
それなら結果をキャッシュしてしまえ!
↓
今の時代はプラグイン化だ!
↓
スニペット補完も統合してしまおう
↓
さらなる暴走
↓
そして現在に至る……
詳しくはplugin/neocomplcache.vim内のChangeLog:で。
--------------------------------
neocomplcacheの代表的機能
・キーワードの使用頻度によるランク付け
・シンタックスごとのキーワード補完
・部分マッチ
・数字キーによるクイックマッチ
・ディクショナリ補完、タグ補完
・ワイルドカードによる検索結果の絞り込み
・結果のキャッシュによる高速化
・ファイル名補完
・カーソル後方のキーワードに応じた補完
・SmartCase
・豊富なカスタマイズ項目
・文脈依存補完(3-gram completion)
・Omni補完
・ローカルタグ補完
・自動タグファイルアップデート
・キーワード補完を試す
・Same filetype completion
・preview windowに対応
・シンタックス補完
・プラグインで拡張可能
・スニペット補完
面白そうな機能をどんどん追加していたら、かなり増えてきました。
あまりに多くの機能があるので、全てを把握しているのは作者くらいでしょう。
--------------------------------
キーワードの使用頻度によるランク付け
neocomplcacheではキーワード収集を自前で行っているため、
キーワードの使用回数を記録し、補完時の順位に反映させています。
使用頻度が高いものが上の方に来て、かなり便利です。
ただし解析するには時間がかかるので、キャッシュ率が上昇しないと使用頻度は考慮されません。
--------------------------------
シンタックスごとのキーワード補完
言語ごとにキーワードを登録して補完ができるので、
例えばRubyでは$や@, ., ::といったキーワードに反応して補完ができます。
標準でも様々な言語に対応していますが、
「この言語に対応して欲しい」という要望があれば、可能な限り対応します。
追記:
Ver.2.23より、正規表現には\vを使わなければいけなくなりました。
カスタマイズする場合には注意してください。
Ver.2.24より、.や->はキーワードに含めないようになりました。
他の補完機能と親和性を高めるための措置です。
代わりに、演算子を認識して補完できるようになったので、そちらを利用してください。
最近のバージョンでは対応言語も増えて、かなりパワーアップしています。
例えばRubyではブロック付きメソッドが補完できます。
--------------------------------
部分マッチ
Vim標準のキーワード補完では先頭マッチのみですが、neocomplcacheでは標準で部分マッチが有効です。
ただし、部分マッチによる候補は入力文字数が多くないと表示されません。
--------------------------------
数字キーによるクイックマッチ
fuzzyfinderにインスパイア。
<TAB>や<C-p>, <C-n>を連打しなくても、補完候補横に表示されている数値を入力するだけで補完ができます。
ルーチンの改良により、0~99の二桁まで対応。
よくよく調べてみると、ATOKにも同様の機能がありますね。
注意:
'completeopt'が初期値のmenuのままになっていると、
クイックマッチマッチの候補がうまく表示されません。
set completeopt=menuone,preview
のように、'completeopt'にmenuoneを含めてください。
--------------------------------
ディクショナリ補完、タグ補完
ディクショナリ補完やタグ補完も自前で実装しています。
ファイルタイプ別に登録することで、自動的に読み込み、補完に使えます。
読み込むタグはカレントディレクトリごとに設定できます。
--------------------------------
ワイルドカードによる検索結果の絞り込み
多数の候補がある場合、絞り込みが大変なので実装しました。
hoge*piyoと入力すると、hogeがつき、その後にpiyoとなるものにマッチします。
正規表現的にはhoge.*piyoと同じ意味です。
追記:
Ver.2.01より、$*や@*, .*など、あらゆるところでワイルドカードが使えるようになりました。
スペルが分からないときに便利です。
Ver.2.10より、-のワイルドカードが追加されました。
hoge-piyoは正規表現的にはhoge.\+piyoと同じ意味です。
微妙に意味が異なるので注意してください。
Ver.2.38より、手動補完では、記号入力時にワイルドカードを補うようになりました。
これでワイルドカードを入力する手間が省けます。
--------------------------------
結果のキャッシュによる高速化
プラグインの名前の元にもなっている機能です。
あまりに初期段階の補完が遅すぎて、我慢ならなくなったので実装しました。
バッファ全体を一定のキャッシュラインで分割し、キャッシュライン単位でキーワードの収集を行います。
よって、編集し初めは補完候補の順番がおかしいです。ご了承ください。
キャッシュラインを固定値にすると、一行が多いHTMLやTeXで重いため、
キャッシュラインはg:NeoComplCache_CacheLineCountの値を元に、バッファの行数により決定します。
現在のキャッシュラインをキャッシュするkey-mappingsが追加されました。
nmap <silent><C-e> <Plug>(neocomplcache_keyword_caching)
imap <expr><silent><C-e> pumvisible() ? "\<C-e>" : "\<Plug>(neocomplcache_keyword_caching)"
私は上記のように設定しています。
自分の打ち込んだ単語をすぐにキャッシュしたい場合に便利です。
Ver.2.58より、キャッシュタイミングを改善し、入力した候補がすぐキャッシュされるようになりました。
これでかなり使いやすくなったはずです。
--------------------------------
ファイル名補完
バッファ内で../といったディレクトリ名を入力するとファイル名の補完ができます。
autocomplpopで便利だったので、移植しました。
特にvimshellではこれがないと生きていけません。
ファイル名の自動補完に慣れてしまうと、いちいち<TAB>を入力しなければならない通常のシェルが馬鹿らしくなります。
この機能が邪魔な場合は、g:NeoComplCache_TryFilenameCompletionの値を0にすることによって、ファイル名を自動補完しないようにできます。
ファイル名補完は自前実装したので、数字によるクイックマッチが動作します。
ただしSmartCaseやUnderbar completionなど、一部の機能は動作しません。
実行ファイルには'*'マークが付くので判別も容易です。
手動でファイル名補完を呼び出すこともできるので、
inoremap <expr><C-x><C-f> neocomplcache#manual_filename_complete()
このようにマッピングすると、標準のファイル名補完を置き換えることができます。
補完スキップも指定できます。手動補完はスキップされません。
Ver.2.71より、短縮ファイル名補完に対応。
ディレクトリ名の先頭の文字を入力し、/で区切ることで簡単に補完できます。
例:
/hoge/piyo/hoge.vim
を補完したい場合、
/h/p/
と入力するだけで、hoge.vimが候補として現れます。
--------------------------------
カーソル後方のキーワードに応じた補完
|にカーソルがあるとします。
|e
ここでhogeを補完すると、hogのみが補完され、結果はhog|eとなります。
初めはそこまで便利だとは思っていませんでしたが、使ってみるとソースの修正時に大活躍。
この機能はViViにインスパイアされました。
--------------------------------
SmartCase
これを設定すると、g:NeoComplCache_IgnoreCaseのとき(デフォルト)、
hoge -> hoge,Hogeにマッチ。
Hoge -> Hogeにマッチ。
となります。
つまり、大文字が含まれるときは大文字小文字を区別します。
大文字小文字で意味が変わる、RubyやCのマクロを使うときには便利です。
この機能を使用するには、
let g:NeoComplCache_SmartCase = 1
とする必要があります。
--------------------------------
豊富なカスタマイズ項目
調子に乗って機能を増やしていたら、たくさんの設定ができるようになっていました。
設定をカスタマイズすれば、Vim標準の補完機能をエミュレーションすることもできます。
ただしその場合、neocomplcacheを使う意味は薄れます。
設定項目は豊富にあるので、ヘルプを参照してください。
--------------------------------
文脈依存補完(3-gram completion)
文脈を解析し、補完する機能が実装されました。
例えば、バッファ内に
hoge piyo
と入力しているとすると、hogeの後にはpiyoが来やすいと認識、次の補完時にpiyoが上の方に来ます。
追記:
3-gram completionも実装しました!
これで、より精度の高い補完が可能になります。
この機能を使用するには、
let g:NeoComplCache_PreviousKeywordCompletion = 1
とする必要があります。
--------------------------------
Omni補完
thincaさんに要望されたので追加しました。
基本的にはautocomplpopのコードを移植し、C, C++, JavaScript, PHPといった新たな言語にも対応。
Rubyで,や.を入力したり、HTMLでタグが補完できます。
ただしあまりテストしていないので、きちんと動かないかもしれません。
あと候補が多いためか、動作が若干重いです。
追記:
VimScriptでは、Vim commands completionを呼び出します。
コマンドの先頭に:があると、補完が有効になります。
無効にしたい場合は.vimrcで
if !exists('g:NeoComplCache_OmniPatterns')
let g:NeoComplCache_OmniPatterns = {}
endif
let g:NeoComplCache_OmniPatterns['無効にしたいファイルタイプ'] = ''
とすると、無効にできます。
Ver.2.68より、Omni補完呼び出しはneocomplcacheと統合されました。
Omni補完でもクイックマッチや補完のスキップが動作します。
--------------------------------
ローカルタグ補完
タグファイルの設定をしなくても、バッファと同じディレクトリにある
tagsファイルを自動的に読み込むようになりました。
しかもtagsのキーワードを認識し、ちゃんと補完します。
追記:
Ver.2.18より、タグ補完を分離することで、タグより得られる情報をちゃんと表示するようになりました。
infoにも対応。
しかしタグファイルが大きいと重いので、手動補完したときにしか利用しません。
--------------------------------
自動タグファイルアップデート
Omni補完を使用するにあたって、こまめなタグファイルのアップデートは必要不可欠です。
そこでファイル保存時にtagsが存在したら、自動的にアップデートするようになりました。
少しの変更でアップデートすると、パフォーマンス的に問題があるので、ある程度大きな変更があるときのみ更新します。
この機能を使用するには、
let g:NeoComplCache_TagsAutoUpdate = 1
とする必要があります。
--------------------------------
Same filetype completion
昔のneocomplcacheでは、すべてのバッファから補完できたのですが、
今のバージョンでは同じfiletypeのバッファからしか補完できないようになりました。
しかしこれでは困る場合もあったので(例:C/C++でやりとりするとき)、
Same filetypeという概念を作り、
let g:NeoComplCache_SameFileTypeLists['c'] = 'cpp'
let g:NeoComplCache_SameFileTypeLists['cpp'] = 'c'
というように設定すれば、C/C++間のバッファで補完できるようになります。
一方だけ設定すれば、相互でない補完も可能です。
--------------------------------
preview windowに対応
preview windowが存在するとき、プラグインによっては追加情報を表示します。
現在tags_complete.vimのみ対応。
追記:
Ver.2.02より、この機能を使用するには、
let g:NeoComplCache_EnableInfo = 1
とする必要があります。
ただしこの設定を行うと、neocomplcacheが&completeoptを勝手に変更するので注意してください。
--------------------------------
シンタックス補完
Ver.2.17より、プラグインで実装しました。
:syn listの結果を解析し、キーワードを補完候補に加えます。
1度目は候補をキャッシュするので、若干時間がかかりますが、その後は高速に動作します。
Vimの豊富なシンタックスキーワードを有効活用するので、非常に便利です。
ソースコードも短いので、プラグイン作りの勉強にも最適です。
追記:
Ver.2.23より、正規表現のパターンも解析するようになりました。
これで、HaskellやTeXといったファイルでもシンタックス補完が有効になります。
ただし\(\)や[]を使った複雑な正規表現では、上手くパースできないことがあります。
Ver.2.30より、MFU Dictionaryは廃止されました。
シンタックス補完で十分なためです。
Action scriptやVimのautocmdを補完するとき、シンタックスの補完候補が小文字になってしまうことがあります。
これはシンタックスファイルの
syn case ignore
が悪さをしているせいです。
プラグイン側では対処しようがないので、気になるようだったら直接シンタックスファイルを修正してください。
--------------------------------
CamelCase補完
thincaさんの発案により実装。
大文字でAIOOBEと打つと、ArrayIndexOutOfBoundsException が候補に出てきます。
つまり、大文字を単語の区切りとして認識しています。
小文字を混ぜたり最後まで完全に打たなくてもよしなに解釈してくれます。
Eclipseではこの補完が実装されているようです。
この機能を使用するには、
let g:NeoComplCache_EnableCamelCaseCompletion = 1
とする必要があります。
--------------------------------
Underbar補完
Emacsのcompleter.elに似たような機能があるので実装。
_区切りでf_b_bと打つと、foo_bar_baz が候補に出てきます。
つまり、_を単語の区切りとして認識しています。C言語などの_を多用する言語で便利。
この機能を使用するには、
let g:NeoComplCache_EnableUnderbarCompletion = 1
とする必要があります。
--------------------------------
プラグインで拡張可能
Ver.2.10にて、複雑だったソースコードを分割し、ついに補完をプラグインで拡張できるようになりました。
他のプラグインを読み込む部分も実装したので、夢が広がります。
プラグインの作り方については、今後ドキュメントを用意する予定ですが、
やる気があるならばautoload/neocomplcache/syntax_complete.vimなどを読んでみてください。
autoload/neocomplcacheディレクトリにプラグインファイルをおいておけば、補完時に自動で読み込まれます。
--------------------------------
ステータスラインにキャッシュ率を表示
Ver.2.27より、keyword_completeにneocomplcache#keyword_complete#caching_percent()という関数が追加され、
簡単にキャッシュ率を得ることが可能になりました。
例えばステータスラインに表示すると、次のようになります。
let &statusline = '%=%m%y%{"[".(&fenc!=""?&fenc:&enc).",".&ff."]"}%{"[".neocomplcache#keyword_complete#caching_percent("")."%]"} %3l,%3c %3p%%'
だんだん数字が増えていくのを楽しむのも、なかなか良いものですね。
ちなみに、このキャッシュ率は詳細キャッシュ率を表しています。
そのバッファが全くキャッシュされていない場合、'-'となります。
neocomplcache Ver.2.50より、ファイルを開くときにすべてのキーワードをキャッシュするようになっているので、
キャッシュ率が0%であっても、キーワード補完は動作するので注意してください。
このキャッシュ率が上昇するにつれて、補完候補が表示される順番が変化します。
--------------------------------
スニペット補完
Ver.2.30より、ファイルに設定を書くことで、自由に略語を定義できるスニペット補完を実装しました。
スニペットはsnipMate.vim風に記述できるので、簡単に移植できるでしょう。
snippet if
abbr if endif
prev_word '^'
if ${1:condition}
${2}
endif
例えば上記のようなファイルを'autoload/neocomplcache/snippet_complete/vim.snip'
として保存すると、vimファイルタイプを開いたときに自動的に読み込みます。
#を行頭に書くとコメントで、空行は無視されます。
snippetの後には補完するために入力する文字列、先頭に空白文字があると補完されるキーワード、
abbrはポップアップメニューに表示される略語(省略可)、
prev_wordは優先して補完する文脈を,で区切って''で囲んで指定します(省略可)。'^'は文の先頭という意味になります。
スニペットファイルのシンタックスファイルを作成したので、それぞれの要素が色分けされます。
詳しくはautoload/neocomplcache/snippet_completeにあるスニペット補完ファイルを参照してください。
snipMateと違って、外部スニペットのインクルードも使えます。
include c
例えばこのように記述すると、そのスニペットファイルにc用のスニペットを加えて補完候補とします。
共通部分を補完するのに便利です。
ただし再帰的処理を行っているので、無限ループに陥らないように注意してください。
snipMateのように、``を用いたevalも動作します。
snippet hoge
prev_word '^'
`expand("%")`
例えばこのように記述すると、現在開いているバッファ名を補完できます。
ただし補完候補を展開するときに評価を行うため、副作用には十分注意してください。
簡単にスニペットファイルを編集できるように、
:NeoComplCacheEditSnippets [filetype]というコマンドを用意しています。
このコマンドを用いると、filetypeのスニペット補完ファイルを簡単に編集することができます。
filetypeを省略すると、&filetypeとなります。保存すると自動的に再キャッシュされるので、さらに便利です。
imap <silent> <C-l> <Plug>(neocomplcache_snippets_expand)
smap <silent> <C-l> <Plug>(neocomplcache_snippets_expand)
のようにplugin keymappingを定義しておけば、<C-l>でスニペットを展開できます。
展開時にインデントもきちんとなされるので便利です。これでスニペットの自由度が増しますね。
snipMate風のプレースホルダにも対応しています。
snippet if
abbr if endif
prev_word '^'
if ${1:condition}
${2}
endif
${1}が最初に入力する単語です。スニペットの展開時に自動的に移動します。
もう一回<Plug>(neocomplcache_snippets_expand)を押すと、${2}, ${3}, ...に移動します。
${1:condition}はデフォルトでconditionという単語が選択された状態になります。
<Plug>(neocomplcache_snippets_expand)しなければならない候補の場合、
補完時に<expand>が最後に付くので参考にしてください。
スニペットの中でスニペットを補完したりといった複雑な場合も、ある程度直感的に動作するようになっています。
プレースホルダはソースコード中でも色分けされます。
expandするときにスニペットを解析するので、展開したスニペットのランクが上昇するようにしました。
これで、よく使用するスニペットは補完時に上位に来るようになります。
vnoremapやvmap, mapはselect modeでも有効になるので、
変なマッピングをしていると、デフォルト値の選択時に上手く文字が入力できなくなります。
.vimrcにそのような記述があれば、xnoremapやxmapに修正することをオススメします。
ユーザが定義するスニペットの保存場所は自由に指定できます。
指定するときは、
let g:NeoComplCache_SnippetsDir = $HOME.'/snippets'
のように.vimrcに記述してください。
:NeoComplCacheEditSnippetsの時には、g:NeoComplCache_SnippetsDirを優先して読み込みます。
展開可能かどうかを判断する関数として、neocomplcache#snippets_complete#expandable()を追加しました。
これを使えば、
imap <expr><silent><C-l> neocomplcache#snippets_complete#expandable() ? "\<Plug>(neocomplcache_snippets_expand)" : "\<C-n>"
のように設定でき、展開可能でない場合は他の機能にキーバインドを割り当てることが出来ます。
複数回展開が必要ななスニペットは表示が変わり、[Snippet]が<Snippet>に変化します。
Ver.2.39より、スニペット名が同じスニペットを定義した場合、上書きされるようになりました。
インクルードしたスニペットや標準のスニペットを書き換えるときに便利です。
Ver.2.57より、どのファイルタイプでも読み込まれる、'_.snip'を追加しました。
さらに、snipMate形式のスニペットファイルもそのまま読み込めます。
ただしプレースホルダの同期には対応していませんので注意してください。
alias hoge hogera hogehoge
のように空白で区切って指定すると、スニペットの別名定義ができます。
スニペット名を直接入力するときに、覚えることが簡単になるので便利です。
--------------------------------
自動補完のスキップ
入力が高速だったり、補完に時間がかかるときは自動補完をスキップするようになりました。
スキップする時間は
let g:NeoComplCache_SkipCompletionTime = '0.3'
let g:NeoComplCache_SkipInputTime = '0.1'
のようにすることで調整ができます。
値は文字列にしないと動作しないので注意。
--------------------------------
ポップアップメニューを閉じる
Ver.2.45より実装。neocomplcache#close_popup()やneocomplcache#cancel_popup()を
キーマッピングに使用することで、確実にポップアップを閉じます。
neocomplcache#close_popup()の場合は使用することでキーワードのランクが上昇します。
例:
" <C-y>: paste.
inoremap <expr><C-y> pumvisible() ? neocomplcache#close_popup() : "\<C-r>0"
" <C-e>: close popup.
inoremap <expr><C-e> pumvisible() ? neocomplcache#cancel_popup() : "\<End>"
--------------------------------
自動キャッシュの制御
Ver.2.64よりオプションが追加され、キャッシュの制御がやりやすくなりました。
g:NeoComplCache_CachingLimitFileSizeオプションではキャッシュする最大ファイルサイズを設定します。
これより大きいファイルは自動でキャッシュされません。
g:NeoComplCache_CachingDisablePatternオプションではキャッシュしないバッファ名パターンを設定します。
正規表現で指定するので、\|で区切れば複数のパターンを指定できます。
--------------------------------
プラグインごとに補完開始文字数を設定
Ver.2.71より、プラグインごとに補完開始文字数を設定できるようになりました。
例:
let g:NeoComplCache_KeywordCompletionStartLength = 1
if !exists('g:NeoComplCache_PluginCompletionLength')
let g:NeoComplCache_PluginCompletionLength = {}
endif
let g:NeoComplCache_PluginCompletionLength['snippets_complete'] = 1
let g:NeoComplCache_PluginCompletionLength['keyword_complete'] = 2
let g:NeoComplCache_PluginCompletionLength['syntax_complete'] = 2
let g:NeoComplCache_PluginCompletionLength['tags_complete'] = 3
この例ではsnippets_completeのみ1文字で補完、tags_completeは3文字、他は2文字で補完するようにしています。
g:NeoComplCache_KeywordCompletionStartLengthを変更しないと、
入力文字数がg:NeoComplCache_KeywordCompletionStartLengthを超えるまで自動補完が呼び出されないので注意してください。
--------------------------------
私の設定
参考までに、私が使用しているneocomplcacheの設定を紹介しておきます。
neocomplcacheのオプションはdoc/neocomplcache.jaxに詳しい解説があるので、そこを参照してください。
" Don't use autocomplpop.
let g:AutoComplPop_NotEnableAtStartup = 1
" Use neocomplcache.
let g:NeoComplCache_EnableAtStartup = 1
" Use smartcase.
let g:NeoComplCache_SmartCase = 1
" Use previous keyword completion.
let g:NeoComplCache_PreviousKeywordCompletion = 1
" Use tags auto update.
"let g:NeoComplCache_TagsAutoUpdate = 1
" Use preview window.
let g:NeoComplCache_EnableInfo = 1
" Use camel case completion.
let g:NeoComplCache_EnableCamelCaseCompletion = 1
" Use underbar completion.
let g:NeoComplCache_EnableUnderbarCompletion = 1
" Set minimum syntax keyword length.
let g:NeoComplCache_MinSyntaxLength = 3
" Set skip input time.
let g:NeoComplCache_SkipInputTime = '0.2'
" Set manual completion length.
let g:NeoComplCache_ManualCompletionStartLength = 0
" Define dictionary.
let g:NeoComplCache_DictionaryFileTypeLists = {
\ 'default' : '',
\ 'vimshell' : $HOME.'/.vimshell_hist',
\ 'scheme' : $HOME.'/.gosh_completions'
\ }
" Define keyword.
if !exists('g:NeoComplCache_KeywordPatterns')
let g:NeoComplCache_KeywordPatterns = {}
endif
let g:NeoComplCache_KeywordPatterns['default'] = '\v\h\w*'
" Plugin key-mappings.
imap <silent><C-l> <Plug>(neocomplcache_snippets_expand)
smap <silent><C-l> <Plug>(neocomplcache_snippets_expand)
nmap <silent><C-e> <Plug>(neocomplcache_keyword_caching)
imap <expr><silent><C-e> pumvisible() ? "\<C-e>" : "\<Plug>(neocomplcache_keyword_caching)"
neocomplcache自体が標準で自分好みの設定になっているので、あまり凝った設定はしていません。
むしろ皆さんが使用するときは存分にカスタマイズすることを推奨します。
使用頻度を計算しないようにすれば、かなり高速化します。
vimshellの履歴ファイルを辞書として登録するのは便利なのでオススメです。
日本語が候補に出てくると煩わしいため、私はデフォルトで日本語を除外しています。
neocomplcacheを使用するに当たっては、Vimの補完関係の設定も重要なので、
参考までに私の設定を載せておきます。
" <TAB> completion.
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
" C-jでオムニ補完
inoremap <expr> <C-j> &filetype == 'vim' ? "\<C-x>\<C-v>\<C-p>" : "\<C-x>\<C-o>\<C-p>"
" C-kを押すと行末まで削除
inoremap <C-k> <C-o>D
" C-hで補完を続行しない
inoremap <expr><C-h> pumvisible() ? "\<C-y>\<C-h>" : "\<C-h>"
" C-nでneocomplcache補完
inoremap <expr><C-n> pumvisible() ? "\<C-n>" : "\<C-x>\<C-u>\<C-p>"
" C-pでkeyword補完
inoremap <expr><C-p> pumvisible() ? "\<C-p>" : "\<C-p>\<C-n>"
" 途中でEnterしたとき、ポップアップを消して改行し、
" 改行を連続して入力してもインデント部を保持する
inoremap <expr><CR> pumvisible() ? "\<C-y>\<CR>X\<BS>" : "\<CR>X\<BS>"
C-nでneocomplcacheの手動補完を呼び出します。
デバッグや、重すぎて候補が表示されなかったときなどに使います。
C-pはVim標準のキーワード補完。比較のため残してあります。
C-jでオムニ補完を起動します。filetypeがVimの時には、Vim commands completionを起動します。
C-hは一度ポップアップを消去し、ちらついたり、重くならないようにしてます。
--------------------------------
知名度
autocomplpop: 14,700件
auto-complete.el: 14,300件
neocomplcache: 5790件
Google調べ
昔と比較すると、かなり有名になってきました。
今はまだ口コミレベルですが、autocomplpop並に有名になる日も近いでしょう。
追記:
thincaさんに紹介されました!!
http://d.hatena.ne.jp/thinca/20090305/1236191531
メインで使っていただけているようで光栄です。
このエントリに刺激され、Omni補完を実装しました。
追記2:
はてなキーワードにも登録されました!
http://d.hatena.ne.jp/keyword/neocomplcache
追記3:
snippetファイルの設定例
http://d.hatena.ne.jp/cooldaemon/20090807/1249644264
解説がなかなか詳しいので役立ちます。
--------------------------------
現在開発されているプラグイン
*snipMate_complete.vim*
http://gist.github.com/99936
thincaさん作。
snipMateの関数をneocomplcacheから呼び出し、補完します。
このプラグインを使用するためには、snipMateにパッチを当てる必要があります。
--------------------------------
使用上の注意
neocomplcacheはキーワードをキャッシュするというその特性上、メモリをかなり消費します。
Vimのメモリ使用量が多くなると、カーソル移動がかなり重くなります。
開いているバッファの大きさにもよりますが、特にバッファが8つを超えてくると、不安定になります。
もしそのような現象が生じたら、不要なバッファを削除したり、
:NeoComplCacheCachingDisableコマンドを実行して、バッファをキャッシュしないようにしてください。
Ver.2.50より、起動時に簡単なキャッシュを行うようになりました。
これでVim標準のキーワード補完は完全に必要なくなります。
ただし巨大なバッファを読み込むと、ある程度時間がかかるので注意。
Ver.2.55より、キャッシュしたファイルをg:NeoComplCache_TemporaryDir.'/keyword_cache'ディレクトリに
書き出すようになりました。同じファイルを開く場合は格段に高速化されます。
ただし、キャッシュを書き出すのは500行以上のファイルのみです。
Ver.2.64より、readonlyなファイルは自動的にキャッシュしません。
どうしてもキャッシュしたい場合、:NeoComplCacheCachingBufferコマンドを使用してください。
githubにて指摘されたのですが、
set completeopt=menuone
を.vimrcに書いていないと、数字キーを入力してもクイックマッチの候補が表示されません。
注意してください。
--------------------------------
今後の予定
何とか英語のヘルプファイルを作成することができました。
これからは要望されたり、思いついた機能を加えつつ、neocomplcacheを使いやすく改良することになると思います。
さらに、インクルード補完を自前で実装したいと思っていて、これが実装できればtags_completeは必要なくなると思います。
--------------------------------
まとめ
機能追加の要望やバグ、質問等があれば、githubのIssuesに書いてください。
http://github.com/Shougo/neocomplcache/issues
まめにチェックをしているので、皆さんのブログに書いていただいてもかまいません。
Twitterやブログもやってます。
http://vinarian.blogspot.com/
http://twitter.com/ShougoMatsu
更新情報は主にブログに、重要な情報はTwitterでもアナウンスする予定です。
Twitterはneocomplcache開発日記と化しているので、こまめにチェックするとおもしろいかもしれません。
実装してみて分かりましたが、補完にはまだまだ無限の可能性があります。
みんなの力で、どんどんneocomplcacheを良くしていきましょう。
夢はVimのキラープラグインとなることです。
--------------------------------
更新履歴
2009/08/22 neocomplcache Ver.2.71に対応。
2009/08/12 neocomplcache Ver.2.68に対応。
2009/08/10 neocomplcache Ver.2.67に対応。
2009/07/26 neocomplcache Ver.2.64に対応。
2009/07/10 neocomplcache Ver.2.62に対応。
2009/05/30 neocomplcache Ver.2.57に対応。細々とした修正。
2009/05/21 neocomplcache Ver.2.56に対応。
2009/05/18 neocomplcache Ver.2.55に対応。
2009/05/15 分かり易いように全体的に修正。
2009/05/14 neocomplcache Ver.2.50に対応。
2009/05/10 neocomplcache Ver.2.42に対応。
2009/05/05 neocomplcache Ver.2.40に対応。
2009/04/29 neocomplcache Ver.2.38に対応。
2009/04/25 neocomplcache Ver.2.36に対応。ついでに全体的に修正しました。
2009/04/23 neocomplcache Ver.2.35に対応。
2009/04/21 neocomplcache Ver.2.34に対応。
2009/04/21 neocomplcache Ver.2.33に対応。
2009/04/19 neocomplcache Ver.2.32に対応。
2009/04/18 neocomplcache Ver.2.31に対応。ついでに全体的に修正しました。
2009/04/16 neocomplcache Ver.2.27に対応。
2009/04/11 neocomplcache Ver.2.24に対応。
2009/04/10 neocomplcache Ver.2.23に対応。
2009/04/09 アップグレード方法を追加。
2009/04/07 neocomplcache Ver.2.20に対応。
2009/04/04 neocomplcache Ver.2.18に対応。
2009/04/03 neocomplcache Ver.2.17に対応。
2009/04/01 neocomplcache Ver.2.16に対応。
2009/03/31 設定例がバグっていたので修正。
2009/03/30 neocomplcache Ver.2.14に対応。
2009/03/27 neocomplcache Ver.2.11に対応。
2009/03/27 neocomplcache Ver.2.10に対応。
2009/03/26 neocomplcache Ver.2.02に対応。
2009/03/25 neocomplcache Ver.2.01に対応。
2009/03/20 neocomplcache Ver.2.00に対応。
2009/03/12 neocomplcache Ver.1.58に対応。
2009/03/8 neocomplcache Ver.1.54に対応。
2009/03/7 neocomplcache Ver.1.52に対応。
2009/03/6 neocomplcache Ver.1.50に対応。
2009/03/5 neocomplcache Ver.1.49に対応。
--------------------------------