恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

ddc.vim覚書

Vimのバージョンが9.0になっていることを最近知り、vim-jpからWindows用のバイナリ―をダウンロードしました。

しかし、Vim9.0では今まで使っていた補完プラグインが使えないことが分かりました。そこで、ddc.vimというものを試すことにしたのですが、使い始めるまでに少し迷子になったので、この備忘録を書くことにしました。


目次


denoのインストール

まずはdenoをインストールします。

denoのサイト
https://deno.com/runtime

インストール方法のページを読み、PowerShell

irm https://deno.land/install.ps1 | iex

を実行しましたが、上手く行きませんでした。

「はて?」と思いつつもPowerShellの事をよく分かっていないので、何となく楽そうなScoopによるインストール方法を試すことにしました。PowerShell

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex

を実行すると、Scoopのインストールが終わりました。

念のためExecutionPolicyを元に戻しておきました。

Set-ExecutionPolicy Restricted -Scope CurrentUser

(備考)ExecutionPolicyを確認するには、Get-ExecutionPolicyを使います。

それからdenoをインストールすべく、以下のコマンドを実行しました。

scoop install deno


すると、「このシステムではスクリプトの実行が無効になっているため(以下略)」というコメントが表示されました。ExecutionPolicyが原因のようだったので、ExecutionPolicyをRemoteSignedにしてからscoopコマンドを実行しました。

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
scoop install deno

画面に「'deno' (1.32.5) was installed successfully!」と表示され、無事にdenoのインストールができました。 今にして思えば、最初にPowerShellでインストールに失敗したのもExecutionPolicyが原因だったのかもしれません。

最後にExecutionPolicyをRestrictedに戻してPowerShellウィンドウを閉じました。

Set-ExecutionPolicy Restricted -Scope CurrentUser
Get-ExecutionPolicy


余談ですが、次のコマンドでdenoを最新版にアップグレードできるようです。

deno upgrade


ddc.vim、denops.vim、UIプラグインのインストール

次に、ddc.vim、denops.vim、UIプラグインをインストールします。私はvim-plugを使用していますので.vimrc(もしくは_vimrc)を開いて、以下のようにPlugで始まる3行を記述しました。

" vim-plugを使っている場合の記述例

call plug#begin('~/.vim/plugin_box')    ← 括弧内は各自の環境によって異なります
    Plug 'Shougo/ddc.vim'
    Plug 'vim-denops/denops.vim'
    Plug 'Shougo/ddc-ui-native'
call plug#end()


当初、必須のものはddc.vimとdenops.vimだけだと思っていたのですが、UIプラグインをインストールせずにddc.vimを動かそうとしたら

[ddc] You must install ddc UI plugins and specify "ui" option.

というメッセージが表示されたので、ddc-ui-nativeもインストールすることにしました。


.vimrc(もしくは_vimrc)を再読み込みして、vim-plugでプラグインをインストールしました。

:source %
:PlugInstall


sourceやfilterのインストール

次に、補完候補を供給するsource、補完候補を絞り込んだり並べ替えたりするfilterをインストールします。

sourceやfilterは以下の場所で探すことができました。

https://github.com/topics/ddc-source
https://github.com/topics/ddc-filter


上記サイトを眺めた結果、次のものをインストールすることにしました。

Shougo/ddc-source-around   → 現在バッファから補完候補を供給するsource
matsui54/ddc-dictionary    → 辞書ファイルから補完候補を供給するsouce
tani/ddc-fuzzy             → ファジーマッチングをするfilter


以上3つをvim-plugの設定項目に追記しました。

" vim-plugを使っている場合の記述例

call plug#begin('~/.vim/plugin_box')    ← 括弧内は各自の環境によって異なります
    Plug 'Shougo/ddc.vim'
    Plug 'vim-denops/denops.vim'
    Plug 'Shougo/ddc-ui-native'
    Plug 'Shougo/ddc-source-around'   " [source] 現在バッファから補完候補を供給
    Plug 'matsui54/ddc-dictionary'    " [source] 辞書ファイルから補完候補を供給
    Plug 'tani/ddc-fuzzy'             " [filter]
call plug#end()


