🤔

denops.vimのチュートリアルを進めててつまづいた事

2022/06/29に公開

人生初のオリジナルプラグインが形になりました👏
といっても、用意されたチュートリアルに沿って進めただけですが・・・

https://github.com/Daiki48/hello-daiki

はじめに

この記事では、denops.vimを利用してVim/NeoVimのプラグイン開発時に詰まった部分を書きます。

私は、こういう状態からプラグイン開発に着手しました。

  • 一度もVim/NeoVimプラグインを自作した事ない
  • Vim/NeoVimにあまり詳しくない

さらに追記しておくと、vimscriptやluaなどでのプラグイン開発経験もありません。

参考

こちらのhelloworldチュートリアルを進めました。

https://github.com/vim-denops/denops-helloworld.vim

ディレクトリはどこに作れば?

たぶん初めてプラグインを作ろうとする方のほとんどがここで躓くかなと思います。
私も知らなかったので、現在利用している他のプラグインのように

githubにリポジトリ作ってプラグインマネージャーで動かしながらつくるのかな

と思い、早速行いました。

私はプラグインマネージャーにdein.vimを利用しているので下記のように書きました。

[[plugins]]
repo = 'vim-denops/denops.vim'

[[plugins]]
repo = 'Daiki48/hello-daiki'

動きません・・・

[[plugins]]
repo = 'vim-denops/denops.vim'

[[plugins]]
repo = 'Daiki48/hello-daiki'

[[plugins]]
repo = 'vim-denops/denops-helloworld.vim'

ほとんど同じコードの denops-helloworld.vim を追記して DenopsHello すると、 Hello と返ってきました。

分からなかったので、Redditでスレ立てました。

すると多くの方からアドバイスを頂けました。(私の意味不明な質問にも丁寧に対応してくださる優しい方々に感謝🙇‍♂️)

過去の残骸を整理・・・

Redditで下記2点の新しい知識を得ました。

  • denops.vimをローカルにクローンしないといけない
  • 開発段階では、プラグインマネージャーを使わない(使ってはいけない)

そして、 :scriptnames コマンドでNeoVim起動時のスクリプトを確認すると、

scriptnamesコマンド実行
  1: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/ftplugin.vim
  2: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/indent.vim
  3: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/filetype.lua
  4: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/filetype.vim
  5: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/syntax/syntax.vim
  6: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/syntax/synload.vim
  7: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/gzip.vim
  8: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/health.vim
  9: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/man.vim
 10: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/matchit.vim
 11: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/pack/dist/opt/matchit/plugin/matchit.vim
 12: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/matchparen.vim
 13: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/netrwPlugin.vim
 14: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/rplugin.vim
 15: ~/.local/share/nvim/rplugin.vim
 16: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/shada.vim
 17: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/spellfile.vim
 18: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/tarPlugin.vim
 19: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/tohtml.vim
 20: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/tutor.vim
 21: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/zipPlugin.vim
 22: ~/.local/share/nvim/site/pack/packer/start/dashboard-nvim/plugin/dashboard.vim
 23: ~/.local/share/nvim/site/pack/packer/start/indent-blankline.nvim/plugin/indent_blankline.vim
 24: ~/.local/share/nvim/site/pack/packer/start/nvim-web-devicons/plugin/nvim-web-devicons.vim
 25: ~/.local/share/nvim/site/pack/packer/start/plenary.nvim/plugin/plenary.vim
 26: ~/.local/share/nvim/site/pack/packer/start/vim-bbye/plugin/bbye.vim
 27: ~/.local/share/nvim/site/pack/packer/start/which-key.nvim/plugin/which-key.vim
 28: ~/.local/share/nvim/site/pack/packer/start/dashboard-nvim/autoload/dashboard.vim
 29: ~/.local/share/nvim/site/pack/packer/start/dashboard-nvim/autoload/dashboard/utils.vim
 30: ~/.local/share/nvim/site/pack/packer/start/dashboard-nvim/autoload/dashboard/header.vim
 31: ~/.local/share/nvim/site/pack/packer/start/dashboard-nvim/autoload/dashboard/section.vim

よく分からないものがたくさん出てきました。
これは packpath というもので、NeoVim起動時に実行されるディレクトリらしいです。
見てみると、以前利用していたプラグインマネージャーのpacker.nvimが動いていました。
dein.vimに切り替えてから、今まで気づかずに勝手に動いていたようです・・・
これら全てもう使っていないプラグイン群なのでディレクトリごと消しました。
使わないプラグインはちゃんと消さないといけないと学びました。(特にプラグインマネージャーは、消し忘れるとこういう事に・・・)

packpathを確認します。

ターミナルでnvim起動

$ nvim

コマンドモードで入力

:set packpath?

これらがpackpathです。

packpath=~/.config/nvim,/etc/xdg/nvim,~/.local/share/nvim/site,/usr/local/share/nvim/site,/usr/share/nvim/site,/opt/homebrew/Cellar
/neovim/0.7.0/share/nvim/runtime,/opt/homebrew/Cellar/neovim/0.7.0/lib/nvim,/usr/share/nvim/site/after,/usr/local/share/nvim/site/aft
er,~/.local/share/nvim/site/after,/etc/xdg/nvim/after,~/.config/nvim/after

先ほど、 :scriptnames で見た事あるようなディレクトリばかりですね。
packer.nvimはもう使っていないのでディレクトリごとに消します。

