denops.vimのチュートリアルを進めててつまづいた事
人生初のオリジナルプラグインが形になりました👏
といっても、用意されたチュートリアルに沿って進めただけですが・・・
はじめに
この記事では、denops.vimを利用してVim/NeoVimのプラグイン開発時に詰まった部分を書きます。
私は、こういう状態からプラグイン開発に着手しました。
- 一度もVim/NeoVimプラグインを自作した事ない
- Vim/NeoVimにあまり詳しくない
さらに追記しておくと、vimscriptやluaなどでのプラグイン開発経験もありません。
参考
こちらのhelloworldチュートリアルを進めました。
ディレクトリはどこに作れば?
たぶん初めてプラグインを作ろうとする方のほとんどがここで躓くかなと思います。
私も知らなかったので、現在利用している他のプラグインのように
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