.vimrc(もしくは_vimrc)を再読み込みして、vim-plugでプラグインをインストールしました。

:source %
:PlugInstall


source, source option, source paramの設定

インストールしたものを使うために、.vimrc(もしくは_vimrc)に以下の内容を追記しました。

" UI
call ddc#custom#patch_global('ui', 'native')

" SOURCE
call ddc#custom#patch_global('sources', ['around', 'dictionary'])

" SOURCE OPTION    (filterはここで指定)
call ddc#custom#patch_global('sourceOptions', {
    \ 'around': {'mark': '[Around]'},
    \ 'dictionary': {'mark': '[Dict]'},
    \ '_': {
    \ 'matchers': ['matcher_fuzzy'],
    \ 'sorters': ['sorter_fuzzy'],
    \ 'converters': ['converter_fuzzy'],
    \ 'isVolatile': v:false
    \ }
    \ })
"   isVolatileがv:trueだとdictionaryに含まれていない補完候補も登場したので v:falseにしました

" SOURCE PARAM
call ddc#custom#patch_global('sourceParams', {
    \ 'dictionary': {'dictPaths':
    \ ['C:\Users\hoge\Documents\hogehoge\koten',
    \  'C:\Users\hoge\Documents\hogehoge\kanbun'],
    \ 'showMenu': v:false
    \ }
    \ })
"   この例では2つの辞書(kotenとkanbun)を指定している
"   showMenu を v:true にすると補完候補の供給元である辞書ファイル名が表示される

" ddc.vimを有効化する
call ddc#enable()

もし私のような素人でddc.vimをこれから触ろうとする人が上記の設定内容を見たらチンプンカンプンだと思いますので、情報源について触れておきます。

情報源は、sourceやfilterに付属しているドキュメントに書かれた設定例です。「EXAMPLE」とか「CONFIGURATION」とか、そういった見出しを探してみると良いと思います。


sourceの設定に関する説明

デフォルトでは何のsourceも設定されていないので、補完候補が表示されません。何か1つ以上のsourceを指定する必要があります。

" この例はddc.vim作者様のZenn記事から引用しました

call ddc#custom#patch_global('sources', ['around'])

この例にある ddc#custom#patch_global() はグローバル設定を変更するもので、aroundというsourceを指定しています。


複数のsourceを指定する場合は次のようにします。

" この例はddc.vim作者様のZenn記事から引用しました

call ddc#custom#patch_global('sources', ['around', 'nextword'])

この例ではaround及びnextwordというsourceを指定しています。
なお、指定した順序が候補の順序になるそうです。この例では、aroundが先にありますので、aroundの候補が先に登場して、次にnextwordの候補が登場します。


source optionの設定に関する説明

次にsource optionの設定方法です。

" この例はddc.vim作者様のZenn記事から引用しました

call ddc#custom#patch_global('sourceOptions', {
      \ 'around': {'mark': 'A'},
      \ 'nextword': {'mark': 'nextword'},
      \ '_': {
      \   'matchers': ['matcher_head'],
      \   'sorters': ['sorter_rank']},
      \ })


まず、次の行を見てみます。

\ 'around': {'mark': 'A'},


この部分は

'source':{'souce option': 'source optionの引数'}

となっています。つまり、sourceはaroundです。source optionはmarkです。markの引数は A です。


\ '_': {
\   'matchers': ['matcher_head'],
\   'sorters': ['sorter_rank']},

この部分ではsourceとして _ を指定していますが、基本構造は同じです。
sourceは _ です(後述)。source optionはmatchersとsortersです。matchersの引数はmatcher_headで、sortersの引数はsorter_rankです。

(1行にした図)

'_'   :   { 'matchers': ['matcher_head'],   'sorters': ['sorter_rank']}
 ↑             ↑              ↑                ↑             ↑
source       source option    引数          source option     引数

引数を囲んでいる [ ] についてはよく分かりませんが、複数の引数を並べることを考慮しているのかもしれません。matchersに対して複数の引数を与える場合、たとえば次のようになります。

matchers: ['matcher_head', 'matcher_length'],


