Neovimのプラグインでよく使うキーマップ一覧

## はじめに

Neovimのプラグインで私がよく使うキーマップを紹介します。

Vim版は [こちら](https://qiita.com/uhooi/items/bce2b88bd095f0044b46) です。

## 環境

- macOS: Ventura 13.5.2（22G91）
- Neovim: v0.10.0-dev-1336+g9c2270b83

## 注意

- 表の見やすさを優先して `noremap` を省略している
  - 実際に設定するときは [私のdotfiles](https://github.com/uhooi/dotfiles) が参考になるはず
- 「カスタマイズ」は私が使いやすいように変更している
- 私は `<Leader>` を `,` にしている
- わからない説明は先頭に「（？）」を付けている

## Neovimのプラグインでよく使うキーマップ一覧

Neovimのプラグインでよく使うキーマップの一覧です。

### ノーマル

ノーマルモード（ `n` ）でよく使うキーマップの一覧です。

#### nvim-treesitter-context

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|前方のコンテキストにジャンプする|`function() require('treesitter-context').go_to_context() end`|`[c`|context|

#### Todo Comments

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|後方のキーワードにジャンプする|`function() todo_comments.jump_next { keywords = { 'FIXME', 'TODO' } } end`|`]t`|todo|
|前方のキーワードにジャンプする|`function() todo_comments.jump_prev { keywords = { 'FIXME', 'TODO' } } end`|`[t`|todo|

#### LSP

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|次の指摘へ進む|`vim.diagnostic.goto_next`|`g]`||
|前の指摘へ戻る|`vim.diagnostic.goto_prev`|`g[`||
|指摘を一覧表示する|`vim.diagnostic.setloclist`|`gl`||
|（？）宣言へジャンプする|`vim.lsp.buf.declaration`|`gD`||
|定義へジャンプする|`vim.lsp.buf.definition`|`gd`||
|情報を表示する|`vim.lsp.buf.hover`|`K`||
|（？）実装へジャンプする|`vim.lsp.buf.implementation`|`gi`||
|（？）シグニチャのヘルプを表示する|`vim.lsp.buf.signature_help`|`<C-k>`||
|ワークスペースに現在のフォルダを追加する|`vim.lsp.buf.add_workspace_folder`|`gwa`||
|ワークスペースから現在のフォルダを取り除く|`vim.lsp.buf.remove_workspace_folder`|`gwr`||
|ワークスペースを出力する|`function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end`|`gwl`||
|型の定義へジャンプする|`vim.lsp.buf.type_definition`|`gt`||
|リネームする|`vim.lsp.buf.rename`|`gn`||
|指摘に対するアクションの候補を表示する|`vim.lsp.buf.code_action`|`ga`||
|参照している箇所を一覧表示する|`vim.lsp.buf.references`|`gr`||
|ファイル全体をフォーマットする|`function() vim.lsp.buf.format { async = true } end`|`gf`||
|インレイヒントの表示を切り替える|`function() vim.lsp.buf.inlay_hint(bufnr) end`|`gh`|hints|
|バーチャルラインの表示を切り替える|`function() local new_config = not vim.diagnostic.config().virtual_lines vim.diagnostic.config { virtual_lines = new_config } end`|`gK`||

LSP関連のキーマップはほぼ `g` をプリフィックスにしています。

Neovim 0.8.0から `vim.lsp.buf.formatting` が非推奨になったので、代わりに `vim.lsp.buf.format { async = true }` を使っています。

参考

- https://zenn.dev/botamotch/articles/21073d78bc68bf

#### lsp-lens.nvim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|表示を切り替える|`<Cmd>LspLensToggle<CR>`|`gs`||


#### telescope

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|Gitリポジトリ内のファイルを検索する|`require('telescope.builtin').git_files`|`<Leader>F` （ `,F` ）|find|
|グレップする|`require('telescope').extensions.egrepify.egrepify`|`<Leader>f` （ `,f` ）|find|
|カーソル下の単語でグレップする|`require('telescope.builtin').grep_string`|`<Leader>G` （ `,G` ）|grep|
|バッファを検索する|`require('telescope.builtin').buffers`|`<Leader>b` （ `,b` ）|buffers|
|過去に開いたファイルを検索する|`require('telescope').extensions.frecency.frecency`|`<Leader>r` （ `,r` ）|recently|
|コマンド履歴を検索する|`require('telescope.builtin').command_history`|`<Leader>hc` （ `,hc` ）|history command|
|検索履歴を検索する|`require('telescope.builtin').search_history`|`<Leader>hs` （ `,hs` ）|history search|
|ヘルプを検索する|`require('telescope.builtin').help_tags`|`<Leader>H` （ `,H` ）|help|
|通知の履歴を検索する|`<Cmd>Telescope notify<CR>`|`<Leader>n` （ `,n` ）|notify|
|Gitのコミット履歴を検索する|`require('telescope.builtin').git_commits`|`<Leader>gc` （ `,gc` ）|git commits|
|バッファのGitのコミット履歴を検索する|`require('telescope.builtin').git_bcommits`|`<Leader>gf` （ `,gf` ）|git file|
|Gitのブランチを検索する|`require('telescope.builtin').git_branches`|`<Leader>gb` （ `,gb` ）|git branches|
|Gitのステータスを検索する|`require('telescope.builtin').git_status`|`<Leader>gs` （ `,gs` ）|git status|
|Gitのスタッシュを検索する|`require('telescope.builtin').git_stash`|`<Leader>gt` （ `,gt` ）|git stash|
|ghqで管理しているリポジトリを検索する|`<Cmd>Telescope ghq list<CR>`|`<Leader>gl` （ `,gl` ）|ghq list|
|追加できるimport文を検索する|`<Cmd>Telescope import<CR>`|`<Leader>i` （ `,i` ）|import|

telescopeのファジーファインダー（あいまい検索）はよく使うので、かんたんなキーマップにしています。

#### ssr.nvim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|ストラクチュアルサーチする|`require('ssr').open`|`<Leader>sr` （ `,sr` ）|structual search and replace|

#### text-case.nvim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|カーソル下の単語の変換するケースを検索する|`<Cmd>TextCaseOpenTelescope<CR>`|`cr.`||
|カーソル下の単語をアッパーケースに変換する|`require('textcase').current_word('to_upper_case')`|`cru`|upper case|
|カーソル下の単語をローワーケースに変換する|`require('textcase').current_word('to_lower_case')`|`crl`|lower case|
|カーソル下の単語をスネークケースに変換する|`require('textcase').current_word('to_snake_case')`|`crs`|snake case|
|カーソル下の単語をダッシュケースに変換する|`require('textcase').current_word('to_dash_case')`|`crd`|dash case|
|カーソル下の単語をコンスタントケースに変換する|`require('textcase').current_word('to_constant_case')`|`crn`|constant case|
|カーソル下の単語をキャメルケースに変換する|`require('textcase').current_word('to_camel_case')`|`crc`|camel case|
|カーソル下の単語をパスカルケースに変換する|`require('textcase').current_word('to_pascal_case')`|`crp`|pascal case|
|カーソル下の単語をすべてアッパーケースに変換する|`require('textcase').lsp_rename('to_upper_case')`|`crU`|upper case|
|カーソル下の単語をすべてローワーケースに変換する|`require('textcase').lsp_rename('to_lower_case')`|`crL`|lower case|
|カーソル下の単語をすべてスネークケースに変換する|`require('textcase').lsp_rename('to_snake_case')`|`crS`|snake case|
|カーソル下の単語をすべてダッシュケースに変換する|`require('textcase').lsp_rename('to_dash_case')`|`crD`|dash case|
|カーソル下の単語をすべてコンスタントケースに変換する|`require('textcase').lsp_rename('to_constant_case')`|`crN`|constant case|
|カーソル下の単語をすべてキャメルケースに変換する|`require('textcase').lsp_rename('to_camel_case')`|`crC`|camel case|
|カーソル下の単語をすべてパスカルケースに変換する|`require('textcase').lsp_rename('to_pascal_case')`|`crP`|pascal case|

#### gitlinker.nvim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|対象行のGitリポジトリをWebブラウザで開く|`require('gitlinker.actions').open_in_browser`|`<Leader>go` （ `,go` ）|git open in browser|

#### dropbar.nvim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|ピックモードに入る|`require('dropbar.api').pick`|`<Leader>p` （ `,p` ）|pick|

#### symbols-outline.nvim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|シンボルアウトラインの表示を切り替える|`<Cmd>SymbolsOutline<CR>`|`<Leader>s` （ `,so` ）|symbols outline|

#### git-conflict.nvim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|自分の変更を適用する|`co`|-|`<Cmd>GitConflictChooseOurs<CR>`|
|相手の変更を適用する|`ct`|-|`<Cmd>GitConflictChooseTheirs<CR>`|
|変更を両方とも適用する|`cb`|-|`<Cmd>GitConflictChooseBoth<CR>`|
|変更を両方とも適用しない|`c0`|-|`<Cmd>GitConflictChooseNone<CR>`|
|次の競合へジャンプする|`[x`|-|`<Cmd>GitConflictNextConflict<CR>`|
|前の競合へジャンプする|`]x`|-|`<Cmd>GitConflictPrevConflict<CR>`|

#### ugaterm

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|ターミナルの表示を切り替える|`<Cmd>UgatermToggle<CR>`|`<Leader>t` （ `,t` ）|terminal|

#### peek.nvim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|WebViewでプレビューを開く|`require('peek').open`|`<C-p>`|preview|

### 挿入

挿入モード（ `i` ）でよく使うキーマップの一覧です。

#### nvim-cmp

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|前の候補に移動する|`<Down>`|-||
|前の候補に移動する|`<C-p>`|-|previous|
|前の候補に移動する|-|`<S-Tab>`||
|次の候補に移動する|`<Up>`|-||
|次の候補に移動する|`<C-n>`|-|next|
|次の候補に移動する|-|`<Tab>`||
|（？）候補を4つ前にスクロールする|-|`<C-b>`|back、なぜか効かない|
|（？）候補を4つ後ろにスクロールする|-|`<C-f>`|forward、なぜか効かない|
|（？）補完を確定する|-|`<C-l>`|completion、なぜか効かない|
|補完を確定する|`<C-y>`|-||
|補完を確定する|-|`<CR>`||
|補完せずに閉じる|`<C-e>`|-|exit|

参考

- https://github.com/hrsh7th/nvim-cmp/blob/f51dc68e1bb170fc49c2d7e13eb45e5ec83f5ee9/lua/cmp/config/mapping.lua#L22-L44

### ビジュアル、選択

ビジュアル、選択モード（ `v` ）でよく使うキーマップの一覧です。

#### gitlinker.nvim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|対象行のGitリポジトリをWebブラウザで開く|`require('gitlinker.actions').open_in_browser`|`<Leader>go` （ `,go` ）|git open in browser|

### ビジュアル

ビジュアルモード（ `x` ）でよく使うキーマップの一覧です。

#### ssr.nvim

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|ストラクチュアルサーチする|`require('ssr').open`|`<Leader>sr` （ `,sr` ）|structual search and replace|

### コマンドライン

コマンドラインモード（ `c` ）でよく使うキーマップの一覧です。

#### nvim-cmp

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|前の候補に移動する|`<C-p>`|-|previous|
|前の候補に移動する|`<S-Tab>`|-||
|次の候補に移動する|`<C-n>`|-|next|
|次の候補に移動する|`<Tab>`|-||
|候補を閉じる|`<C-e>`|-|exit|

参考

- https://github.com/hrsh7th/nvim-cmp/blob/f51dc68e1bb170fc49c2d7e13eb45e5ec83f5ee9/lua/cmp/config/mapping.lua#L46-L93

### 端末ジョブ

端末ジョブモード（ `t` ）でよく使うキーマップの一覧です。

#### ugaterm

|説明|デフォルト|カスタマイズ|備考|
|:--|:--|:--|:--|
|ターミナルの表示を切り替える|`<Cmd>UgatermToggle<CR>`|`<Leader>t` （ `,t` ）|terminal|
|ターミナルを抜ける|`<C-\\><C-n>`|`<Esc>`||

## おわりに

これでNeovimのプラグインをかんたんに呼び出せます :relaxed: