pockestrap

Programmer's memo

My NeoComplete settings

普段 NeoComplete にとてもお世話になっているので、自分の設定を晒そうと思います。
参考にしてくれる人がいれば嬉しいです。

Plugins

Shougo/neocomplete.vim · GitHub

言わずと知れた補完ブラグイン。 今回の主題

NeoBundle     'Shougo/neocomplete'

if neobundle#tap('neocomplete')
  call neobundle#config({
  \   'depends': ['Shougo/context_filetype.vim', 'ujihisa/neco-look', 'pocke/neco-gh-issues', 'Shougo/neco-syntax'],
  \ })

  " 起動時に有効化
  let g:neocomplete#enable_at_startup = 1
  " 大文字が入力されるまで大文字小文字の区別を無視する
  let g:neocomplete#enable_smart_case = 1
  " _(アンダースコア)区切りの補完を有効化
  let g:neocomplete#enable_underbar_completion = 1
  let g:neocomplete#enable_camel_case_completion  =  1
  " ポップアップメニューで表示される候補の数
  let g:neocomplete#max_list = 20
  " シンタックスをキャッシュするときの最小文字長
  let g:neocomplete#sources#syntax#min_keyword_length = 3
  " 補完を表示する最小文字数
  let g:neocomplete#auto_completion_start_length = 2
  " preview window を閉じない
  let g:neocomplete#enable_auto_close_preview = 0
  AutoCmd InsertLeave * silent! pclose!

  let g:neocomplete#max_keyword_width = 10000


  if !exists('g:neocomplete#delimiter_patterns')
    let g:neocomplete#delimiter_patterns= {}
  endif
  let g:neocomplete#delimiter_patterns.ruby = ['::']

  if !exists('g:neocomplete#same_filetypes')
    let g:neocomplete#same_filetypes = {}
  endif
  let g:neocomplete#same_filetypes.ruby = 'eruby'


  if !exists('g:neocomplete#force_omni_input_patterns')
    let g:neocomplete#force_omni_input_patterns = {}
  endif

  let g:neocomplete#force_omni_input_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\w*\|\h\w*::\w*'
  let g:neocomplete#force_omni_input_patterns.typescript = '[^. \t]\.\%(\h\w*\)\?' " Same as JavaScript
  let g:neocomplete#force_omni_input_patterns.go = '[^. \t]\.\%(\h\w*\)\?'         " Same as JavaScript

  let s:neco_dicts_dir = $HOME . '/dicts'
  if isdirectory(s:neco_dicts_dir)
    let g:neocomplete#sources#dictionary#dictionaries = {
    \   'ruby': s:neco_dicts_dir . '/ruby.dict',
    \   'javascript': s:neco_dicts_dir . '/jquery.dict',
    \ }
  endif
  let g:neocomplete#data_directory = $HOME . '/.vim/cache/neocomplete'

  call neocomplete#custom#source('look', 'min_pattern_length', 1)

  call neobundle#untap()
endif

Vim には preview window という、関数定義などを表示する小さなウィンドウを出す便利な機能があります。
f:id:Pocke:20151001222053p:plain 後述する tern_for_vim などの補完プラグインではこれが活用されています。
しかし、NeoCompleteのデフォルト設定だと、これがぴょこぴょこ出たり消えたりして鬱陶しいです。
そのため、preview window を閉じないと書いてあるところで、一々閉じないように設定し、またずっと表示させておくのも邪魔なので、インサートモードを抜けた時に閉じるようにしています。

g:neocomplete#sources#dictionary#dictionaries では、RubyjQuery用の辞書ファイルを定義しています。
pocke/dicts · GitHub
定義されているメソッドとかが補完候補に出るので便利。

Shougo/context_filetype.vim · GitHub

なんだか忘れたけど入れておくと便利になるやつ。
確かMarkdownとかで他の言語が埋め込まれてる時に便利になるやつだった気がする。

ujihisa/neco-look · GitHub

英単語を補完してくれるめっちゃ便利なやつ。
めっちゃ便利なので絶対に入れるべきプラグイン
英語でコミットメッセージ書くのとかがめっちゃ楽になる。めっちゃ便利(大切だから3回言った)

pocke/neco-gh-issues · GitHub

GitHub の Issue 番号を補完してくれる便利なやつ。
作ってみたけど、 rhysd/github-complete.vim · GitHub っていう更に便利そうなのが出ているのでそちらに乗り換えようかと思っている。

Shougo/neco-syntax · GitHub

