Open4

nvim環境構築 w/ NvChad

meet4580meet4580

環境はArchLinux。

  1. neovimのインストール
$ sudo pacman -S neovim
  1. nerdフォントのインストール
$ sudo pacman -S ttf-bitstream-vera-mono-nerd

適当にフォントを設定。KDEを使っているので、GUIでBitstromWera Nerd Fontを選択した。

  1. NvChadのインストール
    チュートリアル通り。
$ git clone https://github.com/NvChad/starter ~/.config/nvim && nvim
  1. 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で補完ができたら嬉しい。

meet4580meet4580

まずは、コピペが面倒すぎたので、それに関する設定を行う。KDE plasmaのデフォルトのクリップボードだとうまく動かないようで、:help clipboardを読んで書いてあったwl-clipboardを導入することにした。

$ sudo pacman -S wl-clipboard
$ wl-copy Hello world!

この後Ctrl+Vで「Hello, world!」と表示できた。問題なく動作している。
nvimのヘルプによると、WAYLAND_DISPLAY環境変数をセットする必要があるとのことだったので、とりあえずセットしてみた。

$ export WAYLAND_DISPLAY=true

ところが、コピーをしようとすると、「waylandサーバーに接続できなかった。/run/user/1000/trueが存在するか確かめて」と怒られた。なるほど、ソケットを設定すればいいらしい。

$ export WAYLAND_DISPLAY=wayland-0

問題なくコピペを行うことができるようになった。

どうやら、環境変数を適切に設定すれば、設定ファイルを書き換えなくてもクリップボードが使えるらしい。

(追記)
neovim単体の場合は、他にも設定が必要。
cf)

https://zenn.dev/ryo1217intern/articles/38e1bab0d8b6eb#システムクリップボードの使用

meet4580meet4580

さて、Tab補完も設定できたので紹介する。

~/.config/nvim/にneovim関連の設定が入っているが、Lazyのsetupは~/.config/nvim/init.luaで行っているようだったので、そこに追記をすることにした。

NvChadのデフォルトの設定とにらめっこしながら、設定していく。

https://github.com/NvChad/NvChad/blob/v2.5/lua/nvchad/configs/cmp.lua

init.lua
...
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補完ができるようになって、ずいぶん快適になった。

meet4580meet4580

ついでに、Rustの開発環境も整えてみる。
rustupから、rust-analyzerを入れる。

$ rustup component add rust-analyzer

Lazyを使って、rustaceanvimを導入する。

https://github.com/mrcjkb/rustaceanvim

先ほども使った~/.config/nvim/init.luaに、rustaceanvimのREADMEの通りに書き込む。

init.lua
...
require("lazy").setup({
  ...
  {
    'mrcjkb/rustaceanvim',
    version = '^5',
    lazy = false,
  },
  ...
})

nvimを再起動すると、rustaceanvimのダウンロード・インストールが始まる。

試しに、ちょっとだけRustを書いてみる。

エラーメッセージが途中で途切れてしまっているが、エラーの箇所が表示されている。

LSPのインレイヒントも、neovim v0.10からはネイティブ対応しているようなので、また試してみる。