🔮

めちゃくちゃ簡単なNeoVimプラグインを作ってみた

2023/04/29に公開

ゴリラ.vimという集まりにいきまして、plugin開発についての発表ありました。
それで「自分もプラグイン作ってみたい!」となったから、めっちゃ簡単なテンプレートを作ってみました。

完成したもの


https://github.com/MeiWagatsuma/say-hello.nvim

プラグインの要件

とりあえずプラグインとして機能しそうなもの。

  • 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.luaoptionsでアクセスして使っています。

今回は処理ごとにファイルを分けようと思ったので、無名関数を返してる。

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