何故か「日和ってるやついる!?」が頭に浮かんだんでタイトルに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 の解説はこんなもんにしてREADME 通りに導入するお
まずdeno のパスをg:denops#deno
に代入してあげるので~/.config/nvim/init.nvim
を開いて
:echo exepath('deno')
/home/macha/.deno/bin/deno
これでパスが確認できたので
let g:denops#deno = '/home/macha/.deno/bin/deno
そしてプラグインをインストール!
僕は新規プラグインがあれば自動でインストールしてくれるdein を使ってるのでdein.toml
に
[[plugins]]
repo = 'vim-denops/denops.vim'
を追記して再起動すると無事インストールされるね!
denops が動くか確認するのにvim-denops/denops-helloworld.vim
をインストールして:DenopsHello
を実行すると分かるみたい!
[[plugins]]
repo = 'vim-denops/denops-helloworld.vim'
dein.toml
に追記してコマンドを実行すると〜
:DenopsHello
Hello, Denops!
OK!
今後は使わないから削除してOKだよ〜
donops のプラグインの起動が遅い場合, 共有サーバーを使うと早くなるみたい
僕は使わないけど使う人はどうぞ!
let g:denops_server_addr = '127.0.0.1:32123'
[[plugins]]
repo = 'vim-denops/denops-shared-server.vim'
:call denops_shared_server#install()
これでオッケ!
ddc.vim を導入
事前準備が終わったらddc.vim をインストールしよう!
一旦Shougo さんの紹介を忠実に追ってくよ
# 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 自体は補完機能を提供してるだけで表示は別でやらなきゃいけない!(それに気づくまで時間かかった...)
で, 補完機能と表示ができるようになっても補完内容が無いので追加!
# バッファー内の情報を補完
[[plugins]]
repo = 'Shougo/ddc-source-around'
# ヘッダーのマッチを
[[plugins]]
repo = 'Shougo/ddc-filter-matcher_head'
# 補完を現在の入力に応じて変化させる
[[plugins]]
repo = 'Shougo/ddc-filter-sorter_rank'
一旦これらをインストールして次に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 を再起動すると...
スクショが見づらいけど〜YES!!!!
補完が動いた〜
次はファイルの補完を!
[[plugins]]
repo = 'LumaKernel/ddc-source-file'
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()
またまた見づらいけどできた!
file は違うけどShougo さんの後を追ってきたからここからは僕が好きなようにイジっていくぜ〜
TABで補完したくないやついる!?いねえよなぁ!?
またまた擦ってTAB 補完!
デフォルトだとTABがそのままになってるので補完できるように
ddcのdoc を見るとddc-ui-native
用の設定が書いてある!
ありがたや〜
" <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 いっぱい押すの嫌だから, も使えるようにしよう!
" <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 (補完候補) を増やして便利にするぜ
ddc のsource はTopics にまとめてあるから自分で好きなのを選ぼう!
ddc-source-vim-lsp
やっぱコードを書くならLSP (Language Server Protocol) は欲しいでしょってことでddc-source-vim-lsp
!
この子はvim-lsp
も必要とのことなのでこれの設定ができるvim-lsp-settings
もついでに
[[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'
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 の設定は別の記事で!(今後追加予定)
とりあえずおっけ〜
ddc-tabnine
AI がいい感じにコードを提案してくれるやつ!
github Copilot に似たサービスで無料でも使える
[[plugins]]
repo = 'LumaKernel/ddc-tabnine'
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
お!無事使えるようになった!
filter も追加だ!
source の追加が終わったら次はfilter を追加するぞ〜
ddc-fuzzy
人間と同じようにvim にも曖昧でいて欲しいからフィルターをfuzzy に!
その関係で初めに入れたddc-filter-sorter_rank
とddc-filtermatcher_head
は削除するよ〜
[[plugins]]
repo = 'tani/ddc-fuzzy'
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
がめっっっっちゃ出てきちゃう...
こんなにあっても困るので表示数を少なくしちゃう!
ついでにTabNine の候補をデフォルトの5から10にするよ〜
maxItems
を指定してあげると調整できる〜
2022.02.22 にmaxCandidates からmaxItems にリネームされてるから注意!
https://github.com/Shougo/ddc.vim/blob/main/doc/ddc.txt#L1752
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,
\ },
\ })
おけおけ
補完候補の順番を変えたい...
今は
- around
- file
- lsp
- tabnine
の順になってるけどaround は下でいいし, tabnine は上にいて欲しいのでddc#custom#patch_global('sources'
の順番をイジるお
call ddc#custom#patch_global('sources', [
\ 'tabnine',
\ 'file',
\ 'vim-lsp',
\ 'around',
\ ])
おっけ〜
こんな感じかな〜
いい感じに補完ができるようになったぜ〜
まだプラグインとか見直し中だからもしかしたらもうちょっと変わるかもしれないけど今回はここまで!
次はvim-lsp-settings
で
参考文献