LoginSignup
3
2

ddc.vim 使わない奴いる!?いねえよなぁ!?

Posted at

何故か「日和ってるやついる!?」が頭に浮かんだんでタイトルにw (東リべ観てないんだけどね...w)

前回に引き続きdotfile の整理でいざneovim の番になったが乱雑にプラグインがインストールされてるしイマイチ設定されてないしで酷かったからいい感じに自分好みにしてくぞ〜
で, 今回はddc.vim!

ddc.vim とは

彼の有名なShouugoさんが開発された自動補完プラグイン!
プラグインを導入しただけだと何も機能しないけど自分好みにカスタマイズできる!とのことでこれを使う
coc.nvim を使おうか迷ったけど, 巨大すぎて何ができるか理解するのに時間がかかりそうだったから...

必要なものがあるお

実際にddc.vim を入れる前に必要なものを入れるお
ddc.vim はDeno 依存なのでインストールが必須!
てことで〜, やってくぞ!

Deno のインストール

Deno の公式を見てみると

curl -fsSL https://deno.land/install.sh | sh

これを実行すると~/.denoにインストールされる
そしてあとはパスを通すと使えるようになる!

echo 'export DENO_INSTALL="$HOME/.deno"' >> ~/.zshrc
echo 'export PATH="$DENO_INSTALL/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

僕はzsh を使ってますが, 適宜修正してね
で, 再読込まで終わったら一応バージョン確認

deno --version
deno 1.43.3 (release, x86_64-unknown-linux-gnu)
v8 12.4.254.13
typescript 5.4.5

はい!こんな感じで表示されればOK!

denops.vim の導入

まずdenops.vim ってなんぞやだけど,

JavaScript/TypeScript のランタイムであるDeno を利用してVim/Neovim 双方で動作するプラグインを作るためのエコシステム

  • Vim / Neovim で同一コードを利用可能
  • Vim プラグインとしてインストールが可能
  • Vim script と比較してエンジンが爆速なのでゴリ押しが可能
  • ユーザーによるライブラリの依存管理が不要
  • プラグインが別プロセスとして動作するため Vim が固まりにくい
  • プラグイン毎にスレッドが分かれているため相互干渉が起こりにくい

引用 denops.vim とは

denops.vim の解説はこんなもんにしてREADME 通りに導入するお

まずdeno のパスをg:denops#denoに代入してあげるので~/.config/nvim/init.nvimを開いて

:echo exepath('deno')
/home/macha/.deno/bin/deno

これでパスが確認できたので

init.vim
let g:denops#deno = '/home/macha/.deno/bin/deno

そしてプラグインをインストール!
僕は新規プラグインがあれば自動でインストールしてくれるdein を使ってるのでdein.toml

dein.toml
[[plugins]]
repo = 'vim-denops/denops.vim'

を追記して再起動すると無事インストールされるね!

denops が動くか確認するのにvim-denops/denops-helloworld.vimをインストールして:DenopsHelloを実行すると分かるみたい!

dein.toml
[[plugins]]
repo = 'vim-denops/denops-helloworld.vim'

dein.toml に追記してコマンドを実行すると〜

:DenopsHello
Hello, Denops!

OK!
今後は使わないから削除してOKだよ〜

donops のプラグインの起動が遅い場合, 共有サーバーを使うと早くなるみたい
僕は使わないけど使う人はどうぞ!

init.vim
let g:denops_server_addr = '127.0.0.1:32123'
dein.toml
[[plugins]]
repo = 'vim-denops/denops-shared-server.vim'
:call denops_shared_server#install()

これでオッケ!

ddc.vim を導入

事前準備が終わったらddc.vim をインストールしよう!
一旦Shougo さんの紹介を忠実に追ってくよ

dein.toml
# ddc 本体
[[plugins]]
repo = 'Shougo/ddc.vim'
hook_add = '/path/your/config.d/ddc.vim'

# ddc の補完を表示させるやつ
[[plugins]]
repo = 'Shougo/ddc-ui-native'

ん?ddc-ui-native
何だお前?と思ったそこのあなた!
コメントに書いたとおり補完を表示してくれるやつ
ddc 自体は補完機能を提供してるだけで表示は別でやらなきゃいけない!(それに気づくまで時間かかった...)

