🐜

dvpm(Denops Vim Plugin Manager)を導入してみた

2024/12/01に公開
2

はじめに

最近 dvpm を導入してみたのでその紹介をします。
dvpm って何?という方は作者さんの記事を読んでいただくのが良いと思います。
dvpm について一言で説明すると「起動速度が遅いなら全部遅延読み込みにしてしまえば良いじゃない」という思い切った設計のプラグインマネージャです。
もちろん TypeScript で設定を書けるなど他にも魅力もありますが, 今回はそれらの部分については触れません。

dvpm 導入前の状況

vim-jetpack を使っており、プラグインの数は120個程度です。起動時間は200ms程度だったので、許容範囲内でした。

dvpm 導入の動機

許容範囲とはいえ Neovim の起動時間を短縮できれば嬉しいと考えていました。ただ遅延読み込みの設定をするのは面倒だなと。
というのも自分の運用としては以下のような流れが基本です。

  1. Neovim 起動
  2. Fuzzy-Finder を開く
  3. 目的のファイルに移動
  4. 編集する

このような流れのため、起動直後に使いたいのは Fuzzy-Finder である telescope.nvim だけです。
telescope.nvim だけ起動時に読み込んで他は遅延読み込みしてくれれば十分です。発火のタイミングを個別に指定するプラグインマネージャは自分にとって過剰だと感じました。
そしてそんなユースケースにピッタリだと思ったのが dvpm でした。
dvpm で全てのプラグインを遅延読み込みし、telecope.nvim だけ起動時に読み込むという設定を試してみることにしました。

やったこと

  1. telescope.nvim 関連のプラグインだけ init.vim にランタイムパスを追加します。
    この際指定するパスは dvpm でインストールしたプラグインのディレクトリです。
.config/nvim/init.vim
set runtimepath+=~/.cache/nvim/dvpm/github.com/nvim-telescope/telescope.nvim
  1. dvpm の設定ファイルには以下のように記述します。enabled に false を指定することで dvpm ではプラグインが読み込まれなくなります。
    ただし :DvpmUpdate 時にプラグインの更新は行われるので、プラグインの更新を dvpm に任せることができます。
.config/nvim/denops/config/main.ts
await dvpm.add({
  url: "nvim-telescope/telescope.nvim",
  enabled: false,
});

起動時間の変化

200ms -> 22ms に短縮されました。およそ 10分の1 になったので満足です。

まとめ

dvpm は全てのプラグインを遅延読み込みするというかなり尖った設計だと思います。しかし、その設計が自分のユースケースにマッチしていたのが面白いなと感じました。
もしもっと良い方法があるよという方がいればコメント等で教えていただきたいです。

GitHubで編集を提案

Discussion

yukimemiyukimemi

おぉー!たしかにそんな方法もありますね!
一応、 Cache して起動時から読み込みたいプラグインの指定を行う方法もあります!

yukimemi/dvpm - Cache setting

  1. Dvpm.begin の引数に base だけでなく、 cache のパスを指定します。

この cache に指定されたパスにキャッシュされた設定が書き込まれるのでこのパスはあらかじめ runtimepath に追加されている必要があります。
自分で追加するか、、、もしくは Vim / Neovim でデフォルトで追加されているパスを指定してください。

README ではデフォルトで追加されているパスを指定しています。
以下抜粋

const cache_path = (await fn.has(denops, "nvim"))
    ? "~/.config/nvim/plugin/dvpm_plugin_cache.vim"
    : "~/.config/vim/plugin/dvpm_plugin_cache.vim";
// This cache path must be pre-appended to the runtimepath.
// Add it in vimrc or init.lua by yourself, or specify the path originally added to
// runtimepath of Vim / Neovim.
const cache = ensure(await fn.expand(denops, cache_path), is.String);

// Specify `cache` to Dvpm.begin.
const dvpm = await Dvpm.begin(denops, { base, cache });
  1. Dvpm.add 時に cache の設定を記載します。
  await dvpm.add({
    url: "tani/vim-artemis",
    // Just set `cache.enabled` to true if you don't need plugin settings.
    cache: { enabled: true },
  });

こんな感じです!上記は単純に runtimepath へ追加するだけの例です。
もし設定ファイルも読み込みたい場合は beforeFileafterFile でファイルパスを指定します。
beforeFile: plugin が runtimepath へ追加されて、 source plugin/*.vim とかが実行される前に呼び出されます。
afterFile: souce plugin/*.vim とか実行された後に呼び出されます。

こんな感じで設定できます。
beforeFile か、 afterFile のどちらか指定があれば、 enabled は指定しなくても大丈夫です。

await dvpm.add({
  url: "nvim-telescope/telescope.nvim",
  cache: { afterFile: "~/.config/nvim/rc/after/telescope.lua" },
});

この設定をすると、 Vim / Neovim 起動後に、 dvpm が cache に指定したファイルに runtimepath の追加や上記の設定ファイルを source する内容を書き込みます。(そのため、初回起動時はキャッシュは利きません。2回目以降の起動から)

一応 autocmd の定義をしているので、このキャッシュが更新された場合に通知とかしたい場合は利用できます!

yukimemi/dvpm - autocmd

私も telescope は起動時から利用したいので上記のキャッシュの設定してます!参考になれば・・・!

dotfiles/.config/nvim/denops/config/plugins/telescope.ts at main · yukimemi/dotfiles

matukotomatukoto

おぉ作者のyukimemiさんからコメントもらえるなんてとても嬉しいです!

そしてそんな方法もあるんですね、ちゃんとドキュメントを読んでいないのがバレてしまった…
自分のやり方だと全然スマートじゃないので、記事を修正します!
わざわざコメントして教えていただき、ありがとうございます!