Neovim 初心者向け設定ガイド

Neovim の設定方法をメモ。
オプション設定、キーマッピング, プラグインの管理方法などを解説。

# 設定ファイル
Neovim のカスタマイズは、設定ファイル(`init.vim`, または `init.lua`)を編集することで行う。

Neovim 0.5 以降では、Luaを用いた設定方法が推奨されている。Luaは実行速度が速く、柔軟性が高いため。

### 設定ファイルの位置
```
~/.config/nvim/init.lua
```

# ファイル構成
LuaでNeovimの設定を書く場合、異なる設定を別々のファイルに分けて管理する。

ex)
```
~/.config/nvim/
├── init.lua
└── lua/
    ├── keymaps.lua
    ├── options.lua
    ├── plugins.lua
```

### init.luaの設定
`init.lua`は、他の設定ファイルをロードするためのエントリーポイントとして機能する。
例えばこんな感じ

```lua
-- 基本オプションの設定
require('options')

-- キーマップの設定
require('keymaps')

-- プラグインの設定
require('plugins')

-- 各種セットアップ（例：Tree-sitter, LSPなど）
require('setup.treesitter')
require('setup.lspconfig')
```

### 各設定ファイルの例

#### options.lua（基本オプション設定）:
```lua
local opt = vim.opt

-- 行番号の表示
opt.number = true
opt.relativenumber = true

-- タブとインデントの設定
opt.tabstop = 4
opt.shiftwidth = 4
opt.expandtab = true

-- 検索設定
opt.ignorecase = true
opt.smartcase = true
```

#### keymaps.lua（キーマッピング設定）:

```lua
local map = vim.api.nvim_set_keymap
local opts = { noremap = true, silent = true }

-- ノーマルモードでのキーマップ
map('n', '<leader>ff', '<cmd>Telescope find_files<cr>', opts)
map('n', '<leader>fg', '<cmd>Telescope live_grep<cr>', opts)
```

#### plugins.lua（プラグイン管理設定、packer.nvimを使用）:

```lua
return require('packer').startup(function()
    use 'wbthomason/packer.nvim' -- Packer 自体のインストール
    use 'nvim-treesitter/nvim-treesitter' -- Treesitter
    use {
        'neoclide/coc.nvim', branch = 'release'
    }
    -- 他のプラグイン
end)
```


# vim.opt オプション設定
`vim.opt`は、Vimのオプションを管理するために使用する。

```lua
local opt = vim.opt -- for conciseness

-- 行番号の表示
opt.number = true
```

こんな感じで, optという変数にvim.optを代入してから、設定を記載する書き方が一般的ぽい。

代表的な設定できるオプションは下記

| カテゴリ | オプション | 説明 |
| --- | --- | --- |
| 基本設定 | `number` | 行番号を表示するかどうか。 |
| 基本設定 | `relativenumber` | 現在の行からの相対行番号を表示するかどうか。 |
| 基本設定 | `tabstop` | タブの表示幅。 |
| 基本設定 | `softtabstop` | ソフトタブの幅。 |
| 基本設定 | `shiftwidth` | インデントの幅。 |
| 基本設定 | `expandtab` | タブをスペースに展開するかどうか。 |
| 基本設定 | `smartindent` | 自動インデントを使用するかどうか。 |
| 基本設定 | `autoindent` | 新しい行を現在の行のインデントと同じにする。 |
| 基本設定 | `smartcase` | 検索時に大文字が含まれる場合のみ大文字と小文字を区別する。 |
| 基本設定 | `ignorecase` | 検索時に大文字と小文字を区別しない。 |
| 基本設定 | `wrap` | 長い行を画面端で折り返すかどうか。 |
| 基本設定 | `linebreak` | 単語単位での折り返しを行うかどうか。 |
| ビジュアル設定 | `cursorline` | 現在の行にハイライトを表示するかどうか。 |
| ビジュアル設定 | `cursorcolumn` | 現在の列にハイライトを表示するかどうか。 |
| ビジュアル設定 | `background` | 色のテーマが明るいか暗いかを設定。 |
| ビジュアル設定 | `showmode` | モードを画面下に表示するかどうか。 |
| ビジュアル設定 | `showcmd` | コマンドを入力中に画面下に表示するかどうか。 |
| 検索設定 | `hlsearch` | 検索結果をハイライト表示するかどうか。 |
| 検索設定 | `incsearch` | 検索語を入力中に部分的に一致する位置をハイライト表示するかどうか。 |
| ファイル処理設定 | `backup` | ファイルを保存する際にバックアップを取るかどうか。 |
| ファイル処理設定 | `writebackup` | 書き込み中に一時的なバックアップを取るかどうか。 |
| ファイル処理設定 | `swapfile` | スワップファイルを使用するかどうか。 |
| ファイル処理設定 | `undofile` | アンドゥ情報をファイルに保存するかどうか。 |
| ファイル処理設定 | `autoread` | ファイルが外部で変更された場合に自動的に読み直すかどうか。 |
| その他 | `mouse` | マウスのサポートを有効にする。 |
| その他 | `clipboard` | クリップボードの使用設定。 |
| その他 | `spell` | スペルチェックを有効にするかどうか。 |
| その他 | `spelllang` | スペルチェックの言語設定。 |


# Packerについて
`packer.nvim`はNeovim用のプラグインマネージャーで、luaで書かれている。
https://github.com/wbthomason/packer.nvim

### 特徴
1. 非同期インストール
2. 遅延ローディング
3. 依存関係の管理
4. プラグインの管理
5. 管理のカスタマイズ

### 基本的な使用方法
#### インストール
```bash
git clone --depth 1 https://github.com/wbthomason/packer.nvim\
 ~/.local/share/nvim/site/pack/packer/start/packer.nvim
 ```
 
 ` ~/.local/share/nvim/site/pack/packer/start/packer.nvim`にインストールされる。
 
 
 ### 設定
 今回はプラグイン設定用のluaファイルを用意する。
 

