🔮
めちゃくちゃ簡単なNeoVimプラグインを作ってみた
ゴリラ.vimという集まりにいきまして、plugin開発についての発表ありました。
それで「自分もプラグイン作ってみたい!」となったから、めっちゃ簡単なテンプレートを作ってみました。
完成したもの
プラグインの要件
とりあえずプラグインとして機能しそうなもの。
- setupで引数を渡せる。
- コマンドラインで実行できる。
ディレクトリ構造
こんな感じで。
say-hello.nvim
└ lua
└ say-hello
├── command.lua
├── conifg.lua
├── init.lua
└── notify.lua
Lazy.nvimを使ってローカルのプラグインを動かすにはこう書きました。
require("lazy").setup({
{
name = "say-hello.nvim",
dir = '~/workspace/say-hello.nvim//',
dev = true,
lazy = false,
config = function()
require("say-hello").setup()
end
},
-- 以下は他のプラグイン達...
}
init.lua
init.lua
はディレクトリのエンドポイントのようなもの。
require("say-hello")
をするとinit.lua
の返り値が帰ってくる。
local M = {}
function M.setup(opts)
local config = require("say-hello.conifg")
config.set(opts)
end
return M
このコードではsetup関数が実装されたMが返ってくる。
これによってrequire("say-hello").setup()
とすることによって、setup関数を実行できる。
conifg.lua
local M = {}
M.defaults = {
your_name = "neovimmer",
}
M.config = {}
function M.set(options)
M.options = vim.tbl_deep_extend("force", {}, M.defaults, options or {})
require("say-hello.command").init()
end
return M
setup()から受け取った引数を他のファイルから扱えるようにする箇所。
defaulsをsetupの引数のフィールドで上書きして、それをMテーブル
に入れて返す。
こうすることによって、他のファイルからoptionsをrequire("say-hello.conifg").options
の返り値として扱えるようになる。
実際にそのoptionsを使った処理が次のコード。
notify.lua
local opts = require("say-hello.conifg").options
return function()
vim.notify("hello " .. opts.your_name)
end
実際に実行される処理。
先ほどのconifg.lua
のoptions
でアクセスして使っています。
今回は処理ごとにファイルを分けようと思ったので、無名関数を返してる。
command.lua
local M = {}
function M.init()
vim.api.nvim_create_user_command("SayHello", require("say-hello.notify"), {})
end
return M
コマンドを定義する箇所。
nvim_create_user_command
を実行するこのによって、コマンドとして関数を実行できるようになる。
作った感想
思ってたより簡単!これを元にしっかりしたやつを作っていきたい!!
Discussion