< _ とは何か?>
作者様のZenn記事に「source名に _ を与えることでデフォルトの設定を変更します」と書かれています。一方、( _ ではなく)特定のsource名を指定した場合、source optionはそのsourceにだけ適用されます。

" この例はddc.vim作者様のZenn記事から引用しました

call ddc#custom#patch_global('sourceOptions', {
      \ 'around': {'mark': 'A'},
      \ 'nextword': {'mark': 'nextword'},
      \ '_': {
      \   'matchers': ['matcher_head'],
      \   'sorters': ['sorter_rank']},
      \ })

2行目と3行目ではsource名を指定しているので、source optionは特定のsourceにだけ適用されます。
2行目はaroundに固有の設定をしています(around をsourceとした補完候補には A と表示される)。
3行目はnextwordに固有の設定をしています(nextwordをsourceとした補完候補にはnextwordと表示される)。
4行目以下は全てのsourceに対する設定をしています。

<markの具体例>
markについては具体例を見た方がイメージが湧くと思います。

call ddc#custom#patch_global('sourceOptions', {
    \ 'around': {'mark': '[Around]'},
    \ 'dictionary': {'mark': '[Dict]'},

これは私の設定内容です。aroundというsourceから提供された補完候補には[Around]と表示され、dictionaryというsourceから提供された補完候補には[Dict]と表示されます。



ついでに、補完候補の出現順序にも触れておきます。sourceの設定方法について述べた折、「指定した順序が候補の順序になる」と書きました。私の環境では

call ddc#custom#patch_global('sources', ['around', 'dictionary'])

という風にaroundをdictionaryよりも先に指定しているので、スクリーンショットにあるとおり、[Around] → [Dict]という順序になっています。


<その他のsource option>
その他のsource optionについては、ddc.vimのドキュメントで「SOURCE OPTIONS」の項目に記述されています。


filterの設定に関する説明

" この例はddc.vim作者様のZenn記事から引用しました

call ddc#custom#patch_global('sourceOptions', {
      \ 'around': {'mark': 'A'},
      \ 'nextword': {'mark': 'nextword'},
      \ '_': {
      \   'matchers': ['matcher_head'],
      \   'sorters': ['sorter_rank']},
      \ })

の5行目と6行目にあるmatchersとsortersについては、ddc.vimのドキュメントに次のように記述されています。

matchers(string[])
    It is a list of registered filter names to filter items by user input.
    Items will be processed in the order you specify here.
    Default: []

sorters(string[])
    It is a list of registered filter names to sort items.
    Items will be processed in the order you specify here.
    Default: []

この記述からmatchersとsortersの引数として指定されているmatcher_headやsorter_rankはfilterだと分かります。では、filterとは何でしょうか?


ddc.vimのドキュメントの「FILTERS」という項目に以下の説明があります。

(1) sourceから渡された補完候補はmatchers, sorters, convertersの引数として指定されたfilterに渡される
(2) matchersは、ユーザーが入力した内容に応じて補完候補を絞り込む  
    sortersは、補完候補を並べ替える  
    convertersは、補完候補の属性を変更する(←これ、まだ意味を理解していません、汗)  
(3) 呼び出される順番は「matchers → sorters → converters」の順。  
(4) デフォルトでは何も指定されていないので、各自で設定する必要がある。  
(5) filterは"denops/@ddc-filters/*.ts"に置く
(6) filter名はファイル名  
(7) filterは https://github.com/topics/ddc-filterで探す

なお、作者様のZenn記事には「sourcesやmatchers, sorters, convertersは名前のチェック機能が存在しており、インストールしていないものを指定するとエラーになります」と書かれています。

<複数のmatchersを指定する例>

matchers: ['matcher_head', 'matcher_length'],

このように複数のmatchers用filterを並べて記述することもできます。


その他

<ポップアップで補完候補を表示するプラグイン
Shougo/pum.vim

<source>
matsui54/ddc-buffer

<filter>
LumaKernel/ddc-source-file (ファイル名補完)
Shougo/ddc-filter-matcher_head
Shougo/ddc-filter-sorter_rank
Shougo/ddc-filter-converter_remove_overlap
Shougo/ddc-filter-matcher_length