[[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, {});
};
```