nvim環境構築 w/ NvChad

環境はArchLinux。
- neovimのインストール
$ sudo pacman -S neovim
- nerdフォントのインストール
$ sudo pacman -S ttf-bitstream-vera-mono-nerd
適当にフォントを設定。KDEを使っているので、GUIでBitstromWera Nerd Fontを選択した。
- NvChadのインストール
チュートリアル通り。
$ git clone https://github.com/NvChad/starter ~/.config/nvim && nvim
- lua language serverのインストール
設定ファイルをいじるたびに文句を言われるので、lua language serverをインストールする。
$ nvim
nvimが起動したら、:Lazy
と入力してみる。ポップアップのGUIが表示される。Lazy経由で、NvChadやmasonがインストールされているのがわかる。
masonを使って、lua language serverを入れる。
:Mason
で、今度はmasonのGUIを起動する。Ctrl+Fで、言語の検索をかける。
Spaceでざーっと見ていくと、Luaは103番だったので、103を入力してEnter。その後、候補が表示された。候補の中の「lua-language-server」をするために、以下のコマンドを走らせた。
:MasonInstall lua-language-server
無事インストールされた。
次は、補完関係の設定を色々行っていきたいところ。ターミナルと同じように、カーソルキー + Tabで補完ができたら嬉しい。

まずは、コピペが面倒すぎたので、それに関する設定を行う。KDE plasmaのデフォルトのクリップボードだとうまく動かないようで、:help clipboard
を読んで書いてあったwl-clipboardを導入することにした。
$ sudo pacman -S wl-clipboard
$ wl-copy Hello world!
この後Ctrl+Vで「Hello, world!」と表示できた。問題なく動作している。
nvimのヘルプによると、
$ export WAYLAND_DISPLAY=true
ところが、コピーをしようとすると、「waylandサーバーに接続できなかった。/run/user/1000/trueが存在するか確かめて」と怒られた。なるほど、ソケットを設定すればいいらしい。
$ export WAYLAND_DISPLAY=wayland-0
問題なくコピペを行うことができるようになった。
どうやら、環境変数を適切に設定すれば、設定ファイルを書き換えなくてもクリップボードが使えるらしい。
(追記)
neovim単体の場合は、他にも設定が必要。
cf)

さて、Tab補完も設定できたので紹介する。
~/.config/nvim/
にneovim関連の設定が入っているが、Lazyのsetupは~/.config/nvim/init.lua
で行っているようだったので、そこに追記をすることにした。
NvChadのデフォルトの設定とにらめっこしながら、設定していく。
...
require("lazy").setup({
...
{
"hrsh7th/nvim-cmp",
event = "InsertEnter",
config = function()
local cmp = require "cmp"
cmp.setup({
completion = { completeopt = "menu,menuone" },
snippet = {
expand = function(args)
require("luasnip").lsp_expand(args.body)
end
},
mapping = {
["<M-k>"] = cmp.mapping.select_prev_item(),
["<Up>"] = cmp.mapping.select_prev_item(),
["<M-j>"] = cmp.mapping.select_next_item(),
["<Down>"] = cmp.mapping.select_next_item(),
["<C-d>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
["<C-e>"] = cmp.mapping.close(),
["<Tab>"] = cmp.mapping.confirm {
behavior = cmp.ConfirmBehavior.Insert,
select = true,
},
},
sources = {
{ name = "nvim_lsp" },
{ name = "luasnip" },
{ name = "buffer" },
{ name = "nvim_lua" },
{ name = "path" },
},
})
end,
},
...
})
...
これで、補完に関する設定ができた。
せっかくnvimを使うので、Alt+jとAlt+kでも候補の選択ができるようにした。
tab補完ができるようになって、ずいぶん快適になった。

ついでに、Rustの開発環境も整えてみる。
rustupから、rust-analyzerを入れる。
$ rustup component add rust-analyzer
Lazyを使って、rustaceanvimを導入する。
先ほども使った~/.config/nvim/init.lua
に、rustaceanvimのREADMEの通りに書き込む。
...
require("lazy").setup({
...
{
'mrcjkb/rustaceanvim',
version = '^5',
lazy = false,
},
...
})
nvimを再起動すると、rustaceanvimのダウンロード・インストールが始まる。
試しに、ちょっとだけRustを書いてみる。
エラーメッセージが途中で途切れてしまっているが、エラーの箇所が表示されている。
LSPのインレイヒントも、neovim v0.10からはネイティブ対応しているようなので、また試してみる。