asyncomplete.vim を使い始めた

もともと [deoplete.nvim](https://github.com/Shougo/deoplete.nvim) を使っていたけれど、私の環境（Windows10 Vim8）だと補完候補が表示されるまで一秒程度時間がかかるため [asyncomplete.vim](https://github.com/prabirshrestha/asyncomplete.vim) に移りました。

そこそこ快適に使えるようになるまで試行錯誤が必要だったので、そこらへんをコメントしてみます。
全体のコードは末尾へ。

## 前提

* dein.vim を使って toml で設定を書いています。
* lsp を使うために、python は pyls を、golang は go-langserver を別途インストールしています。

### asyncomplete.vim 関連の依存関係

* asyncomplete.vim
  * asyncomplete-buffer.vim
  * asyncomplete-file.vim 
  * asyncomplete-necosyntax.vim
     * Shougo/neco-syntax
  * asyncomplete-necovim.vim
     * Shougo/neco-vim
  * prabirshrestha/asyncomplete-neosnippet.vim
     * Shougo/neosnippet.vim
         * Shougo/neosnippet-snippets
         * honza/vim-snippets
  * prabirshrestha/asyncomplete-lsp.vim
     * prabirshrestha/vim-lsp
         * prabirshrestha/async.vim

### vimrc で augroup vimrc を定義している。

```vim
augroup vimrc
  autocmd!
augroup END
```

## コメント

* 数メガのテキストファイルを扱うことがあり、そのファイルに対して補完候補の収集がされないように、指定した filetype だけで補完が動くようにしています。

```vim
  let g:asyncomplete_enable_for_all = 0
  autocmd vimrc FileType autohotkey,autoit,cfg,git,go,groovy,java,javascript,python,snippet,toml,vim,vb,xsl call asyncomplete#enable_for_buffer()
```

* `'whitelist': ['*']`: `whitelist` は書いていなければ `['*']` 相当になると思ったけれど、そうならないこともあるようなのでそれぞれ書いています。


## 全体コード

```
[[plugins]]
repo = 'prabirshrestha/asyncomplete.vim'
on_ft = ['autohotkey', 'autoit', 'cfg', 'git', 'go', 'groovy', 'java', 'javascript', 'python', 'snippet', 'toml', 'vim', 'vb', 'xsl']
hook_add = '''
  " let g:asyncomplete_log_file = expand('~/_vim/.asyncomplete/log.log')
  let g:asyncomplete_enable_for_all = 0
  autocmd vimrc FileType autohotkey,autoit,cfg,git,go,groovy,java,javascript,python,snippet,toml,vim,vb,xsl call asyncomplete#enable_for_buffer()
'''

[[plugins]]
repo = 'prabirshrestha/asyncomplete-buffer.vim'
on_ft = ['autohotkey', 'autoit', 'cfg', 'git', 'go', 'groovy', 'java', 'javascript', 'python', 'snippet', 'toml', 'vim', 'vb', 'xsl']
hook_source = '''
  autocmd vimrc User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#buffer#get_source_options({
      \ 'name': 'buffer',
      \ 'priority': 5,
      \ 'whitelist': ['*'],
      \ 'completor': function('asyncomplete#sources#buffer#completor'),
      \ }))
'''

[[plugins]]
repo = 'prabirshrestha/asyncomplete-file.vim'
on_ft = ['autohotkey', 'autoit', 'cfg', 'git', 'go', 'groovy', 'java', 'javascript', 'python', 'snippet', 'toml', 'vim', 'vb', 'xsl']
hook_source = '''
  autocmd vimrc User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#file#get_source_options({
      \ 'name': 'file',
      \ 'priority': 3,
      \ 'whitelist': ['*'],
      \ 'completor': function('asyncomplete#sources#file#completor'),
      \ }))
'''

[[plugins]]
repo = 'prabirshrestha/asyncomplete-necosyntax.vim'
on_ft = ['autohotkey', 'autoit', 'cfg', 'git', 'go', 'groovy', 'java', 'javascript', 'python', 'snippet', 'toml', 'vim', 'vb', 'xsl']
depends = ['neco-syntax']
hook_source = '''
  autocmd vimrc User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#necosyntax#get_source_options({
      \ 'name': 'necosyntax',
      \ 'priority': 7,
      \ 'whitelist': ['*'],
      \ 'completor': function('asyncomplete#sources#necosyntax#completor'),
      \ }))
'''

[[plugins]]
repo = 'Shougo/neco-syntax'
lazy = 1

[[plugins]]
repo = 'prabirshrestha/asyncomplete-necovim.vim'
on_ft = ['vim']
depends = ['neco-vim']
hook_source = '''
  autocmd vimrc User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#necovim#get_source_options({
      \ 'name': 'necovim',
      \ 'whitelist': ['vim'],
      \ 'priority': 10,
      \ 'completor': function('asyncomplete#sources#necovim#completor'),
      \ }))
'''

[[plugins]]
repo = 'Shougo/neco-vim'
lazy = 1

[[plugins]]
repo = 'prabirshrestha/asyncomplete-neosnippet.vim'
on_ft = ['autohotkey', 'autoit', 'cfg', 'git', 'go', 'groovy', 'java', 'javascript', 'python', 'snippet', 'toml', 'vim', 'vb', 'xsl']
depends = ['neosnippet.vim']
hook_source = '''
  autocmd vimrc User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#neosnippet#get_source_options({
      \ 'name': 'neosnippet',
      \ 'whitelist': ['*'],
      \ 'priority': 9,
      \ 'completor': function('asyncomplete#sources#neosnippet#completor'),
      \ }))
'''

[[plugins]]
repo = 'Shougo/neosnippet.vim'
depends = 'neosnippet-snippets'
hook_source = '''
  " <TAB>: completion.
  inoremap <expr> <S-TAB> pumvisible() ? '<C-p>' : '<S-TAB>'

  " Plugin key-mappings.
  imap <C-k> <Plug>(neosnippet_expand_or_jump)
  smap <C-k> <Plug>(neosnippet_expand_or_jump)

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

  let g:neosnippet#data_directory = expand('~/_vim/.neosnippet')

  " Tell Neosnippet about the other snippets
  " gosnippets は vim-go がうまいことやってくれるはずだけど、なんかうまくいかないので直接追加。
  let g:neosnippet#snippets_directory = [
        \   '~/vimfiles/snippets',
        \   '~/_vim/dein/repos/github.com/honza/vim-snippets/snippets/',
        \   '~/_vim/dein/repos/github.com/fatih/vim-go/gosnippets/snippets/',
        \ ]
'''

[[plugins]]
repo = 'Shougo/neosnippet-snippets'

[[plugins]]
repo = 'honza/vim-snippets'
# snippets ファイルだけを使うので runtimepath へ追加しない
rtp = ''

[[plugins]]
repo = 'prabirshrestha/async.vim'

[[plugins]]
repo = 'prabirshrestha/vim-lsp'
hook_add = '''
  " hook_source だとうまく動かなかった

  if executable('pyls')
      autocmd vimrc User lsp_setup call lsp#register_server({
          \ 'name': 'pyls',
          \ 'cmd': {server_info->['pyls']},
          \ 'whitelist': ['python'],
          \ })
  endif
  if executable('go-langserver')
    au User lsp_setup call lsp#register_server({
        \ 'name': 'go-langserver',
        \ 'cmd': {server_info->['go-langserver', '-gocodecompletion']},
        \ 'whitelist': ['go'],
        \ })
   endif
'''

[[plugins]]
repo = 'prabirshrestha/asyncomplete-lsp.vim'
on_ft = ['python', 'go']
depends = ['asyncomplete.vim', 'vim-lsp']

```