Site cover image
NeoVim+ddc.vimでLSPを使ってコード補完するための設定例

NeoVim にコード補完機能を追加するためのプラグインは deoplete.nvim が有名ですが、ddc.vim はその後継にあたるプラグインです。

ddc.vim は deoplete.nvim と比較してさらにカスタマイズ性が高くなっていて、source や filter までも自分で明確に選ぶ必要があるほどです。

実際に私も filter はお好みで設定していてとても満足しています。

ℹ️
ddc.vim 開発の経緯などは作者の記事 新世代の自動補完プラグイン ddc.vim をご覧ください。

ddc.vim はカスタマイズ性の高さから、人によって設定や使い方は全く異なります。

もちろんREADMEには基本の設定が記載されていますが、さらに一歩進んだおすすめの設定で遊んでみたいという人もいるでしょう。

そこでこのエントリでは、Language Server と組み合わせて使っている私の ddc.vim の設定例を紹介したいと思います。

👉
README に書かれている ddc.vim の導入と基本の設定は完了しているものとして説明していきます。

NeoVim には Language Server クライアントが組み込まれているため、プラグインを導入してクライアントの設定をするだけで済みます。

クライアントの設定には neovim/nvim-lspconfig プラグインを使います。

Plug 'neovim/nvim-lspconfig'

基本的な設定は README に書かれている通りです。

💡
おすすめの設定を NeoVim使いのためのnvim-lspconfig おすすめキーマッピングの紹介 で紹介しているので良かったらご覧ください。

例として、複数の 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' } },
      \ })
ℹ️
最新バージョンでは UI が分離され、UI のインストールと 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 でカーソル移動を行うとき、私はついカーソルキーに手が伸びてしまいます。

補完候補を選択するときにもカーソルキーを使いたい場合は、下記のようにキーマッピングを設定します。

💡
pum.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 の設定例を紹介しました。

Thank you!
Thank you!
URLをコピーしました

コメントを送る

コメントはブログオーナーのみ閲覧できます