Open27

dein→lazyへお試し移行

kamechakamecha

dppができて、それを使うまえにShougowareじゃないプラグインマネージャも経験してみたいので、lazyを試す
順序としては

  1. dein
  2. lazy
  3. dpp

みたく順に移行していきたい
dppを有効活用するための†経験†

kamechakamecha

現状
init.vim + dein(toml)構成なので

  • init.vim(lua << EOFで少しづつlua化) + dein(toml)
  • init.lua + dein(toml)
  • init.lua + dein(toml内部の処理でlua_source等を多用)
  • init.lua + lazy

の順でやってく

kamechakamecha
dein周りで面倒なショリ
" install dir {{{
let s:dein_dir = expand('~/.cache/dein/nvim')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
let g:github_dir = s:dein_dir . '/repos/github.com'
" }}}

" dein installation check {{{
if &runtimepath !~# '/dein.vim'
  if !isdirectory(s:dein_repo_dir)
    execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
  endif
  execute 'set runtimepath^=' . s:dein_repo_dir
endif
" }}}

" begin settings {{{
" In windows, auto_recache is not disabled. It is too slow.
let g:dein#auto_recache = !has('win32')

if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)

  " .toml file
  let s:rc_dir = expand('~/.config/nvim')
  if !isdirectory(s:rc_dir)
    call mkdir(s:rc_dir, 'p')
  endif
  let s:toml = s:rc_dir . '/dein.toml'
  let s:ddu_toml = s:rc_dir . '/ddu.toml'
  let s:ddc_toml = s:rc_dir . '/ddc.toml'
  let s:lazy_toml = s:rc_dir . '/dein_lazy.toml'

  " read toml and cache
  call dein#load_toml(s:toml)
  call dein#load_toml(s:ddu_toml, #{ lazy: 1})
  call dein#load_toml(s:ddc_toml, #{ lazy: 1})
  call dein#load_toml(s:lazy_toml, {'lazy': 1})

  " end settings
  call dein#end()
  call dein#save_state()

  " Required:
  filetype plugin indent on
  syntax enable
endif
" }}}

" plugin installation check {{{
if dein#check_install()
  call dein#install()
endif
" }}}

" plugin remove check {{{
let s:removed_plugins = dein#check_clean()
if len(s:removed_plugins) > 0
  call map(s:removed_plugins, "delete(v:val, 'rf')")
  call dein#recache_runtimepath()
endif
" }}}

" }}}

↑これがいっちゃんでかいdein周りの処理

kamechakamecha

chat gptくんに丸投げしたら返ってきたので、一旦試す

lua化したver
-- Install dir
local dein_dir = vim.fn.expand('~/.cache/dein/nvim')
local dein_repo_dir = dein_dir .. '/repos/github.com/Shougo/dein.vim'
local github_dir = dein_dir .. '/repos/github.com'

-- Dein installation check
if not vim.fn.exists('g:dein#auto_recache') then
  vim.g['dein#auto_recache'] = not vim.fn.has('win32')
end

if not vim.fn.glob(dein_repo_dir) ==# '' then
  vim.fn.system('git clone https://github.com/Shougo/dein.vim ' .. dein_repo_dir)
end

if not vim.fn.index(vim.fn.split(vim.o.runtimepath, ','), dein_repo_dir) ==# -1 then
  vim.o.runtimepath = dein_repo_dir .. ',' .. vim.o.runtimepath
end

-- Begin settings
if vim.fn['dein#load_state'](dein_dir) then
  vim.fn['dein#begin'](dein_dir)

  -- .toml file
  local rc_dir = vim.fn.expand('~/.config/nvim')
  if not vim.fn.isdirectory(rc_dir) then
    vim.fn.mkdir(rc_dir, 'p')
  end
  local toml = rc_dir .. '/dein.toml'
  local ddu_toml = rc_dir .. '/ddu.toml'
  local ddc_toml = rc_dir .. '/ddc.toml'
  local lazy_toml = rc_dir .. '/dein_lazy.toml'

  -- Read toml and cache
  vim.fn['dein#load_toml'](toml)
  vim.fn['dein#load_toml'](ddu_toml, { lazy = 1 })
  vim.fn['dein#load_toml'](ddc_toml, { lazy = 1 })
  vim.fn['dein#load_toml'](lazy_toml, { lazy = 1 })

  -- End settings
  vim.fn['dein#end']()
  vim.fn['dein#save_state']()

  -- Required
  vim.cmd('filetype plugin indent on')
  vim.cmd('syntax enable')
