vimmer が neovim 試してみる設定の移行メモ
tree-sitter を試してみたいのもあって neovim を試してみることにした.年末年始何もできなかった反動かもしれない.
以前既存の vim の設定(miv で管理をしている) を読み込む形で neovim を試していたが,今回はせっかくなので1から作ることにする…にあたって 意外とハマりどころがあり,適宜メモを残しておく.随時更新のつもり.
念頭に置くこと
- vim script も健在だが lua が結構深く息づいており,下記の通り設定を
init.luaでやるなら色々 lua 側から書くほうがスムーズ.設定ごとにググっていったら良いが,どこかで概観するとやりやすいだろう.- Ex command みたいに lua 呼ぶときは
:lua print(4+5) - たとえば.
let g:global_var = 3は lua の設定ファイルの中ではvim.g.global_var = 3- 一応
vim.cmd('let g:global_var = 3')でも達成できる
autocmdを作るのには例えばこんなのが生えている:
- Ex command みたいに lua 呼ぶときは
vim.api.nvim_create_autocmd("TextYankPost", {
pattern = "*",
callback = function()
vim.hl.on_yank({ higroup='Visual', timeout = 300 })
end,
})
- lua の文法はシンプルだが,流石に一回チラ見しておいたほうがよくて,特にリスト/配列/辞書型が全部 table という 構造になってるのは,設定ファイルとかで出くわすことが多い中で面食らうことがある.Programming in lua 3.6 - Table Constructors がわかりやすいかも.
設定ファイル
init.lua を使う.こいつが他の設定ファイルを読んでいく構成になるようだ.
全体のオプション
元々 vim の設定のうちプラグインとか関係ないところは切り分けていたので,これを読み込む
vim.cmd.source("~/.vim/base_config.vim")
lazy.nvim
- プラグインマネージャ.プラグインごとに spec を設定することになる.
- 遅延…のことは後で考えたらいいけど,spec の書き方とか初期設定は lazy.nvimの使い方から起動を爆速にする方法までを解説 | eiji.page がわかりやすい
プラグインのメモ
- telescope.nvim
- nvim-lspconfig
- nvim-cmp
- vim-sandwich
- vim-quickhl
- textobj-user
- nvim-treesitter
- nvim-treesitter-context
- gitsigns.nvim
- fern-vim
- conform.nvim
- trouble.nvim
- nvim-autopairs
- lightline.vim
- nightfox.nvim
telescope.nvim
-- lua/plugins/telescope.nvim.lua
return {
'nvim-telescope/telescope.nvim',
-- ... 中略
config = function()
local builtin = require('telescope.builtin')
vim.keymap.set('n', '<C-p>', builtin.find_files, { desc = 'telescope find files'})
end
}
でとりあえず C-p で find files を起動してみている…が,live_grep とかも便利なのでどうマッピングするか悩みどころ
nvim-comp
return {
"hrsh7th/nvim-cmp",
config = function()
local cmp = require'cmp'
cmp.setup({
mapping = cmp.mapping.preset.insert({
['<C-b>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete(),
['<C-e>'] = cmp.mapping.abort(),
['<CR>'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
['<Tab>'] = function(fallback)
if cmp.visible() then
cmp.select_next_item()
else
fallback()
end
end
}),
sources = cmp.config.sources({
{ name = 'nvim_lsp' },
{ name = 'buffer' },
{ name = 'nvim_lsp_signature_help'}
})
})
end
}
設定はまだ色々いじるかもしれないけど,<tab> の設定になんかドキュメントを探したような記憶
conform.nvim
フォーマッタとかを走らせるやつ.
return{
'stevearc/conform.nvim',
opts = {
formatters_by_ft = {
python = { "ruff_format", "ruff_organize_imports" },
rust = { "rustfmt", lsp_format = "fallback"},
},
format_on_save = {
timeout_ms = 1000,
lsp_format = "fallback",
},
},
}
on_save での整形を一時的にやめたい場合もあるが(ひとのコードを一瞬触るときとか),本体側の機能としては含まれておらず
(issue - 確かに納得する議論ではある),issue みて適宜設定するか,:noau w で良いらしい.
lightline.vim
return {
'itchyny/lightline.vim',
init = function()
vim.g.lightline = {
colorscheme = 'jellybeans',
active = {
left = {
{ 'mode', 'paste'},
{ 'readonly', 'relativepath', 'path', 'modified'},
},
right = {
{ 'lineinfo' },
{ 'fileformat', 'fileencoding', 'filetype' },
{ 'charvaluehex' },
}
},
inactive = {
left = {
{ 'absolutepath', 'modified' }
},
right = {
{ 'lineinfo' },
{ 'percent' }
}
},
mode_map = {
n = 'N',
i = 'I',
R = 'R',
v = 'V',
V = 'V-L',
c = 'C',
s = 'S',
S = 'S-LINE',
t = 'TERM',
}
}
end
}
みたいな感じで,g:lightline.active.left とかを適宜読み替えながら設定してやる.
気付いた新たな機能
vim.hl.on_yankというのが生えており,help にある通りこいつをTextYankPostで呼ぶことで,yank した部分をハイライトする機能が実現できる.- diagnostics が built-in で存在している.LSP が動いてる状態で
vim.diagnostic.config({ virtual_lines = true })でそこそこいい感じになる.
TODO
- クリップボードが効かない.
:set clipboard=unnamed/unnamedplusとか,let g:clipboard=xclipとか試しているが…