logo

アルパカログ

NeoVim使いのためのnvim-lspconfig おすすめキーマッピングの紹介

nvim-lspconfig は、NeoVim で LSP を使うための設定を簡単にしてくれる頼もしいやつです。

README には推奨設定が記載されていて親切ですが、キーマッピングが多すぎてよくわからないという人もいるかもしれません。

そこでこの記事では、nvim-lspconfig のキーマッピングのうち、筆者が独断と偏見で選んだ機能をスクショを交えながら紹介したいと思います。

必要環境は NeoVim 0.7 以上

2022年6月16日現在、nvim-lspconfig で必要な NeoVim のバージョンは 0.7 になっているので、お使いのバージョンをご確認の上 0.7 未満の方は上げておいてください。

Homebrew を使ってインストールしている場合は下記のコマンドでバージョンアップできます。

brew upgrade neovim
おすすめキーマッピング

公式の推奨設定はリポジトリの Suggested configuration に記載されています。

そのうち、筆者のおすすめはキーマッピングは下記です。

-- Mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
local opts = { noremap=true, silent=true }
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)

-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local on_attach = function(client, bufnr)
  -- Mappings.
  -- See `:help vim.lsp.*` for documentation on any of the below functions
  local bufopts = { noremap=true, silent=true, buffer=bufnr }
  vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
  vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
  vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
  vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
  vim.keymap.set('n', '<space>f', vim.lsp.buf.formatting, bufopts)
end

上から順に紹介していきたいと思います。

設定ファイル全体は下記からご覧ください。

警告・エラーメッセージの表示(Diagnostic)

Diagnostic は、LSP サーバーなど外部システムから受け取った警告やエラーメッセージを表示する機能です。

メッセージは行末に表示されますが、1行の文字数が多かったり、ウィンドウを分割していたりすると画像のように見切れて全文が読めないということが起こります。

画像が読み込まれない場合はページを更新してみてください。
警告が見切れて読めない

そこで、警告のある行でキーマッピングに設定した <space>e を入力するとメッセージがフロートで表示されます。

これなら見切れずに読むことができます。

画像が読み込まれない場合はページを更新してみてください。
<space>e で見切れず診断が表示された

また、]d で次の診断へ、 [d で前の診断へ移動できます。警告のある箇所を素早く移動できるので、デバッグのときに重宝しますね。

ヒントの表示(hover)

プログラムを書いているとき、「このメソッドの引数と戻り値はなんだっけ?」となることがあると思います。

そんなときにはメソッドにカーソルを合わせて、キーマッピングに設定した K を入力するとヒントを見ることができます。

定義されている箇所をわざわざ見に行かなくて良いので便利ですね。

画像が読み込まれない場合はページを更新してみてください。
メソッドの引数や戻り値が知りたいときに便利だ
定義ジャンプ・実装ジャンプ

メソッドの引数と戻り値を hover で調べても、実装がどうなっているか読みたいときがあります。

そんなときはキーマッピングに設定した定義ジャンプ gd と実装ジャンプ gi を使います。

画像が読み込まれない場合はページを更新してみてください。
カーソルを合わせて gd
画像が読み込まれない場合はページを更新してみてください。
メソッドの定義箇所にジャンプできる

定義ジャンプと実装ジャンプを区別して使う必要があるのは、インターフェースを使っているケースでしょう。

インターフェースを使っていない場合は、両者とも定義箇所にジャンプするので、特に気にする必要はなさそうです。

ジャンプすると現在のバッファが切り替わってしまうので、後述の「おまけ: バッファ移動」のキーマッピングも合わせて設定してみてください。

ℹ️
インターフェースについて詳しく知りたい方は Goにおける「依存性逆転の原則」に関するメモ をご覧ください。
参照箇所の一覧とジャンプ

メソッドやクラス、型やインターフェースがどこから参照(リファレンス)されているか調べたいケースもよくあると思います。

そんなときはキーマッピングに設定した gr を入力すると、参照箇所が一覧で表示されます。

画像が読み込まれない場合はページを更新してみてください。
gr で参照箇所が一覧表示される

カーソルを合わせて決定するとジャンプすることができます。

コードの整形(フォーマット)

インデントのずれやスペースの漏れなど、プログラミングにおいて本質的でない問題はツールに任せてしまいましょう。

<space>f を入力するだけで自動でフォーマットしてくれます。

画像が読み込まれない場合はページを更新してみてください。
if の後ろにスペースが抜けているが・・・
画像が読み込まれない場合はページを更新してみてください。
適当な場所で <space>f を入力すればOK
おまけ1: バッファ移動

下記のキーマッピングを登録しておくとバッファの一覧と移動が素早くできるのでおすすめです。

わかりにくいですが :buf の後ろにスペースが入っています。

map <C-H> :ls<CR>:buf

使い方は Ctrl+H を入力して移動したいバッファの番号を入力するだけです(キー割り当てはお好みで変更してください)。

画像が読み込まれない場合はページを更新してみてください。
移動したいバッファに素早く移動できる

このキーマッピングはブログ記事 vimのバッファ操作 で知ったものです。

また、1つ前や次のバッファに移動するキーマッピングもおすすめです。

map <C-J> :bnext<CR>
map <C-K> :bprev<CR>
おまけ2: 定義ジャンプを分割で開く

定義ジャンプを画面分割で開くためには次のようにします。

vim.keymap.set('n', 'gd<Space>', ':split | lua vim.lsp.buf.definition()<CR>', bufopts)
vim.keymap.set('n', 'gd<CR>', ':vsplit | lua vim.lsp.buf.definition()<CR>', bufopts)

以上です。

この記事では、nvim-lspconfig のキーマッピングのうち、筆者が独断と偏見で選んだ機能をスクショを交えながら紹介しました。

皆さま良いプログラミングライフを!