end

-- Plugin installation check
if vim.fn['dein#check_install']() then
  vim.fn['dein#install']()
end

-- Plugin remove check
local removed_plugins = vim.fn['dein#check_clean']()
if #removed_plugins > 0 then
  for _, plugin in ipairs(removed_plugins) do
    vim.fn.delete(plugin, 'rf')
  end
  vim.fn['dein#recache_runtimepath']()
end
kamechakamecha

deinのhelpみてみたら、lua用にも関数が生えてるので、それ使うようにしたい

kamechakamecha
if not vim.fn.exists('g:dein#auto_recache') then
  vim.g['dein#auto_recache'] = not vim.fn.has('win32')
end

こことかvim.fn.existsの返り値が0 or 1でluaだとこれ全部true扱いだから、not反転で絶対falseになるマンになってて永遠詰んでた
うんち過ぎる
他にも色々修正必要

kamechakamecha
ひとまず変換させたver
lua << EOF
-- Install dir
local dein_dir = vim.fn.expand('~/.cache/dein/nvim')
local dein_repo_dir = dein_dir .. '/repos/github.com/Shougo/dein.vim'
local github_dir = dein_dir .. '/repos/github.com'
vim.api.nvim_set_var('github_dir', github_dir)

-- In windows, auto_recache is not disabled. It is too slow.
if vim.fn.exists('g:dein#auto_recache') ~= 1 then
  vim.api.nvim_set_var('dein#auto_recache', vim.fn.has('win32') ~= 1)
end

-- dein installation check
if not vim.fn.glob(dein_repo_dir) == '' then
	vim.fn.system('git clone https://github.com/Shougo/dein.vim ' .. dein_repo_dir)
end

local function check_table(T, V)
	local ret = false
	for _, v in ipairs(T) do
		if v == V then
			ret = true
		end
	end
	return ret
end

if not check_table(vim.fn.split(vim.o.runtimepath, ','), dein_repo_dir) then
	vim.o.runtimepath = dein_repo_dir .. ',' .. vim.o.runtimepath
end

-- use dein
local dein = require('dein')

-- register plugin via dein
if dein.load_state(dein_dir) == 1 then
	dein.begin(dein_dir)
	local rc_dir = vim.fn.expand('~/.config/nvim')
	local toml = rc_dir .. '/dein.toml'
	local ddu_toml = rc_dir .. '/ddu.toml'
	local ddc_toml = rc_dir .. '/ddc.toml'
	local lazy_toml = rc_dir .. '/dein_lazy.toml'
	dein.load_toml(toml)
	dein.load_toml(ddu_toml, { lazy = true })
	dein.load_toml(ddc_toml, { lazy = true })
	dein.load_toml(lazy_toml, { lazy = true })
	dein.end_()
	dein.save_state()
end

-- plugin installation check
if dein.check_install() then
  dein.install()
end

-- plugin remove check
local removed_plugins = dein.check_clean()
if #removed_plugins > 0 then
	for _, plugin in ipairs(removed_plugins) do
		vim.fn.delete(plugin, 'rf')
	end
	dein.recache_runtimepath()
end

EOF

luaに慣れてないのもあって、これだけなのにめちゃかかったし、これで全部しっかり動いてるかは正直分からん
ひとまずこれで動くこととする

kamechakamecha

luaとvimscriptが混在するとハイライトが絶望になっちゃう

→いったん:luafile使って別luaファイルから読み出すようにする

