📝

neovim で init.lua を使ってみる!

2020/12/14に公開
1

この記事は 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では偽になるのはfalsenilだけなので明示的に指定してあげます。

そして今まできにせず書いてた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と違う進化するのか楽しみです!

Special Thanks

GitHubで編集を提案

Discussion

slinslin

気をつける点はLuaでは#が使えないので上記のように関数内で呼び出すようにしています。

autoload関数はvim.fn['dein#update']() のように[]でも使用できます。