Neovim使いたいけど設定面倒だからChatGPTに全て任せる

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。（同担OKです😉）
今回は個人的に使いたいNeovimの設定が色々面倒そうだったので、ChatGPTを使ってごちゃごちゃした備忘録です。
おすすめの設定があれば教えてください😁

# Neovim設定備忘録
まず、カッコ良いという単純な理由でNeovimを使ってみることにしました。
しかし、`lua`の書き方も知らなければ、そもそもvimの操作も何も知らない状態。。。
こんな状態じゃあハードルが高くてとてもとても。。。🤦

ということで何を設定すれば良いか聞いてみました。

`~/.config/nvim/init.lua`の初期状態（少し調べて設定しました。）
![スクリーンショット 2024-06-17 21.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653241/ec7927a3-7e33-353a-823d-54b3281881f7.png)


最初の質問
👶 < Neovimのinit.luaに設定しておいた方が良いものを教えてください

回答
🤖 < これ設定しとけ！
``` init.lua
-- 行番号を表示
vim.opt.number = true

-- 相対行番号を表示
vim.opt.relativenumber = true

-- タブの設定
vim.opt.expandtab = true
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4

-- スワップファイルを無効化
vim.opt.swapfile = false

-- バックアップファイルを無効化
vim.opt.backup = false

-- カーソルラインを表示
vim.opt.cursorline = true

-- 検索のハイライトを有効化
vim.opt.hlsearch = true

-- インクリメンタル検索を有効化
vim.opt.incsearch = true

-- packer.nvimのインストール
vim.cmd [[packadd packer.nvim]]

require('packer').startup(function()
  use 'wbthomason/packer.nvim' -- packerを管理しているプラグイン
  use 'nvim-treesitter/nvim-treesitter' -- シンタックスハイライト
  use 'neovim/nvim-lspconfig' -- LSPの設定
  use 'hrsh7th/nvim-cmp' -- 自動補完プラグイン
  use 'L3MON4D3/LuaSnip' -- スニペットエンジン
  use 'nvim-lua/plenary.nvim' -- 多目的ユーティリティ
  use 'nvim-telescope/telescope.nvim' -- ファジーファインダー
  use 'nvim-lualine/lualine.nvim' -- ステータスライン
  use 'kyazdani42/nvim-tree.lua' -- ファイルエクスプローラー
  use 'akinsho/bufferline.nvim' -- バッファライン
end)

local nvim_lsp = require('lspconfig')

-- 各種LSPサーバーの設定
nvim_lsp.tsserver.setup{}
nvim_lsp.pyright.setup{}
nvim_lsp.rust_analyzer.setup{}

local cmp = require'cmp'

cmp.setup({
  snippet = {
    expand = function(args)
      require('luasnip').lsp_expand(args.body)
    end,
  },
  mapping = {
    ['<Tab>'] = cmp.mapping.select_next_item(),
    ['<S-Tab>'] = cmp.mapping.select_prev_item(),
    ['<C-Space>'] = cmp.mapping.complete(),
    ['<CR>'] = cmp.mapping.confirm({ select = true }),
  },
  sources = {
    { name = 'nvim_lsp' },
    { name = 'luasnip' },
    { name = 'buffer' },
  }
})

vim.opt.termguicolors = true
vim.cmd [[colorscheme gruvbox]]

-- leaderキーの設定
vim.g.mapleader = " "

-- ファイルエクスプローラーをトグル
vim.api.nvim_set_keymap('n', '<leader>e', ':NvimTreeToggle<CR>', { noremap = true, silent = true })

-- 検索をトグル
vim.api.nvim_set_keymap('n', '<leader>f', ':Telescope find_files<CR>', { noremap = true, silent = true })

```

うあああ！一度に来すぎ！
抜粋しながら何の設定か見ていきましょう。

``` init.lua
-- 行番号を表示
vim.opt.number = true

-- 相対行番号を表示
vim.opt.relativenumber = true

-- タブの設定
vim.opt.expandtab = true
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4

-- スワップファイルを無効化
vim.opt.swapfile = false

-- バックアップファイルを無効化
vim.opt.backup = false

-- カーソルラインを表示
vim.opt.cursorline = true

-- 検索のハイライトを有効化
vim.opt.hlsearch = true

-- インクリメンタル検索を有効化
vim.opt.incsearch = true
```

これはNeovimを操作するときの基本的な設定のようです。
それぞれコメントアウトしているので分かりやすいですね！

``` init.lua
-- packer.nvimのインストール
vim.cmd [[packadd packer.nvim]]

require('packer').startup(function()
  use 'wbthomason/packer.nvim' -- packerを管理しているプラグイン
  use 'nvim-treesitter/nvim-treesitter' -- シンタックスハイライト
  use 'neovim/nvim-lspconfig' -- LSPの設定
  use 'hrsh7th/nvim-cmp' -- 自動補完プラグイン
  use 'L3MON4D3/LuaSnip' -- スニペットエンジン
  use 'nvim-lua/plenary.nvim' -- 多目的ユーティリティ
  use 'nvim-telescope/telescope.nvim' -- ファジーファインダー
  use 'nvim-lualine/lualine.nvim' -- ステータスライン
  use 'kyazdani42/nvim-tree.lua' -- ファイルエクスプローラー
  use 'akinsho/bufferline.nvim' -- バッファライン
end)
```

Neovimのプラグイン管理には packer.nvim を使うのが一般的でだそうで、ここでインストールから設定までしているようです。