Syntax ファイルから補完候補を抽出してくれるプラグイン
とりあえず入れておくと便利。

osyo-manga/vim-marching · GitHub

C/C++ 用のオムニ補完ブラグイン。
C/C++ 書くことがあったので入れたのだけど、最近全く書かないので殆ど使ってない。

NeoBundleLazy 'osyo-manga/vim-marching'

if neobundle#tap('vim-marching')
  call neobundle#config({
  \   'autoload': {
  \     'filetypes': ['c', 'cpp']
  \   },
  \   'depends': ['Shougo/vimproc.vim', 'osyo-manga/vim-reunions']
  \ })

  let g:marching_enable_neocomplete = 1

  call neobundle#untap()
endif

Shougo/neosnippet.vim · GitHub

スニペット補完ブラグイン。めっちゃ便利。

NeoBundle     'Shougo/neosnippet'
NeoBundle     'pocke/neosnippet-snippets'
NeoBundleFetch 'tekkoc/PHPSnippetsCreator'
NeoBundle     'pocke/neosnippet-incomment'

if neobundle#tap('neosnippet')
  "http://kazuph.hateblo.jp/entry/2013/01/19/193745

  " <TAB>: completion.
  inoremap <expr><S-TAB>  pumvisible() ? "\<C-p>" : "\<S-TAB>"

  " Plugin key-mappings.
  imap <silent><C-k> <Esc>:let g:neosnippet_expanding_or_jumpping = 1<CR>a<Plug>(neosnippet_expand_or_jump)
  smap <C-k> <Plug>(neosnippet_expand_or_jump)

  " SuperTab like snippets behavior.
  imap <expr><TAB> pumvisible() ? "\<C-n>" : neosnippet#jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
  smap <expr><TAB> neosnippet#jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"

  " For snippet_complete marker.
  if has('conceal')
    set conceallevel=2 concealcursor=i
  endif

  " Enable snipMate compatibility feature.
  let g:neosnippet#enable_snipmate_compatibility = 1
  let g:neosnippet#snippets_directory='~/dotfiles/snippets'

  AutoCmd InsertLeave * syntax clear neosnippetConcealExpandSnippets
  AutoCmd FileType php NeoSnippetSource ~/.vim/bundle/PHPSnippetsCreator/dist/php_functions.snip

  call neobundle#untap()
endif

imap <C-K>:let g:neosnippet_expanding_or_jumpping = 1 とか変なことをしているのは、他のプラグインとの兼ね合いで NeoSnippet のジャンプ中かどうかを判定したいからです。

pocke/neosnippet-snippets · GitHub

NeoSnippet のスニペット定義レポジトリ
本家は Shougo/neosnippet-snippets · GitHub だけど、不要なスニペットを削除するために Fork して使っている。

tekkoc/PHPSnippetsCreator · GitHub

PHP で定義されているグローバル関数のスニペットを用意してくれるプラグイン
PHP 書いてた時に関数多すぎてイライラしてきたので入れた。
今は幸運にも PHP を書かずに済んでいるので殆ど使っていない。

pocke/neosnippet-incomment · GitHub

// TODO:みたいなスニペットを、言語ごとに適切なコメントの形で出してくれるプラグイン
あったら便利かなーと思って作ってみたけど、あまりつかってない。

marijnh/tern_for_vim · GitHub

JavaScript の補完がちょっとだけ強くなるやつ。
動的型付け言語の補完の限界を感じることが出来る。

NeoBundleLazy 'marijnh/tern_for_vim'

if neobundle#tap('tern_for_vim')
  call neobundle#config({
  \   'build': {
  \     'others': 'npm install'
  \   },
  \   'autoload': {
  \     'functions': ['tern#Complete', 'tern#Enable'],
  \     'filetypes': ['javascript']
  \   },
  \   'commands': [
  \     'TernDef', 'TernDoc', 'TernType', 'TernRefs', 'TernRename'
  \   ]
  \ })

  let g:tern_map_keys = 0

  call neobundle#untap()
endif

Quramy/tsuquyomi · GitHub

NeoBundleLazy 'Quramy/tsuquyomi'

TypeScript のオムニ補完プラグイン
これなしでTypeScript書くのはしんどい。
ちなみに、TypeScript1.5系だと激重だけどTypeScript1.6系だとめっちゃ快適になるので、1.6系と合わせて使うことをおすすめする。


以上。ブログの記事を書いているとすぐに飽きて雑になってくるので、コードを書くだけでブログ記事が出来上がるようなジェネレータをだれか作って欲しい。