Vimの補完プラグインをインストール。その4

Vimの補完プラグインをインストール。その3で、ddc-tabnineが使えそうです、などと書いたのですが、早速やってみました。

まず、tabnineのバイナリを用意しないといけません。がどうにもTabNineのサイトがわかりにくいので、tabnine-nvimにあるダウンロードスクリプトを利用させてもらいます。
(あるいはこちらのdl-binaries.shを単独でダウンロードして実行しても良いかもしれません)

すると最新バージョンのtabnineがbinaries/4.194.0/x86_64-unknown-linux-musl以下に展開されます。

ddc-tabnineでもダウンロードの仕組みはあるのですが、ちゃんと動かないようです。また、あまりメンテもされていないっぽいです。が、ddcプラグイン自体は動きます。

ちなみzipファイルを展開して出てきたTabNineを実行すると、.config/TabNineというディレクトリが作成されて設定などはここに入るようです。

次にddc-tabnineをdein.vimでインストールします。

call dein#add('LumaKernel/ddc-tabnine')  

でもって、そのページにある設定もvimrcにコピーしておきます。

call ddc#custom#patch_global('sources', ['tabnine'])
call ddc#custom#patch_global('sourceOptions', {
    \ 'tabnine': {
    \   'mark': 'TN',
    \   'maxCandidates': 5,
    \   'isVolatile': v:true,
    \ }})

ここで注意。sourceOptionsのmaxCandidatesは、2022年2月22日にmaxItemsに変更されています。

2022.02.22
* Rename maxCandidates to maxItems.
* Rename ddc#map#insert_candidate() to ddc#map#insert_item().
* Deprecate gatherCandidates attribute.

ですので、そのように修正。

また、sourcesにtabnineを追加します。正直、aroundはいらないかなとも思いますが。

call ddc#custom#patch_global('sources', ['vim-lsp', 'tabnine', 'around'])

ここでVimを終了して再起動すると、TabNineが見つからないとかのエラーが出ます。なので、先程ダウンロードしたbinariesディレクトリをそのまま ~/.cache/ddc-tabnine/以下に移動します。

たぶんここまでくれば動くと思いますが、動かない場合(TabNineがまだ見つからないとか)は、

call ddc#custom#patch_global('sourceParams', {
            \ 'tabnine': {
            \   'maxNumResults': 10,
            \   'storageDir': expand('~/.cache/ddc-tabnine/binaries'),
            \ }})

が必要かもしれません。これはddc-tabnine.txtに書いてあります。

 ということでソースを編集してみると、


ちゃんとTabNineが動いているようです。右のほうに "TN" とありますし。

めでたしめでたし、なんですが、あとはRuffでのisortとか試さないと。

Vimの補完プラグインをインストール。その3

Vimの補完プラグインをインストール。その1でRuffは高速でBlackとFlake8とその他もろもろを置き換えできるという件を書きましたが、ちょっと気になったのでインストールしてみます。

Ruffの公式ブログでは、The Ruff Language Serverで、

Ruff can be used to replace Black, Flake8 (plus dozens of plugins), isort, pydocstyle, pyupgrade, and more, all while executing tens or hundreds of times faster than any individual tool.

isortやその他もろもろを置き換えて、さらに数十倍から数百倍も速い、とうたっています。 githubでは、python-lsp-ruffがありますが、0.4.5以降でRuffは "ruff server" でLSPサーバとして動作するとのことで、それなら直接vim-lspとお話できるはずです。

Ruffのドキュメントでは、もういきなりvim-lspから使用するためにvimrcに記載するコードが書かれていました。

if executable('ruff')
    au User lsp_setup call lsp#register_server({
        \ 'name': 'ruff',
        \ 'cmd': {server_info->['ruff', 'server']},
        \ 'allowlist': ['python'],
        \ 'workspace_config': {},
        \ })
endif

さらに、他のLSP(Pyrightなど)の特定の機能を使いたいために、Ruffと組み合わせて使う場合には、

function! s:on_lsp_buffer_enabled() abort
    " add your keybindings here (see https://github.com/prabirshrestha/vim-lsp?tab=readme-ov-file#registering-servers)

    let l:capabilities = lsp#get_server_capabilities('ruff')
    if !empty(l:capabilities)
      let l:capabilities.hoverProvider = v:false
    endif
endfunction

などとするとよい、という設定も書かれています。tabnineなども使えるのかな?

余談ですが、tabnine-vimはdeprecatedになって、tabnine-nvimに開発が移っているようですが、LSPはお話しないので残念ながらNeovimのみが対象のようです。が、LSP経由ではなくてddc.vim経由なら、ddc-tabnineが使えそうです。

閑話休題。

ArchLinuxではextra/ruffパッケージが用意されているので、pacman -S ruffでインストールできます。

次にvimrcからpylspの設定をコメントアウトして、ruffの設定を加えます。

if (executable('ruff'))
    augroup RuffServer
        autocmd!
        autocmd User lsp_setup call lsp#register_server({
            \ 'name': 'ruff',
            \ 'cmd': {server_info->['ruff', 'server']},
            \ 'allowlist': ['python'],
            \ 'languageId': {server_info->'python'}
            \ })
    augroup END
endif

languageIdはあってもなくても。

これでVimを再起動してtest.pyなどと開くと、ちゃんと使えています。

あと、Vimでの折りたたみをLSPにやらせる設定も変えました。

" folding
" LSPにfoldをやらせる
augroup lsp_folding
    autocmd!
    autocmd FileType * setlocal
        \ foldmethod=expr
        \ foldexpr=lsp#ui#vim#folding#foldexpr()
        \ foldtext=lsp#ui#vim#folding#foldexpr()
    autocmd FileType vim setlocal
        \ foldmethod=syntax
        \ foldlevel=0
augroup end

vimrcを編集するときにLSPに折りたたみをやらせるとなんかウザかったので、vimだけ別扱いにしています。というか、* じゃなくてpythonにしてもよかったかも。

ddc-tabnineはまたそのうち。

Vimの補完プラグインをインストール。その4

Vimの補完プラグインをインストール。その3 で、 ddc-tabnine が使えそうです、などと書いたのですが、早速やってみました。 まず、tabnineのバイナリを用意しないといけません。がどうにもTabNineのサイトがわかりにくいので、 tabnine-nvim にあるダ...