Neovim設定のLua化やっていくぜ
$ nvim --version
NVIM v0.7.0
Build type: Release
LuaJIT 2.1.0-beta3
sumnekok_luaとcmp_nvimを使い、nvim系の補完を有効にする設定
LuaのLSPを追加。
とりあえず自分はインデントとクオートの設定だけできれば今は良い。そのため、formatterを別のものにしてる人も多いみたいだけど、そうしなかった。
folke/lua-dev.nvim をいれるとnvim lua APIを補完できる。
結局formatterはStyLuaにした。こっちだと長い行の時見やすい。jose-elias-alvarez/null-ls.nvimで動かしている。
has
は1かどうかでチェックすること。
if vim.fn.has('nvim') == 1 then
-- do something...
end
カーソル位置を復活
:h vim-differences
を見て、不要な設定を削る
NeovimのluaでMacのクリップボード関連の設定を書いている例。他にもいろいろな設定例が載っている。
移行中に確認するためのメモ
nvim --cmd "set runtimepath+=~/dotfiles/.config/nvim" -u ~/dotfiles/.config/nvim/init.lua
whichwrapの箇所で以下のようなエラーが出た。
E5113: Error while calling lua chunk: vim/_meta.lua:0:
stack traceback:
[C]: in function 'nvim_set_option_value'
vim/_meta.lua: in function '_set'
vim/_meta.lua: in function '__newindex'
/home/hoge/dotfiles/.config/nvim/lua/rc/base.lua:58: in main chunk
問題のコード
vim.opt.whichwrap = { "b", "s", "h", "l", "[", "]", "<", ">", "~" }
Getting started using Lua in Neovim
をみて、whichwrapもテーブルで書けると思ったが、そうではないらしい。
以下で動いた。
vim.opt.whichwrap = "b,s,h,l,[,],<,>,~"
vim.opt.completeoptで以下のようなエラーが出た。
Error detected while processing /home/hoge/dotfiles/.config/nvim/init.lua:
E5113: Error while calling lua chunk: vim/_meta.lua:0: E474: Invalid argument
stack traceback:
[C]: in function 'nvim_set_option_value'
vim/_meta.lua: in function '_set'
vim/_meta.lua: in function '__newindex'
/home/hoge/dotfiles/.config/nvim/lua/rc/base.lua:44: in main chunk
問題のコードは以下。
vim.opt.completeopt = { "menuone", "popup" }
popupはNeovimにはなく、Vimだけらしい。前まで.vimrcでnvimかどうか判定して変えていたのを忘れていた。
代わりにpreviewを指定した。
vim.opt.completeopt = { "menuone", "preview" }
移行後に読んでおきたいinit.luaのメモ
- My ever growing neovim init.lua - DEV Community
- dotfiles/mappings.lua at main · yutkat/dotfiles
- 閲覧時にリーダーモード推奨→ワシの使っているNeovimプラグインは200個近くあるぞ
- dotfiles/keymap.lua at master · monaqa/dotfiles
気になっているプラグイン
- folke/todo-comments.nvim: ✅ Highlight, list and search todo comments in your projects
- AndrewRadev/sideways.vim: A Vim plugin to move function arguments (and other delimited-by-something items) left and right.
- mizlan/iswap.nvim: Interactively select and swap function arguments, list elements, and more. Powered by tree-sitter.
- SmiteshP/nvim-navic: Simple winbar/statusline plugin that shows your current code context
終わった!!!
machakann/vim-sandwichでデフォルトのレシピをコピーする場合、vim.tbl_extend
ではなくvim.list_extend
を使う。
例
vim.g["sandwich#recipes"] = vim.list_extend(vim.deepcopy(vim.g["sandwich#default_recipes"]), {
{ buns = { "(", ")" }, input = { "jb" } },
{ buns = { "(", ")" }, input = { "j(" } },
{ buns = { "(", ")" }, input = { "j)" } },
{ buns = { "(", ")" }, input = { "j8" } },
{ buns = { "(", ")" }, input = { "j9" } },
{ buns = { "[", "]" }, input = { "j[" } },
{ buns = { "[", "]" }, input = { "j[" } },
{ buns = { "[", "]" }, input = { "jB" } },
{ buns = { "{", "}" }, input = { "j}" } },
{ buns = { "{", "}" }, input = { "j{" } },
{ buns = { "<", ">" }, input = { "j<" } },
{ buns = { "<", ">" }, input = { "j>" } },
{ buns = { "<", ">" }, input = { "ja" } },
{ buns = { "≪", "≫" }, input = { "jA" } },
{ buns = { "「", "」" }, input = { "jk" } },
{ buns = { "『", "』" }, input = { "jK" } },
{ buns = { "〈", "〉" }, input = { "jy" } },
{ buns = { "《", "》" }, input = { "jY" } },
{ buns = { "【", "】" }, input = { "jr" } },
{ buns = { "【", "】" }, input = { "js" } },
{ buns = { "〔", "〕" }, input = { "jt" } },
})
hrsh7th/nvim-cmpでcommand modeでファイル名補完をするときのメモ。
hrsh7th/cmp-pathを使っていると、Insert modeであればそもそもディレクトリを表す.
か/
をトリガーとして、以下のように末尾の/
は補完に含まれない。そのため、以下の画像のように「候補からディレクトリ名を選択」→「/
を入力」→「候補からディレクトリ名を選択」、、、となる。
command modeで、:e z
のように入力し、同じようにディレクトリ名zsh
の補完を期待するとする。
しかし、コマンドライン補完のためにhrsh7th/cmp-cmdlineを使用していると、ディレクトリ名を選択しても末尾に/
がついてしまい、そのディレクトリの中にあるファイル名の補完が発動しにくくなる。
これは、トリガーの都合上cmp-cmdline
の優先され、さらにcmp-cmdline
の補完候補を作成する際に使用しているgetcompletion
では、上記のディレクトリの末尾の/
を含んで出力されるからだと思う(ちょっと自信がない)。
対策1
cmp-path
ならディレクトリ名末尾の/
は取り除いてくれるので、
:e z
ではなく:e ./z
のようにトリガーとなる文字.
(=カレントディレクトリ)などを入力しておく。
対策2
nvim-cmp
の設定で、専用のマッピングを追加してみた。
選択中の補完候補に対して、末尾の文字を一旦切り取り、補完を閉じてから末尾の文字を再度入力させている。
wbthomason/packer.nvimでpacker
消す?みたいな画面よく現れるし、遅延読み込みじゃなくて普通にpackerも読み込ませたかったので、vim.cmd([[packadd packer.nvim]])
は消して、use({ "wbthomason/packer.nvim" })
でopt
は指定せずに記述した。
lualineでオリジナルのモードを判定して表示させる。
たとえば、dhruvasagar/vim-table-modeのテーブルモードが有効になっているか判定する設定は以下。
普通に文字列返す関数を書いて、lualine_a
などに渡している。
表示する文字列は長いとゴチャつくので、アイコンとかのほうがいいかも。
また、pasteオプションが有効かどうかも表示させた。
関数を渡すのではなく、luaの三項演算子てきなやつを書いた。