Closed9

NvChadでNeoVimの開発環境を整える

apahieapahie

プラグイン

https://github.com/NvChad/NvChad

  • NeoVimをIDEのように機能させるためのプラグイン、設定のプリセット
  • 起動速度ときれいなUIに拘っているらしい
  • 使用されているPluginなどもNeoVim向けをベースにして、いい感じのものが揃っている
  • Dockerで試してみて良さげだったので、使ってみる

ドキュメント

https://nvchad.github.io/

  • 詳細な設定方法というよりは、大まかな構成などが載っている
  • 各プラグインに対する設定は、デフォルトの設定ファイルなどを参照したがわかりやすい
apahieapahie

インストール

https://nvchad.github.io/quickstart/install#install

~/.config/nvim/ がまっさらな状態で以下のコマンドを実行。
NeoVimが起動したあとは:PackerSyncを実行し、再起動する。

git clone https://github.com/NvChad/NvChad ~/.config/nvim --depth 1 && nvim

dotfilesリポジトリでNeoVimの設定を管理している場合

NvChadはGitを利用してバージョンの管理を行っているため、dotfilesリポジトリの中にNvChadをインストールした場合、Gitリポジトリの中にGitリポジトリが存在する状態になってしまう。
また、NvChadの設定をカスタマイズする場合は、NvChadリポジトリの中にカスタマイズ用の設定ファイルを配置する必要がある(詳細は事項を参照)。
これらの問題は、NvChadリポジトリをsubmoduleとして扱い、設定ファイルはシンボリックリンクを貼ることで解決した。

git submodule add -b main https://github.com/NvChad/NvChad .config/nvim
mkdir -p nvchad/custom
ln -s ~/dotfiles/nvchad/custom ~/.config/nvim/lua/

参考までに、自分のディレクトリツリーを示す。

dotfiles
├── .config
│   └── nvim # submodule
│       ├── ...
│       ├── lua
│       │   ├── core
│       │   ├── custom -> /home/user-name/dotfiles/nvchad/custom
│       │   └── plugins
│       └── ...
├── .gitmodules
├── nvchad
│   └── custom
│       ├── chadrc.lua
│       └── init.lua
└── README.md

特に指定がない場合、以降のカレントディレクトリは ~/.config/nvim であることを前提でパスを記載する。

アップデート

NvChadはノーマルモードのときに<leader>uuと入力することで、アップデートされる。
それ以外のプラグインは:PackerSyncを実行することで、アップデートされる。

apahieapahie

カスタマイズ方法

./lua/custom/ に設定ファイルを配置していく。
init.luachadrc.lua だけ、NvChad本体から呼び出される仕組みになっている。
詳細はリンク先を参照。
https://nvchad.github.io/quickstart/post-install#setup-your-custom-config

exmaples ディレクトリにサンプルが入っているので、それを使用すれば良い。

cp ./examples ./lua/custom

また、chadrc.luapluginsなどのプロパティを設定したオブジェクトはreturnする必要がある。

lua/custom/chadrc.lua
local M = {}

M.plugins = {
  // プラグインに関する設定
}

M.mappings = {
  // キーマッピングに関する設定
}

return M

https://github.com/siduck/dotfiles/tree/master/nvchad/custom

apahieapahie

プラグインを追加

https://nvchad.github.io/config/plugins

hop.nvimを例に示す。

lua/custom/chadrc.lua
M.plugins = {
  user = {
    ["phaazon/hop.nvim"] = {
      branch = "v2",
      config = function ()
        require("hop").setup()
      end
    },
  },
}

hop.nvimはデフォルトでキーバインドを提供していないので、対応するキーマップを設定する。

lua/custom/chadrc.lua
M.mappings = {
  hop = { -- 自由な名前を付けれる
    n = {
      ["<leader>s"] = {"<cmd> HopChar1 <CR>", "type a key and hop to the char"}
    },
  },
}
apahieapahie

マッピングを設定

https://nvchad.github.io/config/Mappings

インサートモードでかんたんに移動できるキーマッピングが、デフォルトで準備されている。
https://github.com/NvChad/NvChad/blob/01b17d2ad6d47008b27f38bff7fa490f56fae03f/lua/core/mappings.lua#L10-L20

Emacsのキーマッピングに慣れているため、デフォルトを無効化しつつ、自分向けの設定を入れる。

lua/custom/chadrc.lua
M.mappings = {
  -- 無効化するデフォルトのキーマッピング
  disabled = {
    i = { -- インサートモードに関するキーマッピング
      ["<C-b>"] = "", -- { "<ESC>^i", "beginning of line" },
      ["<C-e>"] = "", -- { "<End>", "end of line" },
      ["<C-h>"] = "", -- { "<Left>", "move left" },
      ["<C-l>"] = "", -- { "<Right>", "move right" },
      ["<C-j>"] = "", -- { "<Down>", "move down" },
      ["<C-k>"] = "", -- { "<Up>", "move up" },
    },
    n = { -- ノーマルモードに関するキーマッピング
      ["<C-s>"] = "", -- { "<cmd> w <CR>", "save file" },
    },
  },
  -- 追加するキーマッピング
  general = {
    i = {
      ["<C-a>"] = { "<Home>", "beginning of line" },
      ["<C-e>"] = { "<End>", "end of line" },
      ["<C-b>"] = { "<Left>", "move left" },
      ["<C-f>"] = { "<Right>", "move right" },
      ["<C-n>"] = { "<Down>", "move down" },
      ["<C-p>"] = { "<Up>", "move up" },
    },
  },
}
apahieapahie

