[[Denops]]のチュートリアルを試しにやってみた記録。 <div class="link-card"> <div class="link-card-header"> <img src="https://vim-denops.github.io/denops-documentation/favicon.svg" class="link-card-site-icon"/> <span class="link-card-site-name">vim-denops.github.io</span> </div> <div class="link-card-body"> <div class="link-card-content"> <p class="link-card-title">Tutorial (Hello world) - Denops Documentation</p> </div> </div> <a href="https://vim-denops.github.io/denops-documentation/tutorial/helloworld/index.html"></a> </div> [[lazy.nvim]]でプラグイン管理していることもあり、[[Neovim]]への理解が甘くハマったポイントがいくつかあるので、その辺を紹介。 ## 3.1が成功しない <div class="link-card"> <div class="link-card-header"> <img src="https://vim-denops.github.io/denops-documentation/favicon.svg" class="link-card-site-icon"/> <span class="link-card-site-name">vim-denops.github.io</span> </div> <div class="link-card-body"> <div class="link-card-content"> <p class="link-card-title">Creating a minimal Vim plugin - Denops Documentation</p> </div> </div> <a href="https://vim-denops.github.io/denops-documentation/tutorial/helloworld/creating-a-minimal-vim-plugin.html"></a> </div> ### トラブル1 `:set runtimepath?` の結果に `~/tmp/denops-helloworld` は含まれていなかった。 `init.lua` ```lua vim.opt.runtimepath:append("~/tmp/denops-helloworld") require("base") require("clipboard") require("plugin") require("appearance") require("keybind") ``` [[lazy.nvim]]などに打ち消された可能性が高いかもしれない。 `init.lua`の順番を変えてみた。 ```lua require("base") require("clipboard") require("plugin") require("appearance") require("keybind") vim.opt.runtimepath:append("~/tmp/denops-helloworld") ``` これで `runtimepath` には追加されるようになった。 ```vim runtimepath=~/.config/nvim,~/.local/share/nvim/lazy/lazy.nvim, ... ,~/tmp/denops-helloworld ``` ### トラブル2 コマンド定義がされていない。`:command DenopsHello`の実行結果がそのように出力される。`source`コマンドで読み込むと認識されるようになるが...。 ```vim :source ~/tmp/denops-helloworld/plugin/denops-helloworld.vim ``` 以上から - `runtimepath`には問題ない - `denops-helloworld.vim`には問題ない - しかし、**起動時に`runtimepath`に追加されているはずの`~/tmp/denops-helloworld`が読み込まれないのが問題** 起動時のログを確認できるように起動してみる。 ```vim vim -V9logfile.txt ``` `logfile.txt`の中身を確認すると、`~/tmp/denops-helloworld/plugin/denops-helloworld.vim`のかけらもない。 #### lazy.nvimで読み込む もしかすると[[lazy.nvim]]がそのへんを無効化したりしているのかも... と仮説を立て、[[lazy.nvim]]で読み込むよう設定を追加してみる。 `plugin.lua`に追加 ```lua local neovim_plugins = { require("plugins.denops-helloworld"), } ``` `plugins/denops-helloworld.lua` ```lua return { dir = "~/tmp/denops-helloworld", } ``` これで起動したら普通に動いた。 ## 3.2が成功しない ### トラブル1 `denops/helloworld/denops/denops-helloworld/main.ts` ```typescript import type { Entrypoint } from "jsr:@denops/[email protected]"; export const main: Entrypoint = (denops) => { console.log("Hello, Denops from TypeScript!"); }; ``` 起動直後に上記 `main` が実行されるはずが、実行されない。 #### denops.nvimをインストールする そもそも`denops.nvim`が依存関係に含まれていなかったので追加してみる。 `plugins/denops-helloworld.lua` ```lua return { dir = "~/tmp/denops-helloworld", dependencies = { "vim-denops/denops.vim", }, } ``` 再びNeovimを起動してみたところ、無事`main`の処理が実行された。 > When denops.vim is installed, it searches for files named `denops/*/main.ts` in addition to Vim plugins when Vim starts. よくよく考えてみれば、こう書いてあったので動かないのはそれはそう... ## 3.4 3.3の内容は飛ばしていきなり3.4に。ドキュメントの流儀からは逸れるが、まずは`vim.notify`を使ってみたいのでチャレンジ。 ```typescript import type { Entrypoint } from "jsr:@denops/[email protected]"; import * as nvim from "jsr:@denops/std/function/nvim"; export const main: Entrypoint = async (denops) => { await nvim.nvim_notify(denops, "hogeeeeeee", 2, {}); }; ``` とりあえずこれで動いたが、`nvim_notify`の引数が基本的にすべて`unknown`なのが辛いと思った。 `vim.log.levels.INFO`とできないか調べたけどなにもわからない...。 ちなみにnpmモジュールも普通に利用できた。良き。 ```typescript import type { Entrypoint } from "jsr:@denops/[email protected]"; import * as nvim from "jsr:@denops/std/function/nvim"; import { DateTime } from "npm:[email protected]"; export const main: Entrypoint = async (denops) => { await nvim.nvim_notify(denops, DateTime.now().displayDateTime, 2, {}); }; ```