NeoVim にコード補完機能を追加するためのプラグインは deoplete.nvim が有名ですが、ddc.vim はその後継にあたるプラグインです。
ddc.vim は deoplete.nvim と比較してさらにカスタマイズ性が高くなっていて、source や filter までも自分で明確に選ぶ必要があるほどです。
実際に私も filter はお好みで設定していてとても満足しています。
ddc.vim はカスタマイズ性の高さから、人によって設定や使い方は全く異なります。
もちろんREADMEには基本の設定が記載されていますが、さらに一歩進んだおすすめの設定で遊んでみたいという人もいるでしょう。
そこでこのエントリでは、Language Server と組み合わせて使っている私の ddc.vim の設定例を紹介したいと思います。
NeoVim には Language Server クライアントが組み込まれているため、プラグインを導入してクライアントの設定をするだけで済みます。
クライアントの設定には neovim/nvim-lspconfig プラグインを使います。
Plug 'neovim/nvim-lspconfig'
基本的な設定は README に書かれている通りです。
例として、複数の Language Server を自動で起動する設定は次のようになります。
lua << EOF
local nvim_lsp = require('lspconfig')
local servers = { 'solargraph', 'tsserver' }
for _, lsp in ipairs(servers) do
nvim_lsp[lsp].setup {
flags = {
debounce_text_changes = 150,
},
settings = {
solargraph = {
diagnostics = false
}
}
}
end
EOF
上記の例では、Ruby の solargraph とTypeScript の tsserver を設定しています。
さらに solargraph の設定で diagnostics
(Rubocop による診断)を無効化しています。
Language Server ごとの設定の詳細は CONFIG.md にあるので参照してください。
solargraph なら RubyGems をインストールする必要がありますし、tsserver なら npm パッケージをインストールする必要があります。
Language Server を導入したので ddc.vim のソースに LSP を設定します。
ddc.vim のソースに LSP を設定するには ddc-nvim-lsp をインストールします。
Plug 'Shougo/ddc-nvim-lsp'
インストールしたら ddc.vim の補完ソースに nvim-lsp
を追加します。
call ddc#custom#patch_global('ui', 'native')
call ddc#custom#patch_global('sources', ['around', 'nvim-lsp'])
call ddc#custom#patch_global('sourceOptions', {
\ '_': { 'matchers': ['matcher_head'] },
\ 'nvim-lsp': {
\ 'mark': 'L',
\ 'forceCompletionPattern': '\.\w*|:\w*|->\w*' },
\ })
" Use Customized labels
call ddc#custom#patch_global('sourceParams', {
\ 'nvim-lsp': { 'kindLabels': { 'Class': 'c' } },
\ })
call ddc#custom#patch_global('ui', 'native')
が必要になりました。 これで Language Server から受け取った補完候補を ddc.vim で使用できるようになりました。
NeoVim を開いて適当なメソッド名をタイプすると補完候補が表示されるはずです。
動作しない場合はLSPのログを下記のように確認します。
:lua vim.cmd('e'..vim.lsp.get_log_path())
もしくは :LspInfo
で表示されるログファイルを確認します。
ddc.vim の filter をファジーフィルターに変更するには tani/ddc-fuzzy を導入します。
実際の動作の様子と導入方法は README をご覧ください。
Vim でカーソル移動を行うとき、私はついカーソルキーに手が伸びてしまいます。
補完候補を選択するときにもカーソルキーを使いたい場合は、下記のようにキーマッピングを設定します。
imap <expr><Down> pumvisible() ? '<TAB>' : '<Down>'
imap <expr><Up> pumvisible() ? '<S-TAB>' : '<Up>'
imap <expr><CR> pumvisible() ? '<C-y>' : '<CR>'
3番目の imap
は候補の決定にエンターキーを使うための設定です。
もし前述の tani/ddc-fuzzy と一緒に pum.vim (こちらもおすすめ)を導入している場合は下記のように設定します。
imap <silent><expr> <Down>
\ pum#visible() ? '<Cmd>call pum#map#select_relative(+1)<CR>' :
\ '<Down>'
imap <silent><expr> <Up>
\ pum#visible() ? '<Cmd>call pum#map#select_relative(-1)<CR>' :
\ '<Up>'
imap <silent><expr> <CR>
\ pum#visible() ? '<Cmd>call pum#map#confirm()<CR>' :
\ '<CR>'
このエントリで紹介した私の ddc.vim の設定は GitHub にありますので興味のある方は参考にしてみてください。
以上です。
このエントリでは、Language Server と組み合わせて使っている私の ddc.vim の設定例を紹介しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます