Neovim 0.5からは init.lua にlua言語で書くことができるようになっている。 最近のpluginの説明文を見るとluaで書かれていることが増えてきた。

plugin managerは packer.nvim がメジャーらしい

wezterm の設定もluaで書いているし、なんとなく今風な気がするのでluaに移行してみようとおもう

概要

NeovimとLua

Vimconf.live: Why is Lua a good fit for Neovim - YouTube

  • 簡単
    Luaの学習コストは低く、誰でもすぐ書けます。
  • Luaのサイズが小さい
    バイナリサイズ(linux用)は200KB以下です。
  • 移植性
    ISO Cで実装されているため、OS Kernel内でもLuaは実行できます。
  • 埋め込みに適している。
    Vim scriptからLuaの関数を呼び出すことができます。その逆もできます。
  • Vim scriptよりスピードが早い
    Vim scriptなら約5.5秒かかる処理をLua(LuaJIT)は約0.003秒で処理します。

Vim scriptよりは書きやすいっぽい。Vim script書いたことないけど

  • 複数行文字列
[[
  augroup packer_user_config
    autocmd!
    autocmd BufWritePost plugins.lua source <afile> | PackerSync
  augroup end
]]

オプションやキーマップを関数で書ける

https://github.com/nanotee/nvim-lua-guide で勉強する

  • require('modules/mymodule') で、./modules/mymodule.lua をロードできる
  • luado
:luado return 'hello world'

とすると現在のbufferにテキストが挿入される

:luado if linenr % 2 == 0 then return line:upper() end

で、偶数行が大文字になる

  • :luafile % でカレントバッファをluaで実行する

vim名前空間

  • LuaからNeovimのAPIを使うためのエントリーポイントとして、vimグローバル変数を公開している
    • vim.inspect: Luaオブジェクトを人間が読みやすい文字列に変換する(テーブルを調べるのに便利です。)
    • vim.regex: LuaからVimの正規表現を使う
  • vim.nvim_exec('%s/\\Vfoo/bar/g') のようにして、vim scriptを実行できる

vim option

  • vim.api.nvim_set_option(), vim.api.nvim_get_option() などで読み書きできる
  • vim.opt.{option}:setのように動作します
  • vim.opt_global.{option}:setglobalのように動作します
  • vim.opt_local.{option}:setlocalのように動作します

vim variable

Local variables (l:), script variables (s:) and function arguments (a:) はVim script特有のスコープで、Luaは独自のスコープを持っているので使わない

  • vim.g: global variables
  • vim.b: buffer variables
  • vim.w: window variables
  • vim.t: tabpage variables
  • vim.v: predefined Vim variables
  • vim.env: environment varia

call Vimscript functions

vim.fn.{funcion}() でVimscript functionを呼ぶ

例: print(vim.fn.printf('Hello from %s', 'Lua'))

keymap

例: vim.api.nvim_set_keymap('n', '<Leader><Space>', ':set hlsearch!<CR>', { noremap = true, silent = true })

Neovim provides two functions to set/del mappings:

  • vim.keymap.set()
  • vim.keymap.del()
vim.keymap.set('n', '<Leader>ex1', '<Cmd>lua vim.notify("Example 1")<CR>')
vim.keymap.set({'n', 'c'}, '<Leader>ex2', '<Cmd>lua vim.notify("Example 2")<CR>')

user commands

参考にしたもの

変更点

functionの書き方

function ToggleQuickFix()
  if vim.fn.empty(vim.fn.filter(vim.fn.getwininfo(), "v:val.quickfix")) == 1 then
    vim.cmd([[copen]])
  else
    vim.cmd([[cclose]])
  end
end
 
-- :ToggleQuickFix で使えるようにする
vim.cmd([[command! -nargs=0 -bar ToggleQuickFix lua require('utils').ToggleQuickFix()]])
 
-- keymapに設定する
vim.keymap.set("n", "<Leader>q", ToggleQuickFix)

plugin

luaで書かれたpluginに移行した

colorscheme

LSP

Neovim+LSPをなるべく簡単な設定で構築する

結果

  • 起動が200ms 100ms未満になった
  • colorschemeをnightfoxにした
  • nvim-cmpやnvim-lspに変えて、補完の見た目がかっこよくなった

Pasted-image-