packer.nvim関係のプラグインを削除後にscriptnames実行
1: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/ftplugin.vim
  2: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/indent.vim
  3: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/filetype.lua
  4: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/filetype.vim
  5: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/syntax/syntax.vim
  6: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/syntax/synload.vim
  7: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/gzip.vim
  8: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/health.vim
  9: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/man.vim
 10: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/matchit.vim
 11: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/pack/dist/opt/matchit/plugin/matchit.vim
 12: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/matchparen.vim
 13: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/netrwPlugin.vim
 14: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/rplugin.vim
 15: ~/.local/share/nvim/rplugin.vim
 16: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/shada.vim
 17: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/spellfile.vim
 18: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/tarPlugin.vim
 19: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/tohtml.vim
 20: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/tutor.vim
 21: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/zipPlugin.vim

だいぶスッキリしました。
先ほど調べた packpath のうち、一つをプラグイン開発用にしようと思いました。
packpathに関してはゴリラさんの記事を参考にしました。

どのディレクトリはダメとか分からなかったので、適当に選びました。

~/.local/share/nvim/site

配下にディレクトリ作成

~/.local/share/nvim/site/pack/dev/start

結構深いpathになってしまいましたが、このstartディレクトリにdenops.vimをクローンします。

git clone https://github.com/vim-denops/denops.vim.git

いろいろと手順が入れ違ってますが、この時すでにhello-daikiはgithubにpushしていたので、クローンします。

git clone https://github.com/Daiki48/hello-daiki.git

dein.vimに書いてたhello-daikiは消しておく。

denops.vimが動くのか確認

実は、先ほどなぜ、scriptnames を確認したのかというと

  • NeoVim起動時にdenops.vimが動いているのか

を確認するためでした。
すると、denops.vimは動いておらず、packer.nvimの残骸が残っていたのでそちらの削除を行いました。

そして先ほど下記ディレクトリにdenops.vimを置いたので、ここでもう一度 scriptnames を確認します。

NeoVim起動時にdenops.vim動いているのかscriptnamesで確認
1: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/ftplugin.vim
  2: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/indent.vim
  3: ~/.minimal_vimrc
  4: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/filetype.lua
  5: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/filetype.vim
  6: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/syntax/syntax.vim
  7: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/syntax/synload.vim
  8: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/gzip.vim
  9: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/health.vim
 10: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/man.vim
 11: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/matchit.vim
 12: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/pack/dist/opt/matchit/plugin/matchit.vim
 13: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/matchparen.vim
 14: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/netrwPlugin.vim
 15: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/rplugin.vim
 16: ~/.local/share/nvim/rplugin.vim
 17: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/shada.vim
 18: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/spellfile.vim
 19: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/tarPlugin.vim
 20: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/tohtml.vim
 21: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/tutor.vim
 22: /opt/homebrew/Cellar/neovim/0.7.0/share/nvim/runtime/plugin/zipPlugin.vim
 23: ~/.local/share/nvim/site/pack/dev/start/denops.vim/plugin/denops/debug.vim
 24: ~/.local/share/nvim/site/pack/dev/start/denops.vim/plugin/denops.vim
 25: ~/.local/share/nvim/site/pack/dev/start/denops.vim/autoload/denops.vim
 26: ~/.local/share/nvim/site/pack/dev/start/denops.vim/autoload/denops/server.vim
 27: ~/.local/share/nvim/site/pack/dev/start/denops.vim/autoload/denops/util.vim
 28: ~/.local/share/nvim/site/pack/dev/start/denops.vim/autoload/denops/job.vim
 29: ~/.local/share/nvim/site/pack/dev/start/denops.vim/autoload/denops/plugin.vim

23行目以下denops.vimがありました。(さっきまでありませんでした)
そしてこの状態で、DenopsDaiki とコマンドを打つと、daiki と返ってきました😭

実際の本番環境でも、dein.vimにhello-daikiを設定して、コマンドを打つと返ってきました。

ちなみに、runtimepathの設定を消しても動きました🤔
packpathでstartディレクトリに入れてるから問題なく動いてるのかな・・・(良くわかってない)

感想

packer.nvimのpackpathを消したのが、問題解消に繋がったんじゃないかと思っています。
過去の自分が首を絞めてたって結果になりますかね・・・

あとは、packpathとruntimepathに対する知識不足・・・
というか、最終的にはruntimepathは記載せず、packpathにdenops.vimとhello-daikiを置くだけで動いているのも良くわかっていません。
処理するタイミングが違うだけでやってる事は同じなのかな🤔

あと数点、腑に落ちない事があります。

個人的に残った疑問

  • 既存プラグインが動かないように、起動オプション -u は今後開発時に毎回使うのか
  • 開発が終わったら、startディレクトリにあるdenops.vimを毎回消して、denops.vimで開発を行う度に毎回クローンするのか

NeoVim起動オプション -u

プラグイン開発は、なるべく最小構成のvimrcで行うのが普通なのかという疑問。
その際、開発時は毎回起動オプション -u でvimrcとプラグインを無効にしながら行うのか。

でも、たとえばステータスバー(airline)のような起動時から反映されてほしいようなプラグインを自作しようとなった場合、どうなるんだろうか。(-uオプションで開発対象プラグインも無効化されるんじゃ・・・?)

startディレクトリのdenops.vimの管理方法

packpathのstartディレクトリは、毎回勝手に動くようだけど、私が今プラグインマネージャーで管理しているdenops.vimと干渉しないのか心配です。

私自身、まだVim/NeoVimに対する知識がかなり浅いので、上記2つの疑問点が的外れかもしれません。

この記事を読んだ方で、内容に間違いや捕捉があれば是非教えて頂きたいです。

さいごに

今回は、denops.vimを利用したVim/NeoVimプラグイン開発チュートリアルを実施時に、沼ったポイントを書きました。
vimscriptというvim用のスクリプト言語や、NeoVimを普段から使うならlua言語でもプラグインは作れるそうなので、そっちの方も触ってみたいなと思いました。

Discussion