LSP周りの設定

様々なプラグインが登場して役割がややこしいが、この記事の説明がわかりやすかった。
https://zenn.dev/nazo6/articles/c2f16b07798bab

LSP

基本的に、公式ドキュメントにしたがって設定を行えば問題ない。
https://nvchad.github.io/config/Lsp stuff

mason.nvimのensure_installedの設定方法がちょっと分かりづらかったので補足。
ensure_installedはデフォルトの設定が存在するため、chadrc.luaM.plugins.overrideに対して設定する必要がある。

lua/custom/chadrc.lua
M.plugins = {
  user = require "custom.plugins",
  override = require "custom.override",
}
lua/custom/override.lua
return {
  ["williamboman/mason.nvim"] = {
    ensure_installed = {
      -- lua stuff
      "lua-language-server",
      "stylua",

      -- web dev
      "css-lsp",
      "html-lsp",
      "typescript-language-server",
      "deno",
      "emmet-ls",
      "json-lsp",

      -- shell
      "shfmt",
      "shellcheck",
    },
  },
}

Format & lint

ここも公式ドキュメントにしたがって設定を行えばよい。
https://nvchad.github.io/config/Format & lint

dotfiles内に構築している場合

NvChadには.stylua.tomlが準備されているが、./lua/customディレクトリをシンボリックリンクで準備した場合、デフォルトのスタイル設定でフォーマットされてしまう。
:LspInfoを確認するとroot directorydotfilesとなっており、シンボリックリンクの実体があるdotfiles/nvchad/customを基準に.stylua.tomlを探しているのが原因と思われる。
なので、.stylua.tomlのシンボリックリンクをdotfiles直下に準備した。

cd ../..
ln -s .config/nvim/.stylua.toml ./
apahieapahie

Go言語の設定

LSP周りの設定がうまくいっているか、Go言語の開発環境の設定を追加して確認する。

開発関連ツールのインストール

mason.nvimでGoの開発関連ツールを以下のように設定し、:MasonInstallAllを実行する。
その際、インストールするツールがどのカテゴリ (LSP, DAP, Linter, Formatter) に属するかによって設定方法が変わるため、それぞれ把握しておく。

lua/custom/override.lua
  ["williamboman/mason.nvim"] = {
    ensure_installed = {
      -- 他の言語の設定

      -- go
      "goimports", -- Formatter
      "gopls",     -- LSP
    },
  },

LSPの設定

mason.nvimでインストールしたツールのうち、カテゴリがLSPのものは、nvim-lspconfigに対して設定を追加する。

lua/custom/lspconfig.lua
...
local servers = { "html", "cssls", "clangd", "gopls" } -- インストールしたLSPを追加
...

Formatter、Linterの設定

mason.nvimでインストールしたツールのうち、カテゴリがFormatter、Linterのものは、null-ls.nvimに対して設定を追加する。
カテゴリがFormatterのものはb.formatting.<formatter-name>、Linterのものはb.diagnostics.<linter-name>でそれぞれ設定する。

lua

local sources = {

   -- webdev stuff
   b.formatting.deno_fmt,
   b.formatting.prettier,

   -- Lua
   b.formatting.stylua,

   -- Shell
   b.formatting.shfmt,
   b.diagnostics.shellcheck.with { diagnostics_format = "#{m} [#{c}]" },

  -- Go
  b.formatting.goimports 
}

DAPの設定

設定後

いろいろ補完が表示されるようになり、fmtを選択した際にimport文も自動で保管される。

apahieapahie

その他

ダッシュボード

NvChadでは、alpha.nvimのダッシュボードも準備されている。
ただし最初は設定で無効化されているので、使用したい場合は以下の設定で有効化する必要がある。
詳しくは以下のリンク先を参照。

https://nvchad.github.io/config/plugins#enable-dashboard

ダッシュボードで表示されるロゴを変更したい場合は、以下のように設定する。

lua/custom/override.lua
["goolord/alpha-nvim"] = {
  header = {
    val = {
      "                                                     ",
      "  ███╗   ██╗███████╗ ██████╗ ██╗   ██╗██╗███╗   ███╗ ",
      "  ████╗  ██║██╔════╝██╔═══██╗██║   ██║██║████╗ ████║ ",
      "  ██╔██╗ ██║█████╗  ██║   ██║██║   ██║██║██╔████╔██║ ",
      "  ██║╚██╗██║██╔══╝  ██║   ██║╚██╗ ██╔╝██║██║╚██╔╝██║ ",
      "  ██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║ ",
      "  ╚═╝  ╚═══╝╚══════╝ ╚═════╝   ╚═══╝  ╚═╝╚═╝     ╚═╝ ",
      "                                                     ",
    },
  },
},

このスクラップは2022/08/13にクローズされました