現状のinit.vimが:luafile ~/unko.luaだけになったら、unko.luaをinit.luaに書き換えて、init.vimを消せば良さそう

kamechakamecha

あとせっかく.luaファイル用意しても

undefined global 'vim'

とか表示されるので、

masonでの設定で、lua_lsにvimをグローバル登録
mason_lspconfig.setup_handlers({ function(server_name)
	local opts = {
		on_attach = function(client, bufnr)
			if client.server_capabilities.documentSymbolProvider then
				navic.attach(client, bufnr)
			end
		end,
		capabilities = capabilities
	}
	if server_name == "tsserver" then
		opts.root_dir = nvim_lsp.util.root_pattern("package.json", "tsconfig.json")
	elseif server_name == "denols" then
		opts.root_dir = nvim_lsp.util.root_pattern("deps.ts", "deno.json")
	elseif server_name == "lua_ls" then
		opts.settings = {
			Lua = {
				diagnostics = { globals = { "vim" } },
			}
		}
	end
	nvim_lsp[server_name].setup(opts)
end })

をした

kamechakamecha

https://github.com/kamecha/dotfiles/commit/8d6d07f13f7c24bc39bb304d74ae53f802703182

これでひとまずinit.lua化はできた

  • init.vim(lua << EOFで少しづつlua化) + dein(toml)
  • init.lua + dein(toml)
  • init.lua + dein(toml内部の処理でlua_source等を多用)
  • init.lua + lazy

あとはtoml内部のhook_add→lua_addみたくしてく
ddc・ddu周りをlua化するのが現状一番のお荷物かなぁ
これを気にnvim-cmpとかも触ってみるのありかもしれん(こっちはlazyに移すときでいかな)

kamechakamecha

deinのtomlをlua化していくスレ

kamechakamecha

Luaで-がついた文字列をtableのkeyとしたい時は

{
		["ai-review-request"] = {
			defaultAction = "open"
		},
}

みたく書くらしい

kamechakamecha

tabを>---で表示させてるのもあって、コメントと繋がって見えて、見やすいかも

kamechakamecha

https://github.com/kamecha/dotfiles/commit/4c4dc5b507e88c8adf4063694ff74fa24206d77c

ここでskkeletonのautocmdをlua化する時に詰まったので載っけとこう

autocmd User skkeleton-enable-pre echo "enable pre"

をluaにすると

vim.api.nvim_create_autocmd({ "User" }, {
	pattern = "skkeleton-enable-pre",
	callback = function()
		vim.fn.echo("enable pre")
	end
})

みたくなる
Userがイベント名として扱われて、skkeleton-enable-preがパターンとして認識されるっぽいのがツボ

kamechakamecha
  • init.vim(lua << EOFで少しづつlua化) + dein(toml)
  • init.lua + dein(toml)
  • init.lua + dein(toml内部の処理でlua_source等を多用)
  • init.lua + lazy

あとはlua化したdeinからlazyへ移行するだけ!
設定を全部lua化(hook_→lua_)してるから、コピペをちまちまやるだけでlazyへ移行できるはず...

https://github.com/Shougo/dein.vim

https://github.com/folke/lazy.nvim

kamechakamecha


現状プラグインとかの整理はしてないけど、deinをlua化した時の現状の時間計測を載っけとく
チューニングとかしてないからめちゃ遅いけど、気にしない

kamechakamecha

https://github.com/kamecha/dotfiles/blob/d63570bd8896ea39232bb8641559136ca66ab207/nvim/init.lua#L2-L4

こんな感じにdein or lazyのプラグインマネージャそのものをneovimに読み込ませる箇所を分離して、簡単に切り替えられるようにした
普段はdein側のコメントを外して、ちょっとづつ移行する事ができるようになったぜ

...dppはdeinのtomlがそのまま使えるかもしれないらしいから、tomlファイル自体はlazyに移行できてもそのままにしておこうかしら
dppに移行する時までにはluaのモジュールを利用した設定にも慣れてそうだからそっちのが良さそう