で, 補完機能と表示ができるようになっても補完内容が無いので追加!

dein.toml
# バッファー内の情報を補完
[[plugins]]
repo = 'Shougo/ddc-source-around'

# ヘッダーのマッチを
[[plugins]]
repo = 'Shougo/ddc-filter-matcher_head'

# 補完を現在の入力に応じて変化させる
[[plugins]]
repo = 'Shougo/ddc-filter-sorter_rank'

一旦これらをインストールして次にddc.vim の設定するお

config.d/ddc.vim
" ui で何を使用するか指定
call ddc#custom#patch_global('ui', 'native')

" 補完内容を管理
call ddc#custom#patch_global('sources', ['around'])

" 保管時のオプションを管理
call ddc#custom#patch_global('sourceOptions', {
      \ '_': {
      \   'matchers': ['matcher_head'],
      \   'sorters': ['sorter_rank']},
      \ })

" ddc を有効化!
call ddc#enable()

これでvim を再起動すると...

image.png

スクショが見づらいけど〜YES!!!!
補完が動いた〜

次はファイルの補完を!

dein.toml
[[plugins]]
repo = 'LumaKernel/ddc-source-file'
config.d/ddc.vim
call ddc#custom#patch_global('ui', 'native')

" file を補完候補に追加する
call ddc#custom#patch_global('sources', ['around', 'file'])

" 前の設定だとどっちがaround かfile かわからないのでmark を設定
call ddc#custom#patch_global('sourceOptions', {
      \ '_': {
      \   'matchers': ['matcher_head'],
      \   'sorters': ['sorter_rank']
      \ },
      \ 'around': {
      \   'mark': 'A'
      \ },
      \ 'file': {
      \   'mark': 'F',
      \   'isVolatile': v:true,
      \   'forceCompletionPattern': '\S/\S*',
      \ }})
call ddc#custom#patch_filetype(
    \ ['ps1', 'dosbatch', 'autohotkey', 'registry'], {
    \ 'sourceOptions': {
    \   'file': {
    \     'forceCompletionPattern': '\S\/\S*',
    \   },
    \ },
    \ 'sourceParams': {
    \   'file': {
    \     'mode': 'unix',
    \   },
    \ }})
call ddc#enable()

またまた見づらいけどできた!

image.png

file は違うけどShougo さんの後を追ってきたからここからは僕が好きなようにイジっていくぜ〜 :thumbsup:

TABで補完したくないやついる!?いねえよなぁ!?

またまた擦ってTAB 補完!
デフォルトだとTABがそのままになってるので補完できるように
ddcのdoc を見るとddc-ui-native用の設定が書いてある!
ありがたや〜

init.vim
" <TAB>: completion.
inoremap <expr> <TAB>
    \ pumvisible() ? '<C-n>' :
    \ (col('.') <= 1 <Bar><Bar> getline('.')[col('.') - 2] =~# '\s') ?
    \ '<TAB>' : ddc#map#manual_complete()

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

でもTAB いっぱい押すの嫌だから, も使えるようにしよう!

init.vim
" <C-j>: completion.
inoremap <expr> <C-j>
    \ pumvisible() ? '<space>' :
    \ (col('.') <= 1 <Bar><Bar> getline('.')[col('.') - 2] =~# '\s') ?
    \ '<TAB>' : ddc#map#manual_complete()
" <C-k>: completion back.
inoremap <expr> <C-k>  pumvisible() ? '<C-p>' : ''

source を更に追加していくぞ〜

TAB 補完とかを有効にしたらsource (補完候補) を増やして便利にするぜ :sunglasses:
ddc のsource はTopics にまとめてあるから自分で好きなのを選ぼう!

ddc-source-vim-lsp

やっぱコードを書くならLSP (Language Server Protocol) は欲しいでしょってことでddc-source-vim-lsp

この子はvim-lspも必要とのことなのでこれの設定ができるvim-lsp-settingsもついでに

dein.toml
[[plugins]]
repo = 'prabirshrestha/vim-lsp'

[[plugins]]
repo = 'mattn/vim-lsp-settings'
hook_add = '''
execute 'source ' . g:plugin_config_dir . '/hook/vim-lsp-settings.vim'
'''

[[plugins]]
repo = 'shun/ddc-source-vim-lsp'
config.d/ddc.vim
call ddc#custom#patch_global('sources', [
    \ 'around',
    \ 'file',
    \ 'vim-lsp',
    \ ])

