Skip to content

Instantly share code, notes, and snippets.

@ujihisa
Last active December 12, 2021 18:00
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ujihisa/ae9785bb37c0a93c9abc3e73318a0479 to your computer and use it in GitHub Desktop.
Save ujihisa/ae9785bb37c0a93c9abc3e73318a0479 to your computer and use it in GitHub Desktop.

ddc.vim 入門

https://github.com/Shougo/ddc.vim

ddcとは?

一言でいうと自動補完プラギンです。neocomplcache, neocomplete, deopleteの後継にあたります。

deopleteと違ってneovim用プラギンのvim8への移植由来のつらいポイントがほぼ皆無となっております。pipもpynvimもhugもインストールする必要がなく、かわりにdenoというコマンドのみをインストールする必要があります。 denoはnodejsの後継にあたるものですが、nodejsのnpm由来のつらいポイントが完全皆無となっております (そもそもnpmではないので)。

作者のShougoさん自らによる記事 https://zenn.dev/shougo/articles/ddc-vim-beta (前述のneocomplcacheやそれ以前のautocomplpopの着想の元となったauto-complete.elからの歴史についても言及があります)

使ってみての最大の特徴は、ddcは徹底してddcプラギンに処理を移譲している点です。neocomplcacheやneocompleteやdeopleteはそれらのプラギンを追加インストールせずとも基本的なファイル名補完などが使えましたが、ddcでは本体だけでは基本的に何も補完できません。 ファイル名補完を行うにはddc-fileをインストールする、などという感じです。

インストール方法

本体のインストールは簡単です。 https://github.com/Shougo/ddc.vim#install に従い、denoとdenopsをインストールします。denopsはVimプラギンなので、実質denoだけです。以下、ArchLinuxでの例です

sudo pacman -S deno

前述のように、これだけでは何も補完できません。以下、バッファ補完とファイル名補完を行う実際の例を記述します。

" deinまわりのあれこれ
call dein#add('Shougo/ddc.vim')
call dein#add('Shougo/ddc-matcher_head')
call dein#add('Shougo/ddc-sorter_rank')
call dein#add('LumaKernel/ddc-file')
call dein#add('matsui54/ddc-buffer')
" deinまわりのあれこれ


function! s:init_ddc()
  let l:sources = []

  call ddc#custom#patch_global('completionMode', 'popupmenu')
  call ddc#custom#patch_global('specialBufferCompletion', v:true) " TODO: disable globally and enable certain butfypes

  " https://github.com/Shougo/ddc-matcher_head
  " https://github.com/Shougo/ddc-sorter_rank
  call ddc#custom#patch_global('sourceOptions', {
        \ '_': {
          \   'matchers': ['matcher_head'],
          \   'sorters': ['sorter_ascii']},
          \ })

  " ddc-file
  let l:sources += ['file']
  call ddc#custom#patch_global('sourceOptions', {
        \ 'file': {
          \   'mark': 'F',
          \   'isVolatile': v:true,
          \   'forceCompletionPattern': '/\S*',
          \ }})
  call ddc#custom#patch_global('sourceParams', {
        \ 'file': {
          \ 'projFromCwdMaxCandidates': [0],
          \ }})

  " ddc-buffer
  let l:sources += ['buffer']
  call ddc#custom#patch_global('sourceOptions', {
        \ '_': {'matchers': ['matcher_head']},
        \ 'buffer': {'mark': 'B'},
        \ })
  call ddc#custom#patch_global('sourceParams', {
        \ 'buffer': {
          \ 'requireSameFiletype': v:false,
          \ 'forceCollect': v:true,
          \ },
          \ })

  call ddc#custom#patch_global('sources', l:sources)
  call ddc#enable()
endfunction

call s:init_ddc()

うまくいくと以下のような挙動をします。

https://asciinema.org/a/2ZputZZK17kuUqvGxDN0N0rqm

🎉

おまけ

なんか補完がうまく効かなくてうろたえているシーンが録画されてしまった...あとでデバグしよう...。 あとかっこつけて例ではVimプラギンマネージャとしてdeinを使ってしまったけど、まだ手元ではneobundleなのでこれもはやいとこあれしないと...

About the author

Tatsuhiro Ujihisa

GenericFactoryGame の作者。 最近は https://vancouversnowboarding.ca というサイトを運営している。 Vancouverでsnowboardする人はぜひ見てみてください。

Vim歴23年です。以前Vim Hacks を連載していました。

VimConf の運営者の一人です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment