NeoVimな環境でdeoplete.nvim+ternでJavaScriptの補完をいい感じにするメモ

自分の環境がぶっ壊れた時、「あの問題どうやって解決したんだっけ?」って思ってggってもなかなか情報が少なかったので、備忘録も兼ねて書いていきます。

f:id:ksmxxxxxx:20200522003131j:plain

Photo by Markus Spiske on Unsplash

Environment

  • macOS 10.14.6
  • NVIM v0.4.3

使うプラグイン

LanguageClient-neovim はVueの補完のために入れたけど……もしかしたらternjsだけで十分かもしれない(そこまでちゃんと検証できてない…あとでやる)

dein.vimは基本本家様のhelp見れば大抵のことは書いてある。

が、初学者な拙僧はHookまわりがよくわかってなくて、ちょっとトラブったときに作者さんにアドバイスを貰ったときに熟読しました。

あと英語が不得手だったので、Qittaで日本語で説明してくれるページがあったので、とても参考になったとです。

[dein.vim] hook の便利な使い方

deoplete.nvim も本家様のhelp見れば大体使い方とかが乗っているのでわかると思います。

なので、上記のプラグインについては端折るぞ!

deoplete-ternjsが動かない時はon_ft指定してみよ

ハマったのは、deoplete-ternjs

そう、お前だよ。

一応READMEに一通り書かれてるんですが、書かれてないところでハマったからメモを残しておく。

Tern本家(?)のぷらぎん使ってもいいかな…って思ったけど……ひとまずは動いていたのを直したかったので、動くようになることだけメモ。

deoplete のtomlは以下の通り。

基本起動時に動かなくてもInsertになったときに動けば良いのでlazyに書いてます。

# ============================================================================
# Complement plugins
# ============================================================================
[[plugins]]
repo = 'Shougo/deoplete.nvim'
on_i = 1
hook_add = '''
let g:deoplete#enable_at_startup = 1
inoremap <expr><tab> pumvisible() ? "\<C-n>" :
  \ neosnippet#expandable_or_jumpable() ?
  \    "\<Plug>(neosnippet_expand_or_jump)" : "\<tab>"
'''
hook_post_source = '''
call deoplete#custom#option({
\ 'auto_complete_delay': 0,
\ 'max_list': 100
\ })
'''

[[plugins]]
repo = 'Shougo/neosnippet.vim'
depends = [ 'neosnippet-snippets', 'context_filetype.vim' ]
on_ft = 'snippet'
on_i  = 1
hook_add = '''
set completeopt-=preview
imap <C-k>     <Plug>(neosnippet_expand_or_jump)
smap <C-k>     <Plug>(neosnippet_expand_or_jump)
xmap <C-k>     <Plug>(neosnippet_expand_target)
if has('conceal')
  set conceallevel=2 concealcursor=i
endif
'''
[[plugins]]
repo = 'Shougo/neosnippet-snippets'

[[plugins]]
repo = 'Shougo/context_filetype.vim'

[[plugins]]
repo ='carlitux/deoplete-ternjs'
hook_post_update = '''
  call system ('npm install -g tern')
'''
hook_add = '''
let g:deoplete#sources#ternjs#filetypes = [
    \ 'jsx',
    \ 'javascript.jsx',
    \ 'vue',
    \ ]
'''
on_ft = ['javascript']

[[plugins]]
repo = 'autozimu/LanguageClient-neovim'
rev = 'next'
build = 'bash install.sh'
hook_post_source = '''
set hidden
let g:LanguageClient_serverCommands = {
    \ 'vue': ['vls'],
    \ }
nnoremap <silent> K :call LanguageClient_textDocument_hover()<CR>
nnoremap <silent> gd :call LanguageClient_textDocument_definition()<CR>
nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
'''

[[plugins]]
repo = 'fszymanski/deoplete-emoji'
depends = 'deoplete.nvim'
on_ft = ['markdown', 'gitcommit']

公式には

"Add extra filetypes

let g:deoplete#sources#ternjs#filetypes = [

            \ 'jsx',
            \ 'javascript.jsx',
            \ 'vue',
            \ '...'
            \ ]

って書いてあったりするので、これだけ書けばええんやって思っちゃうんですが、これだけだと動かなかったので、どうも on_ft も設定してあげたほうが良いみたいです。

どういう理由で?とも思うんですが、 deoplete-emoji も書かないと補完リストが出てこなかったので、補完系には全部on_ft を指定するようにしました。

ここには書いてませんが、シンタックスハイライト系のプラグインも全部 on_ft を指定してます。

もしかしたらdeoplete-ternjsの問題じゃないのかもしれません。

すまんな……疑うような事を言って。でもメンテが半年前とかになってるので…………もしこの先メンテが年単位とかだったらちょっと使い続けるのは考えちゃうんだぜ(´・ω・`)

最後に備忘録として参考に見てた記事とか貼っておく。

おまけで、「deopleteが動かなくなってしまって、他のIssueとかdocsとか参考にしてみたけど、python入れ直しても、nvim入れ直しても動かなくてさぁどうしようホントに詰んだぞ…」となり、不得手な英語を駆使して暗黒美無王さんに助けを請うたIssueと、たった一言で解決したというのを晒しておきます。

github.com

入門vi 第6版 実践Vim 思考のスピードで編集しよう! (アスキー書籍)