call ddc#custom#patch_global('sourceOptions', {
    \   '_': {
    \     'matchers': ['matcher_head'],
    \     'sorters': ['sorter_rank']
    \   },
    \   'around': {
    \     'mark': 'A'
    \   },
    \   'file': {
    \     'mark': 'F',
    \     'isVolatile': v:true,
    \     'forceCompletionPattern': '\S/\S*',
    \   },
    \   'vim-lsp': {
    \     'mark': 'lsp',
    \     'forceCompletionPattern': '\.\w*|:\w*|->\w*',
    \   },
    \ })

vim-lsp-settings の設定は別の記事で!(今後追加予定)

image.png

とりあえずおっけ〜

ddc-tabnine

AI がいい感じにコードを提案してくれるやつ!
github Copilot に似たサービスで無料でも使える :thumbsup:

dein.toml
[[plugins]]
repo = 'LumaKernel/ddc-tabnine'
config.d/ddc.vim
call ddc#custom#patch_global('sources', [
    \ 'around',
    \ 'file',
    \ 'vim-lsp',
    \ 'tabnine',
    \ ])

call ddc#custom#patch_global('sourceOptions', {
    \   '_': {
    \     'matchers': ['matcher_fuzzy'],
    \     'sorters': ['sorter_fuzzy'],
    \     'converters': ['converter_fuzzy'],
    \     'minAutoCompleteLength': 1,
    \   },
    \   'around': {
    \     'mark': 'A'
    \   },
    \   'file': {
    \     'mark': 'F',
    \     'isVolatile': v:true,
    \     'forceCompletionPattern': '\S/\S*',
    \   },
    \   'vim-lsp': {
    \     'mark': 'lsp',
    \     'forceCompletionPattern': '\.\w*|:\w*|->\w*',
    \   },
    \   'tabnine': {
    \     'mark': 'TN',
    \     'maxItems': 5,
    \   },
    \ })

これでできたと思ったけど

[denops] [ddc-tabnine] Failed to install TabNine cli version 4.160.0.

インストールが失敗してるけどなぜだ?

ddc-tanine でTabNine のインストールが失敗するぞ...

どうにかして使えるようにしたいのでとりあえずファイルがあるかわからないから確認を
デフォルトでDefault: <XDG Cache Dir>/ddc-tabnine/binariesにインストールされるらしいので確認すると

ls <XDG Cache Dir>/ddc-tabnine/binaries/4.160.0

何も見つからず
ddc_tabnine#reinstall()という関数があるらしいので実行してみると

function ddc_tabnine#reinstall[1]..denops#request[1]..denops#_internal#server#chan#request[6]..denops#_internal#rpc#nvi
m#request の処理中にエラーが検出されました:

まだだめだぁ
もう一度ディレクトリを確認してみると

ls <XDG Cache Dir>/ddc-tabnine/binaries/4.160.0
x86_64-unknown-linux-musl

お!
ディレクトリが増えてる!
中を見てみると

ls <XDG Cache Dir>/ddc-tabnine/binaries/4.160.0/x86_64-unknown-linux-musl
TabNine.zip

Zip ファイルがある!
これを解答してみると

unzip TabNine.zip
Archive:  TabNine.zip
  inflating: TabNine
  inflating: TabNine-deep-cloud
  inflating: TabNine-deep-local
  inflating: TabNine-server-runner
  inflating: WD-TabNine
ls
TabNine  TabNine-deep-cloud  TabNine-deep-local  TabNine-server-runner  TabNine.zip  WD-TabNine

色々出てきた
一旦vim を再起動してみると

:messages
[ddc] PermissionDenied: Failed to spawn '<XDG Cache Dir>/ddc-tabnine/binaries/4.160.0/x86_64-unknown-linux-musl/TabN
ine': Permission denied (os error 13)

