Vimのバージョンが9.0になっていることを最近知り、vim-jpからWindows用のバイナリ―をダウンロードしました。
しかし、Vim9.0では今まで使っていた補完プラグインが使えないことが分かりました。そこで、ddc.vimというものを試すことにしたのですが、使い始めるまでに少し迷子になったので、この備忘録を書くことにしました。
まずはdenoをインストールします。 denoのサイト インストール方法のページを読み、PowerShellで を実行しましたが、上手く行きませんでした。 「はて?」と思いつつもPowerShellの事をよく分かっていないので、何となく楽そうなScoopによるインストール方法を試すことにしました。PowerShellで を実行すると、Scoopのインストールが終わりました。 (備考)ExecutionPolicyを確認するには、Get-ExecutionPolicyを使います。 画面に「'deno' (1.32.5) was installed successfully!」と表示され、無事にdenoのインストールができました。 今にして思えば、最初にPowerShellでインストールに失敗したのもExecutionPolicyが原因だったのかもしれません。 次に、ddc.vim、denops.vim、UIプラグインをインストールします。私はvim-plugを使用していますので.vimrc(もしくは_vimrc)を開いて、以下のようにPlugで始まる3行を記述しました。 というメッセージが表示されたので、ddc-ui-nativeもインストールすることにしました。 次に、補完候補を供給するsource、補完候補を絞り込んだり並べ替えたりするfilterをインストールします。 https://github.com/topics/ddc-source インストールしたものを使うために、.vimrc(もしくは_vimrc)に以下の内容を追記しました。 もし私のような素人でddc.vimをこれから触ろうとする人が上記の設定内容を見たらチンプンカンプンだと思いますので、情報源について触れておきます。 デフォルトでは何のsourceも設定されていないので、補完候補が表示されません。何か1つ以上のsourceを指定する必要があります。 この例にある ddc#custom#patch_global() はグローバル設定を変更するもので、aroundというsourceを指定しています。 この例ではaround及びnextwordというsourceを指定しています。 次にsource optionの設定方法です。 となっています。つまり、sourceはaroundです。source optionはmarkです。markの引数は A です。 この部分ではsourceとして _ を指定していますが、基本構造は同じです。 引数を囲んでいる [ ] についてはよく分かりませんが、複数の引数を並べることを考慮しているのかもしれません。matchersに対して複数の引数を与える場合、たとえば次のようになります。 2行目と3行目ではsource名を指定しているので、source optionは特定のsourceにだけ適用されます。 これは私の設定内容です。aroundというsourceから提供された補完候補には[Around]と表示され、dictionaryというsourceから提供された補完候補には[Dict]と表示されます。 という風にaroundをdictionaryよりも先に指定しているので、スクリーンショットにあるとおり、[Around] → [Dict]という順序になっています。 の5行目と6行目にあるmatchersとsortersについては、ddc.vimのドキュメントに次のように記述されています。 この記述からmatchersとsortersの引数として指定されているmatcher_headやsorter_rankはfilterだと分かります。では、filterとは何でしょうか? なお、作者様のZenn記事には「sourcesやmatchers, sorters, convertersは名前のチェック機能が存在しており、インストールしていないものを指定するとエラーになります」と書かれています。 このように複数のmatchers用filterを並べて記述することもできます。 <ポップアップで補完候補を表示するプラグイン> <source> <filter>
目次
denoのインストール
https://deno.com/runtime
irm https://deno.land/install.ps1 | iex
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex
念のためExecutionPolicyを元に戻しておきました。Set-ExecutionPolicy Restricted -Scope CurrentUser
それからdenoをインストールすべく、以下のコマンドを実行しました。scoop install deno
すると、「このシステムではスクリプトの実行が無効になっているため(以下略)」というコメントが表示されました。ExecutionPolicyが原因のようだったので、ExecutionPolicyをRemoteSignedにしてからscoopコマンドを実行しました。Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
scoop install deno
最後にExecutionPolicyをRestrictedに戻してPowerShellウィンドウを閉じました。Set-ExecutionPolicy Restricted -Scope CurrentUser
Get-ExecutionPolicy
余談ですが、次のコマンドでdenoを最新版にアップグレードできるようです。deno upgrade
ddc.vim、denops.vim、UIプラグインのインストール
" 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.
.vimrc(もしくは_vimrc)を再読み込みして、vim-plugでプラグインをインストールしました。:source %
:PlugInstall
sourceやfilterのインストール
sourceやfilterは以下の場所で探すことができました。
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の設定
" 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()
情報源は、sourceやfilterに付属しているドキュメントに書かれた設定例です。「EXAMPLE」とか「CONFIGURATION」とか、そういった見出しを探してみると良いと思います。sourceの設定に関する説明
" この例はddc.vim作者様のZenn記事から引用しました
call ddc#custom#patch_global('sources', ['around'])
複数のsourceを指定する場合は次のようにします。" この例はddc.vim作者様のZenn記事から引用しました
call ddc#custom#patch_global('sources', ['around', 'nextword'])
なお、指定した順序が候補の順序になるそうです。この例では、aroundが先にありますので、aroundの候補が先に登場して、次にnextwordの候補が登場します。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の引数'}
\ '_': {
\ 'matchers': ['matcher_head'],
\ 'sorters': ['sorter_rank']},
sourceは _ です(後述)。source optionはmatchersとsortersです。matchersの引数はmatcher_headで、sortersの引数はsorter_rankです。(1行にした図)
'_' : { 'matchers': ['matcher_head'], 'sorters': ['sorter_rank']}
↑ ↑ ↑ ↑ ↑
source source option 引数 source option 引数
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行目は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]'},
ついでに、補完候補の出現順序にも触れておきます。sourceの設定方法について述べた折、「指定した順序が候補の順序になる」と書きました。私の環境ではcall ddc#custom#patch_global('sources', ['around', 'dictionary'])
<その他の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']},
\ })
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: []
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で探す
<複数のmatchersを指定する例>matchers: ['matcher_head', 'matcher_length'],
その他
Shougo/pum.vim
matsui54/ddc-buffer
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