neovim で init.lua を使ってみる!
この記事は Vim Advent Calendar 2020 その2 のエントリ記事です。
追記: 投稿することをすっかり忘れていて遅くなってしまいすみません。
とりあえず急いで書いたのであとからどんどん追記するかもしれませんorz -> 追記しました
以前 Qiita で neovim と dein.vim を使ってみる! という記事を書きました。
この記事を書いたときはまだ Vim Script や vim, neovim の違いなどよくわかっていない状態でしたが3年以上使っているとだんだん違いも顕著になっていき便利になってきました。
そしてVimではVim9 Scriptというものができneovimではluaで設定がかけるようになりました。
私はneovimを使っているので早速init.lua
を使ってみることにしました。
dein.vim
以前書いた記事を早速Lua化してみたいと思います。
-- 自動で dein#recache_runtimepath() する
vim.api.nvim_set_var('dein#auto_recache', 1)
-- neovimのリモートプラグインを遅延読み込み
vim.api.nvim_set_var('dein#lazy_rplugins', 1)
vim.api.nvim_set_var('dein#enable_notification', 1)
vim.api.nvim_set_var('dein#install_max_processes', 16)
vim.api.nvim_set_var('dein#install_message_type', 'none')
vim.api.nvim_set_var('dein#enable_notification', 1)
local dein_dir = vim.env.HOME .. '/.cache/dein'
local dein_repo_dir = dein_dir .. '/repos/github.com/Shougo/dein.vim'
if not string.match(vim.o.runtimepath, '/dein.vim') then
if vim.fn.isdirectory(dein_repo_dir) ~= 1 then
os.execute('git clone https://github.com/Shougo/dein.vim '..dein_repo_dir)
end
vim.o.runtimepath = dein_repo_dir .. ',' .. vim.o.runtimepath
end
if vim.call('dein#load_state', dein_dir) == 1 then
local dein_toml_dir = vim.env.HOME .. '/.config/nvim/dein'
local dein_toml = dein_toml_dir .. '/base.toml'
local dein_toml_lazy = dein_toml_dir .. '/lazy.toml'
local dein_toml_python = dein_toml_dir .. '/python.toml'
vim.call('dein#begin', dein_dir, {vim.fn.expand('<sfile>'), dein_toml, dein_toml_lazy, dein_toml_input})
vim.call('dein#load_toml', dein_toml, {lazy = 0})
vim.call('dein#load_toml', dein_toml_lazy, {lazy = 1})
if vim.fn.has('python3') == 1 then
vim.call('dein#load_toml', dein_toml_python, {lazy = 1})
end
vim.call('dein#end')
vim.call('dein#save_state')
end
気をつける点はLuaでは#
が使えないので上記のように関数内で呼び出すようにしています。
他にもLuaでは偽になるのはfalse
とnil
だけなので明示的に指定してあげます。
そして今まできにせず書いてたif
文ですが返り値を調べないとluaでは使えないので調べましたw
またLuaでvimのデータやオプションなどを扱うためにすべてvim.
からアクセスできて便利です!
その他の設定
まず設定を書いていくにあたっって一番大変だったのはオプションです。
普段は気にせずオプションを設定していましたがグローバル・ウィンドウ・バッファとそれぞれ違いがありそれぞれ設定する必要があります。
その次に気をつけることは set nobackup
みたいに no
をつけていたところは vim.o.backup = false
みたいに false
で設定してやる必要があります。
というわけで設定はこんな感じにしました(一部省略)
-- 2バイト文字を描画する
vim.o.ambiwidth = 'double',
-- メッセージ表示欄を1行確保
vim.o.cmdheight = 1,
-- emoji
vim.o.emoji = true
-- 不可視文字を表示
vim.wo.list = true,
vim.wo.listchars = 'tab:¦ ,trail:・'
-- 行番号を表示する
vim.bo.number = true
今後の改善に期待
autocmd
がまだ対応していないので下記のようにコマンド実行する最終手段を行ってますw
vim.cmd('augroup MyAutoCmd')
vim.cmd('autocmd!')
vim.cmd('augroup END')
他にも
-- Enable true color
if vim.fn.exists('+termguicolors') == 1 and vim.env.TERM_PROGRAM ~= "Apple_Terminal" then
vim.o.termguicolors = true
end
if
文も先頭にvim.
をつけているので長くなりがちです…
local api = vim.api
みたいに設定すると vim.
だけ短縮することができますw
まとめ
まだまだinit.lua
の実装ができている途中なのでv0.5のリリースが楽しみです!
今回は触れませんでしたがv0.5に実装予定のきのは他にもありますしv1がどんなふうにvimと違う進化するのか楽しみです!
Discussion
autoload関数は
vim.fn['dein#update']()
のように[]でも使用できます。