権限が無いと
確認してみると

ls -l
合計 125M
-rw-r--r-- 1 macha macha  44M  5月  6 17:48 TabNine
-rw-r--r-- 1 macha macha  13M  5月  6 17:48 TabNine-deep-cloud
-rw-r--r-- 1 macha macha  15M  5月  6 17:48 TabNine-deep-local
-rw-r--r-- 1 macha macha 6.3M  5月  6 17:48 TabNine-server-runner
-rw-rw-r-- 1 macha macha  40M  5月 19 01:43 TabNine.zip
-rw-r--r-- 1 macha macha 8.8M  5月  6 17:48 WD-TabNine

実行権限が無いからだ
chmod +xで与えてあげると

chmod +x TabNine TabNine-deep-cloud TabNine-deep-local TabNine-server-runner WD-TabNine

image.png

お!無事使えるようになった!

filter も追加だ!

source の追加が終わったら次はfilter を追加するぞ〜

ddc-fuzzy

人間と同じようにvim にも曖昧でいて欲しいからフィルターをfuzzy に!
その関係で初めに入れたddc-filter-sorter_rankddc-filtermatcher_headは削除するよ〜

dein.toml
[[plugins]]
repo = 'tani/ddc-fuzzy'
config.d/ddc.vim
call ddc#custom#patch_global('sourceOptions', {
    \   '_': {
    \     'matchers': ['matcher_fuzzy'],
    \     'sorters': ['sorter_fuzzy'],
    \     'converters': ['converter_fuzzy'],
    \     'minAutoCompleteLength': 1,
    \   },
    \   'around': {
    \     'mark': 'A'
    \   },
    \   'file': {
    \     'mark': 'F',
    \     'isVolatile': v:true,
    \     'forceCompletionPattern': '\S/\S*',
    \   },
    \   'vim-lsp': {
    \     'mark': 'lsp',
    \     'forceCompletionPattern': '\.\w*|:\w*|->\w*',
    \   },
    \ })
    
call ddc#custom#patch_global('filterParams', {
    \   'matcher_fuzzy': {
    \     'splitMode': 'word'
    \   }
    \ })

何がどう変わったかわ分かんないけどOK!

補完候補多すぎでは??

特に何もイジってないとlspがめっっっっちゃ出てきちゃう...

image.png

こんなにあっても困るので表示数を少なくしちゃう!
ついでにTabNine の候補をデフォルトの5から10にするよ〜

maxItemsを指定してあげると調整できる〜

2022.02.22 にmaxCandidates からmaxItems にリネームされてるから注意!
https://github.com/Shougo/ddc.vim/blob/main/doc/ddc.txt#L1752

config.d/ddc.vim
call ddc#custom#patch_global('sourceOptions', {
    \   '_': {
    \     'matchers': ['matcher_fuzzy'],
    \     'sorters': ['sorter_fuzzy'],
    \     'converters': ['converter_fuzzy'],
    \     'minAutoCompleteLength': 1,
    \   },
    \   'around': {
    \     'mark': 'A'
    \   },
    \   'file': {
    \     'mark': 'F',
    \     'isVolatile': v:true,
    \     'forceCompletionPattern': '\S/\S*',
    \   },
    \   'vim-lsp': {
    \     'mark': 'lsp',
    \     'maxItems': 15,
    \   },
    \   'tabnine': {
    \     'mark': 'TN',
    \     'maxItems': 10,
    \   },
    \ })

image.png

おけおけ

補完候補の順番を変えたい...

今は

  1. around
  2. file
  3. lsp
  4. tabnine

の順になってるけどaround は下でいいし, tabnine は上にいて欲しいのでddc#custom#patch_global('sources'の順番をイジるお

image.png

config.d/ddc.vim
call ddc#custom#patch_global('sources', [
    \ 'tabnine',
    \ 'file',
    \ 'vim-lsp',
    \ 'around',
    \ ])

image.png

おっけ〜

こんな感じかな〜

いい感じに補完ができるようになったぜ〜
まだプラグインとか見直し中だからもしかしたらもうちょっと変わるかもしれないけど今回はここまで!

次はvim-lsp-settings:hand_splayed:

参考文献

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2