IDEとしても使えるNvChadを『わかりやすさ重視で』インストールからカスタマイズの方法まで説明してみた

みなさんこんにちは。おとかです。

かなり久々の投稿になります。

最近、Vimの勉強をし始めたところなんですが、せっかくならVimをIDEライクに、かつ手軽に使えたらなと思っていました。
いくつか気になったVimIDEっぽいものはあったのですが、色々試してみた中、今のところ一番しっくり来ているのは**NvChad**です。

勘違いしてはいけないので、念の為先に断っておきますが、NvChadは　***I　D　E　で　は　あ　り　ま　せ　ん　。（迫真***
あくまでも、neovimの**基本構成を拡張したもの**であり、最小構成で使うvimmerにも手に馴染みやすくなってます。

また、基本構成から拡張するのも容易で、様々なニーズに答えてくれることから、現在世界中のVimmerから注目を集めているのがgithubのスター数から見て取れます。

https://github.com/NvChad/NvChad

ただ…残念なことに、NvChadに関する情報が日本ではまだ少なかったので、今回はNvChadをこれから始める方に向けて、基本設定、カスタム構成について徹底的にわかりやすくまとめていきます。

## インストール

インストールする前に、まず初めにNeoVim0.8以上がインストールされている必要があります。
neovimのインストール方法については、公式のgithubにまとめられているので、以下の記事を参照してください

