🧪

vim pluginを自作してみる

2022/04/10に公開
3

動機

社会人となって1週間が経ち、時の速さに一抹の寂しさを覚えるころ
こんないとおかしなpluginを見つけました。
lspkind-nvim
中身を見てみるとなんとinit.luaが一枚...

「plugin作れるんじゃね?」

この記事の目的

対象者は初級vimmerです。

  • pluginのなんとなくの構成を知る。
  • 簡単なものを作成し、自分のvimで使用してみる。

なお、今回は以下の環境で作成していきます。
どのようなvimやプラグインマネージャーを使用してもそんなに違いはないと思います。

  • nvim
  • packer.nvim

ではやっていこう

流れは次のような感じ

  1. git repositoryを作成 & ローカルにクローン
  2. ディレクトリ作成 & その中にinit.luaを作成
  3. init.luaを編集 & ローカルで実行
  4. push
  5. packer.nvimでinstall
  6. 動作確認

1に関しては各々行ってください。
レポジトリ名はなんでも良いです。
僕は"samplePlug"とします。

2. ディレクトリ & init.lua作成

$ cd samplePlug
$ mkdir -p lua/samplePlug
$ touch lua/samplePlug/init.lua

3. init.luaを編集 & ローカル実行

init.luaを編集します。

-- samlpePlug/lua/samplePlug/init.lua
local function setup()
  print("samplePlug was succesfully installed")
end

return {
  setup = setup
}

ローカルで実行してみます。

# runtimepathをカレントディレクトリにしてvimを起動
$ nvim lua/samplePlug/init.lua --cmd "set rtp+=./"

# コマンドモードで
# :lua require"samplePlug".setup()
# を実行
# samplePlug was succesfully installedと出力される

4. remote repositoryにpushしておきます。

個人でやっておいてください。
リポジトリはpublicで設定してください。

5. packer.nvimでinstall

nvimのpackerの設定ファイルに以下を記述 or 追加

-- packerしか試していませんが、その他のプラグインマネージャーでもいけると思います。
return require('packer').startup(function(use)
 use { '<自分のgitユーザー名/自分の作成したリポジトリ名>' }
end)

:PackerSyncを実行する
:PackerStatusで確認する

6. 動作確認

nvimの設定ファイルに以下を追加

-- nvimの設定ファイル ~/.config/nvim/init.luaでも良い
require"samplePlug".setup()

保存し、再度nvim起動
samplePlug was succesfully installedが表示されていたら完璧。

まとめ

意外と簡単にいけました
大きいpluginばかりみていると気づかないものですね

今回は簡単なpluginを作成し、自分のnvimにinstallしてみましたが、
このディレクトリにいろいろくっつけていくと普段使用してるような大型pluginになるんだなぁ

次は実用的なものを作成してみようと思います!!

Discussion

DaikiDaiki

luaに触り始めた頃だったので、大変参考になりました。ありがとうございます。
私の環境だと下記の通り修正を行なって動いたのでコメント残します。

修正前

local function setup(){
  print("samplePlug was succesfully installed")
}

修正後

local function setup()
  print("samplePlug was succesfully installed")
end
shigeshige

2023/12/14 追記:

ふと思い出してソースを確認したところ、
記事の内容が間違えていましたので修正しました。

local function setup() {
  print("samplePlug was succesfully installed")
}

local function setup()
  print("samplePlug was succesfully installed")
end

Daikiさんありがとうございます🙇