```lua:~/.config/nvim/init.lua
require('plugins')
```


 ```lua:~/.config/nvim/lua/plugins.lua
-- packer.nvim を使用するための設定
return require('packer').startup(function(use)
    use 'wbthomason/packer.nvim'  -- Packer 自体を管理
    use 'neovim/nvim-lspconfig'   -- LSP 設定用プラグイン
    use 'nvim-treesitter/nvim-treesitter'  -- Treesitter プラグイン

    -- その他のプラグイン
    use {
        'hrsh7th/nvim-cmp',  -- 補完エンジン
        requires = {
            'hrsh7th/cmp-nvim-lsp',  -- LSP 補完用
            'hrsh7th/cmp-buffer',    -- バッファ補完用
            'hrsh7th/cmp-path'       -- パス補完用
        }
    }

    -- プラグインの設定が必要な場合はここに記述
end)
```
 
 ### Packerコマンド
 | コマンド         | 説明                                                                                                                                  |
 | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
 | `:PackerInstall` | まだインストールされていないプラグインをインストールします。                                                                          |
 | `:PackerUpdate`  | インストールされているすべてのプラグインを最新のバージョンに更新します。                                                              |
 | `:PackerSync`    | すべてのプラグインをインストール（または更新）し、必要に応じて削除します。基本的に `PackerUpdate` と `PackerClean` を一度に行います。 |
 | `:PackerClean`   | もはや設定ファイルに記述されていないプラグインを削除します。                                                                          |


# キーマッピング
キーマップをカスタマイズすることで、より効率的に作業を進められるようになる。

```lua:~/.config/nvim/lua/keymaps.lua
local map = vim.api.nvim_set_keymap

-- ノーマルモードでのキーマップ
map('n', '<leader>ff', '<cmd>Telescope find_files<cr>', opts)
map('n', '<leader>fg', '<cmd>Telescope live_grep<cr>', opts)
```
### map(vim.api.nvim_set_keymap)の引数について
- 第1引数は**モード**
- 第2引数は**マッピングされるキーシーケンス**
- 第3引数は**実行されるコマンド**

### モード
第1引数に設定できるモードの種類

| モード | 説明                                                                                   |
|--------|----------------------------------------------------------------------------------------|
| `n`    | ノーマルモード (Normal mode)：通常のテキスト編集やコマンド入力が行われるデフォルトのモード。 |
| `i`    | インサートモード (Insert mode)：テキストを直接入力するモード。                           |
| `v`    | ビジュアルモード (Visual mode)：テキストの選択と操作を行うモード。                       |
| `x`    | ビジュアルモード (Visual mode) の一種で、ブロック選択が可能。                            |
| `s`    | セレクトモード (Select mode)：マウス操作や特定の機能によるテキスト選択が行われるモード。 |
| `o`    | オペレーターペンディングモード (Operator-pending mode)：オペレータの対象範囲を待機する状態。  |
| `t`    | 端末モード (Terminal mode)：端末エミュレータとして使用されるモード。                       |
| `c`    | コマンドラインモード (Command-line mode)：コマンドを入力するモード。                     |

### 特別なキー表記
第2引数に指定するキーシーケンスで、`<leader>`とか、`<C-a>`などの特別なキー表記について

| キー表記      | 説明                                                                                   |
|--------------|----------------------------------------------------------------------------------------|
| `<leader>`   | ユーザー定義のプレフィックスキー。デフォルトは `\`。カスタムショートカットのために用いられる。 |
| `<C-a>`      | Ctrlキーと 'a' キーの同時押し。特定のアクションを実行するためのコントロールキーコンビネーション。   |
| `<C-b>`      | Ctrlキーと 'b' キーの同時押し。                                                        |
| `<C-c>`      | Ctrlキーと 'c' キーの同時押し。通常、操作を中断するのに用いられる。                       |
| `<CR>`       | エンターキー（Carriage Return）。コマンドを実行する際に使われる。                       |
| `<Esc>`      | エスケープキー。モードを切り替えたり、現在の操作を中断するのに用いられる。               |
| `<Tab>`      | タブキー。入力中にアイテム間を移動するのに使われることが多い。                         |
| `<S-...>`    | Shiftキーと他のキーの組み合わせ。例: `<S-Tab>` はShiftキーとTabキーの組み合わせ。        |
| `<F1> - <F12>` | F1からF12までのファンクションキー。様々な編集機能やヘルプ表示に割り当てられることが多い。 |

#### leaderキー
`<leader>`キーのデフォルトはバックスラッシュ`\`。

leaderキーは、ユーザーが定義するプレフィックスキーで、独自のショートカットを指定する時に使われる。とても便利なので使いこなしたいところ

leaderキーはカスタマイズすることができる

```lua
-- リーダーキーをスペースキーに設定
vim.g.mapleader = ' '
-- あるいはカンマ
vim.g.mapleader = ','
```

```lua
-- <leader>e でファイルエクスプローラーを開く
vim.api.nvim_set_keymap('n', '<leader>e', ':Ex<CR>', { noremap = true, silent = true })

-- <leader>f でファイルを検索するコマンドを実行
vim.api.nvim_set_keymap('n', '<leader>f', ':Telescope find_files<CR>', { noremap = true, silent = true })

```

※leaderキーの設定は他のキーマピングが行われる前に定義する必要がある。
※noremapオプションを指定することで、意図しない再マッピングを防ぐ。

# まとめ
vim をカスタマイズするとき、いつも参考動画をそのまま真似るだけだった。基本的なところを理解することで、設定内容が見えるようになる。マジ基本大事