[NeoVimのインストール方法(githubページ)](https://github.com/neovim/neovim/wiki/Installing-Neovim)

NvChadのインストール方法は至ってシンプル。以下のコードを貼り付けるだけです

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

実行すると、gitのソースをダウンロードした後、PackerSync（詳細は後述）されます。

![Screenshot_20221025-165229_Termux.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208045/e2c508f7-5207-4264-4f81-f9ac8883932f.jpeg)

PackerSyncが終わると、以下のようなパッケージマネージャーが出てきます。ココで色々とインストールします。

![Screenshot_20221025-165240_Termux.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208045/22fb5885-3a6e-5fbd-d1a7-dec9fa9e2e37.jpeg)

## パッケージマネージャーについて
NvChadのこれらのパッケージは、[mason.nvim](https://github.com/williamboman/mason.nvim)によって提供されています。そのため、mason.nvimを使ったことある方は問題なく使えると思います。

### 一覧の見方
上のタブに、All、LSP、DAP、Linter、Formatterの5つに分かれています。
この内分かりづらいのがDAP、これは**アダプター**の略称です。色々あるので必要に応じて入れてみてください

インストールするときは

```vim
"command
:MasonInstall html-lsp
```

のようにしてインストールします。
ほしい機能あったら色々と入れてみましょう

なお、保管機能やLSPについては、この後説明するカスタム設定をしないと動きません。順番に説明していきます。

### 補足：Luaについて
NvChadでは、カスタム設定をする際に、Luaというプログラミング言語を使います。
Luaやったこと無い方は、NvChadの公式ドキュメントにわかりやすくまとめてあるので、先にザッと目を通しておきましょう。
※英語読めない方はブラウザの設定から日本語に翻訳してください。コードの部分は翻訳されないので問題なく読めます。

 https://nvchad.com/quickstart/learn-lua

## NvChadのフォルダ構造

NvChadの設定に関するファイルは、`~/.config/nvim/lua`の中に格納されています。
基本的なフォルダ構成は以下のとおりです。

> ```
> ├── init.lua
> │
> ├── lua
> │   │
> │   ├── core
> │   │   ├── default_config.lua
> │   │   ├── mappings.lua
> │   │   ├── options.lua
> │   │   ├── utils.lua  -- (core util functions) (i)
> │   │   └── init.lua  -- (autocmds)
> │   │
> │   ├── plugins
> │   │    ├── init.lua -- (default plugin list)
> │   │    └── configs
> │   │        ├── cmp.lua
> │   │        ├── others.lua -- (list of small configs of plugins)
> │   │        └── many more plugin configs
> |   |
> │   ├── custom *
> │   │   ├── chadrc.lua -- (overrides default_config)
> │   │   ├── init.lua -- (runs after main init.lua file)
> │   │   ├── more files, dirs
> ```
引用元：https://nvchad.com/config/Walkthrough

この内、デフォルトではカスタムフォルダは作成されていません。つまり、必要に応じて、自身で作成する必要があります。

カスタム設定をする前に、まずは各ファイルでどういったことをしているのか、予め理解しておく必要があります。

### coreフォルダ
coreの中では、NvChadを起動するのに必要なオプション設定がしてあります。

基本的にこのcoreの中をいじることは***絶対にありません***
ただ、なにか変更をする際に、元がどういう構成だったのかを把握する必要があるので、その際にこちらを参照することはあります。
### pluginsフォルダ
先に言っちゃいます。ここも基本的に***触ることはありません***
この中では、NvChadを構成する上で必要なプラグインのインストール設定、及びプラグインの基本設定がしてあります。

基本的に、カスタム構成で元々あるプラグインの設定を変更する際、このプラグインの設定をrequireして使うことになるので、何をしてあるかまでは最初から覚える必要はないですが、どういったことをしているのかぐらいは把握するようにしましょう。

特に、プラグインの定義をしている`plugins/init.lua`の書き方を参考にするときもあります（詳細はこの後説明します）

なお、ここから先は、**~/.config/nvim/lua/をカレントディレクトリとして**説明を進めます。

#### デフォルトのキーマップについて
公式ドキュメントには、デフォルトで使えるキーマッピングまでは触れていません。
しかし、NvChadのcore/mappingsでデフォルトで定義してあるキーマップの一覧を見ることができます。
https://github.com/NvChad/NvChad/blob/main/lua/core/mappings.lua

よく使うのをざっと上げておきますと
|内容|ショートカットキー| 
| ---------------- | ------------------------------------- | 
| フォルダの開閉   | \<C-n>                          | 
| ウィンドウの移動 | \<Ctrl-[hjkl]+>                        | 
| ターミナルの表示 | \<A-h>(下) \<A-v>(右) \<A-i>(全面) | 

1つ注意が必要なのが、例えばターミナルを下に普通に表示させるとき、本来vimコマンドだと
`:bo term :vert term`
といったコマンドで、水平分割や垂直分割できるのですが、これがNvChadだとデフォルトではできなくなっています。

未検証なので、nvtermというプラグインを無効にすることでできるようになるかはわかりませんが…進捗があったら追記しますね。

## カスタム設定の準備をしよう
ここからは、公式ドキュメントを交えて、実際にカスタム設定の定義をしていきましょう。

まずは、何はともあれ、chadrcの定義をするところから初めるのですが…***ちょっと待ってください!!!***

中身が空のままnvimを起動してしまったらエラーが吐かれてしまい、NvChadが正常に起動できなくなってしまいます。落ち着いて以下の手順で進めてください。

### chadrcの定義
まずはカスタムフォルダを作ります

```bash
#bash
mkdir custom
```

そしてこの後からが大事で、

```bash
#bash
#間違ったやり方
touch custom/chadrc.lua
```

とはやらずに、
```bash
#bash
nvim custom/chadrc.lua
```

で、nvimで新規作成したファイルを***そのまま開いてください***
そしたらすかさず以下の内容を書きます

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

return M
```
そしたら保存して終了します。
こうすることで、NvChadのエラーを起こさずchadrcを作ることができます。

#### 〜〜なぜ空のchadrcの作成が許されないのか？〜〜
先程定義したファイル内でやっていることは、プログラミング経験者でしたらすぐおわかりかと思います。
要は、Mというオブジェクトを返しているわけです。

NvChadは、custom/chadrc.luaのファイルを見つけたら、***そのファイルが返しているオブジェクトを参照します***
なお、この際、NvChad側は、chadrcがあるということは、オブジェクトがあるはずである。という前提のもと処理がされているので、オブジェクトが返されていなかったらそれだけで***エラーになります!!!***

そのため、chadrcを作成する際は、一緒にオブジェクトを各処理を書いていたわけです

## プラグインのカスタム設定をしよう
大変お待たせいたしました。ここからは、プラグインのカスタム設定の方法について紹介していきます。

とは言っても、今から紹介することは公式ドキュメントに書かれていますので、ざっと流したい方は以下の記事を参照してください

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

ある程度感の言い方であれば、この記事を見ただけですぐに設定できるでしょう。ここではもう少し掘り下げて説明します。

### プラグインファイルを用意
まずはプラグインファイルを用意します。

```bash
#bash
mkdir custom/plugins
touch custom/plugins/init.lua
```

```lua
-- custom/plugins/init.lua
return {

}
```

`custom/plugins/init.lua`では、単にオブジェクトをそのまま返してあげるだけで大丈夫です。
そしたら、chadrcに`custom/plugins/init.lua`をインポートします

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

-- 以下を追記
M.plugins = require "custom.plugins"

return M
```

Mオブジェクトのpluginsに、`custom/plugins/init.lua`をrequireしています。

ここでポイントになるのが以下の3点
- 階層はドット区切り
- プロジェクトルートは`~/.config/nvim/lua/`
- `init.lua`の場合に限りファイル名を省略できる

Javaをやったことある人だったら割りと直感的に理解できると思います。あんな感じです。

これで、pluginsをインポートする準備ができました

### 実際にインポートしてみよう

それでは実際にインポートの設定をしてみましょう。
ここでは、vim界隈では一番使われているらしい[tpope/vim-fugitive](https://github.com/tpope/vim-fugitive)を導入する手順を紹介します。

と入っても、やることは簡単です。

```lua
-- custom/plugins/init.lua
return {
  ["tpope/vim-fugitive"] = {},
}
```
たったこれだけです。個々でやっていることは
- []内にgithubのユーザー名/リポジトリ名を書く
- {}の中に必要であればオプションを書く

今回はインストールするだけなのでオプションは書きませんが、例えばインストールした後設定を追記する必要がある場合も、ファイルごとに管理することができるのでとても便利です。

### デフォルト設定をオーバーライドしてみよう
`custom/plugins/init.lua`では、パッケージインストールの定義だけではなく、オーバーライドをすることもできます。

ここでは例として、デフォルトでは非表示設定になっていたダッシュボードを表示させてみましょう

```lua
return {
  -- /custom/plugins/init.lua
  ["goolord/alpha-nvim"] = {
    disable = false
  },
}
```

ここでは、plugins/init.luaでは、disableの設定がtrueになっていました。
このため、デフォルトの状態ではダッシュボードが表示されないようになっています。

```lua
-- /plugins/init.lua 153行目から~
["goolord/alpha-nvim"] = {
  after = "base46",
  disable = true, -- ここで無効化されている
  config = function()
    require "plugins.configs.alpha"
  end,
},
```

そこで、disableの部分だけオーバーライドしてあげればいいので、customでインポートするときと同じ形で定義し、無効化したいところだけ上書きすればうまく行きます。

### 高度なオーバーライド〜〜言語サーバー設定編〜〜

例えば、masonで言語サーバーをインストールした際、lspの設定も一緒にしなければならないときがあります。

そんなときに高度な設定が必要になってくるのですが、幸いなことに、公式ドキュメントでどのように実装したらいいかがすでに記されています

https://nvchad.com/config/Language%20Server%20Protocol

言語サーバーの設定は、ココに書いてあることをそのままコピペすれば動くようになります。

```lua
-- custom/plugins/init.lua
return {
  ["neovim/nvim-lspconfig"] = {
    config = function()
      require "plugins.configs.lspconfig"
      require "custom.plugins.lspconfig"
    end,
  },
}
```

```bash
#bash
touch custom/plugins/lspconfig.lua
```

```vim
"vimコマンド
:MasonInstall html-lsp
```

```lua
-- custom.plugins.lspconfig
local on_attach = require("plugins.configs.lspconfig").on_attach
local capabilities = require("plugins.configs.lspconfig").capabilities

local lspconfig = require "lspconfig"
local servers = { "html"}

for _, lsp in ipairs(servers) do
  lspconfig[lsp].setup {
    on_attach = on_attach,
    capabilities = capabilities,
  }
end
```

## 力尽きた。
記事書き続けたら力尽きたので一旦ここまでとさせてください。
他になにか追記すること思いついたら追記していこうと思います。

それでは皆さん良きNvChadライフを。