Neovim 0.5からは init.lua
にlua言語で書くことができるようになっている。
最近のpluginの説明文を見るとluaで書かれていることが増えてきた。
plugin managerは packer.nvim がメジャーらしい
wezterm の設定もluaで書いているし、なんとなく今風な気がするので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書いたことないけど
- 複数行文字列
オプションやキーマップを関数で書ける
https://github.com/nanotee/nvim-lua-guide で勉強する
require('modules/mymodule')
で、./modules/mymodule.lua
をロードできる- luado
とすると現在のbufferにテキストが挿入される
で、偶数行が大文字になる
: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
- Global variables (
g:
):
Local variables (l:), script variables (s:) and function arguments (a:) はVim script特有のスコープで、Luaは独自のスコープを持っているので使わない
vim.g
: global variablesvim.b
: buffer variablesvim.w
: window variablesvim.t
: tabpage variablesvim.v
: predefined Vim variablesvim.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()
user commands
- Global user commands:
参考にしたもの
- GitHub - NvChad/NvChad: An attempt to make neovim cli functional like an IDE while being very beautiful, blazing fast startuptime ~ 14ms to 67ms
- GitHub - LunarVim/nvim-basic-ide: This is my attempt at a basic stable starting point for a Neovim IDE.
-
A Basic Stable IDE config for Neovim
- Neovim初心者がIDEっぽい動きをさせるように便利なテンプレ
- https://github.com/hisasann/neovim
- この人の設定が上をベースにわかりやすくなってたので真似させてもらった
-
変更点
functionの書き方
plugin
luaで書かれたpluginに移行した
- GitHub - wbthomason/packer.nvim: A use-package inspired plugin manager for Neovim. Uses native packages, supports Luarocks dependencies, written in Lua, allows for expressive config
- Neovimのplugin managerのデファクト
- GitHub - phaazon/hop.nvim: Neovim motions on speed!
- easymotionをluaで書き直したもの
- GitHub - kylechui/nvim-surround: Add/change/delete surrounding delimiter pairs with ease. Written with in Lua.
- surroundとかsandwichのようなもの
- GitHub - kyazdani42/nvim-tree.lua: A file explorer tree for neovim written in lua
- file explorer
- GitHub - nvim-lualine/lualine.nvim: A blazing fast and easy to configure neovim statusline plugin written in pure lua.
- statuslineカスタマイズ
- GitHub - lukas-reineke/indent-blankline.nvim: Indent guides for Neovim
- indentline
- GitHub - RRethy/vim-illuminate: illuminate.vim - Vim plugin for automatically highlighting other uses of the word under the cursor. Integrates with Neovim’s LSP client for intelligent highlighting.
- highlightをつける
colorscheme
- GitHub - EdenEast/nightfox.nvim: 🦊A highly customizable theme for vim and neovim with support for lsp, treesitter and a variety of plugins.
- GitHub - ellisonleao/gruvbox.nvim: Lua port of the most famous vim colorscheme
LSP
- neovim/nvim-lspconfig(LSP設定)
- williamboman/mason.nvim(LSPサーバー管理)
- hrsh7th/nvim-cmp(補完)
結果
- 起動が200ms → 100ms未満になった
- colorschemeをnightfoxにした
- nvim-cmpやnvim-lspに変えて、補完の見た目がかっこよくなった