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

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

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

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

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

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

Image in a image block
警告が見切れて読めない

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

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

Image in a image block
<space>e で見切れず診断が表示された

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

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

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

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

Image in a image block
メソッドの引数や戻り値が知りたいときに便利だ

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

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

Image in a image block
カーソルを合わせて gd
Image in a image block
メソッドの定義箇所にジャンプできる

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

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

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

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

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

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

Image in a image block
gr で参照箇所が一覧表示される

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

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

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

Image in a image block
if の後ろにスペースが抜けているが・・・
Image in a image block
適当な場所で <space>f を入力すればOK

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

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

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

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

Image in a image block
移動したいバッファに素早く移動できる

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

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

map <C-J> :bnext<CR>
map <C-K> :bprev<CR>

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

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 のキーマッピングのうち、筆者が独断と偏見で選んだ機能をスクショを交えながら紹介しました。

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

Thank you!
Thank you!
URLをコピーしました

コメントを送る

コメントはブログオーナーのみ閲覧できます