``` init.lua
local nvim_lsp = require('lspconfig')

-- 各種LSPサーバーの設定
nvim_lsp.tsserver.setup{}
nvim_lsp.pyright.setup{}
nvim_lsp.rust_analyzer.setup{}
```

LSP（Language Server Protocol）というものがあるそうで、設定を行うことでコード補完や診断を強化できるようになるとのこと。
ほえ〜😮

``` init.lua
local cmp = require'cmp'

cmp.setup({
  snippet = {
    expand = function(args)
      require('luasnip').lsp_expand(args.body)
    end,
  },
  mapping = {
    ['<Tab>'] = cmp.mapping.select_next_item(),
    ['<S-Tab>'] = cmp.mapping.select_prev_item(),
    ['<C-Space>'] = cmp.mapping.complete(),
    ['<CR>'] = cmp.mapping.confirm({ select = true }),
  },
  sources = {
    { name = 'nvim_lsp' },
    { name = 'luasnip' },
    { name = 'buffer' },
  }
})
```

`nvim-cmp`を使用して自動補完機能を設定している模様。

``` init.lua
vim.opt.termguicolors = true
vim.cmd [[colorscheme gruvbox]]

-- leaderキーの設定
vim.g.mapleader = " "

-- ファイルエクスプローラーをトグル
vim.api.nvim_set_keymap('n', '<leader>e', ':NvimTreeToggle<CR>', { noremap = true, silent = true })

-- 検索をトグル
vim.api.nvim_set_keymap('n', '<leader>f', ':Telescope find_files<CR>', { noremap = true, silent = true })
```

テーマの変更と、キーバインディングを設定しているようです。
キーバインディングはまだ何も分からんので、慣れていくしかありません😇

これで設定すると。。。あれ？
エラーが発生しましたね
``` zsh
Error detected while processing /Users/***/.config/nvim/init.lua:
E5113: Error while calling lua chunk: vim/_editor.lua:0: /Users/***/.config/nvim/init.lua..nvim_exec2() called
at /Users/***/.config/nvim/init.lua:0: Vim(packadd):E919: Directory not found in 'packpath': "pack/*/opt/packer
.nvim"
```

エラー文を見ると、`packpath`が見つからなかった模様。
そういえば、`packer.nvim`というものを入れてませんでした🙄

解決しましょう！
1. `packer.nvim`のインストールコマンドをホームディレクトリで実行
    ``` zsh
    git clone --depth 1 https://github.com/wbthomason/packer.nvim \
     ~/.local/share/nvim/site/pack/packer/start/packer.nvim
    ```
1. `init.lua`にパックパスの設定を追加（packer.nvimのインストールの上らへんに）
    ``` init.lua
    -- パックパスの設定
    vim.cmd [[set packpath+=~/.local/share/nvim/site]]
    ```
1. Neovimを再起動して、neovim内で`:PackerSync`コマンドを実行

これで、プラグインがインストールされました！
でも、また違うエラーが出ますね。。。
``` zsh
Error detected while processing /Users/***/.config/nvim/init.lua:
E5113: Error while calling lua chunk: vim/_editor.lua:0: /Users/***/.
config/nvim/init.lua..nvim_exec2() called at /Users/***/.config/nvim/
init.lua:0: Vim(colorscheme):E185: Cannot find color scheme 'gruvbox'
```

Neovimのテーマに設定した`gruvbox`がインストールされてませんでした。😇
これは`packer.nvim`を使用してインストールしちゃいましょう！

``` init.lua
require('packer').startup(function()
  use 'wbthomason/packer.nvim' -- packerを管理しているプラグイン
  use 'nvim-treesitter/nvim-treesitter' -- シンタックスハイライト
  use 'neovim/nvim-lspconfig' -- LSPの設定
  use 'hrsh7th/nvim-cmp' -- 自動補完プラグイン
  use 'L3MON4D3/LuaSnip' -- スニペットエンジン
  use 'nvim-lua/plenary.nvim' -- 多目的ユーティリティ
  use 'nvim-telescope/telescope.nvim' -- ファジーファインダー
  use 'nvim-lualine/lualine.nvim' -- ステータスライン
  use 'kyazdani42/nvim-tree.lua' -- ファイルエクスプローラー
  use 'akinsho/bufferline.nvim' -- バッファライン
  --------- 以下の1行を追加 ---------
  use 'morhetz/gruvbox' -- gruvboxカラースキーム
end)
```

そして、先ほどと同じように再起動して`:PackerSync`を実行します！

すると。。。
![スクリーンショット 2024-06-17 21.30.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653241/fd67a4f0-8b5a-7a69-6922-3d8cde35d56f.png)

おお！なんかカッコよくなりましたね！🫣
ですが、画面にも出てる通り相対行番号がわかりにくい！
（`-- vim.cmd("set number")`も消し忘れてました🥹）　

という事で、以下の設定を削除しました。
``` init.lua
-- vim.cmd("set number")

-- 相対行番号を表示
vim.opt.relativenumber = true
```

すると、、、
![スクリーンショット 2024-06-17 21.34.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653241/b1e68c16-2d83-9708-da5e-148c484c52d3.png)

良い感じになりましたね！
まあこれで一旦はある程度形になったと思うので、これで終わろうと思います（一気にやるのは疲れるので）

# おわりに
Neovim始めたかったんですが、いざやってみるとハードル高いですね！
ですが、AIを使って少しづつ勉強していこうと思います！

次回あたりでTypescriptとGoの自動補完まで出来ると良いかなあと思っています。
ここまでご覧いただきありがとうございました！
以上、センリツでした。🤓