はじめに
世の中は猫も杓子も VSCode。新入社員に hjkl のキー移動を叩き込むなどという謎の修行を課すという光景もめっきり見なくなりました。しかしおじの両手に染み付いた Vim のキー操作はもはや取り去ることはできず、VSCode に移行しようと試みてはやれタブ移動が面倒だとか Vim エミュレーションの動きが気に食わないなどの理由から Vim に出戻りをするということを繰り返してきました。さながらスト6でパッドでモダン操作に入門しようとするが一向に手がなじまず「やっぱり棒だよね」とアケコンを愛でる格ゲーマーのよう。(スト6楽しいですよね)
どうも、Vimmerです。最近、約3年ぶりに Neovim の設定を見直しました。今までは coc.nvim を使っていたのですが、最近の Neovim 界隈では Neovim 組み込みの LSP 機能を使ったプラグインが主流になってきており、だいぶ世の中から取り残されている感が出てきたのでプラグインを全て見直しました。本記事では、今回新たに導入した主要なプラグインについて簡単に紹介して行きたいと思います。
Plugins
nvim-telescope/telescope.nvim
所謂Fuzzy Finder。ファイルやバッファー、クイックフィックスなど、様々なソースから情報を検索するUIを提供する。
nvim-telescope/telescope-fzf-native.nvim
Telescope の sorter として fzf を使うためのプラグイン。
lukas-reineke/indent-blankline.nvim
Neovim 上でインデント表示を実現する。今まで使っていた Yggdroot/indentLine
とは異なり conceal
を使っていないので、JSONファイルでダブルクォートの表示とインデント表示を両立できる。
nvim-lualine/lualine.nvim
Status Line 系。vim-airline/vim-airline から移行。
nvim-treesitter/nvim-treesitter
言語Parser tree-sitter をNeovimで使うためのプラグイン。VimでのSyntaxハイライトは正規表現などを駆使した条件式で実現されているが、TSX (TypeScript + JSX) に完全に対応したものが無く、しばしばハイライトやインデント制御が正常に機能しない場面に遭遇することがあった。本プラグインを使うことでようやく TSX ファイルをストレスなく編集できるように。
windwp/nvim-ts-autotag
nvim-treesitter の拡張プラグイン。HTMLタグの閉じタグ補完のために必要。
公式READMEから引用。
Before Input After
------------------------------------
<div > <div></div>
<div></div> ciwspan<esc> <span></span>
------------------------------------
anuvyklack/pretty-fold.nvim
Vim の見づらい質素な折り畳み表現をリッチにしてくれるプラグイン。
anuvyklack/fold-preview.nvim
折り畳みを開かずにPreview表示。
norcalli/nvim-colorizer.lua
"#123", "rgb()" などの色表現テキストに色付け。
phaazon/hop.nvim
EasyMotion のNeovim実装。画面上の任意の位置にジャンプ。
*: これを書いている最中に気が付きましたが、どうやらこちらのプロジェクトは Deprecated になってしまっている模様。継続利用したい場合は smoka7/hop.nvim を使ってくださいとのこと。
karb94/neoscroll.nvim
スクロールアニメーションプラグイン。デフォルト設定はスクロール速度が遅いのと、<C-y>
<C-e>
の挙動がおかしかったので次のように設定変更。
require('neoscroll').setup({
-- Disable <C-e>, <C-y> because I faced a performance issue in a small
-- window.
mappings = { '<C-u>', '<C-d>', '<C-b>', '<C-f>' }
})
local t = {}
t['<C-u>'] = { 'scroll', { '-vim.wo.scroll', 'true', '125' } }
t['<C-d>'] = { 'scroll', { 'vim.wo.scroll', 'true', '125' } }
t['<C-b>'] = { 'scroll', { '-vim.api.nvim_win_get_height(0)', 'true', '250' } }
t['<C-f>'] = { 'scroll', { 'vim.api.nvim_win_get_height(0)', 'true', '250' } }
require('neoscroll.config').set_mappings(t)
kylechui/nvim-surround
古くからお世話になっている vim-surround の Neovim 用実装。"foo"
を 'foo'
や (foo)
のように囲み文字を置換する。treesitter と連携することでより便利になるらしいが、まだ使いこなせていない。
numToStr/Comment.nvim
コメント/アンコメントのトグル。
windwp/nvim-autopairs
{}
, ()
, ""
などのペア文字入力補完。
公式READMEより引用。
Before Input After
------------------------------------
{|} <CR> {
|
}
------------------------------------
neovim/nvim-lspconfig
Neovim の LSP 設定を簡素化するためのプラグイン。詳しくはこちらを参照。
williamboman/mason.nvim
nvim-lspconfig は LSP の設定を簡単にしてくれるが、Language Server のインストールまでは面倒を見てくれない。Mason を使うことで、各種 Language Server をグラフィカルに、簡単にインストールできる。
hrsh7th/nvim-cmp
LSP、バッファファイルパスなど、様々なソースから入力補完を実現するプラグイン。とりあえず推奨設定に従っておけばよい。デフォルトで提供される Linter/Formatter はこちらで参照可能。
creativenull/efmls-configs-nvim
様々な Linter、Formatter を Neovim に LSP server として組み込むプラグイン。主に ESLint と Pretter のために使用。
nvim-tree/nvim-tree.lua
所謂ファイルエクスプローラー。デフォルトで直感的なキーマッピングが設定されていて使いやすい。<leader>ee
で現在開いているファイル位置を表示するよう設定。
init = function()
vim.keymap.set('n',
'<leader>ee',
function() vim.cmd("NvimTreeFindFileToggle") end
)
end
antosha417/nvim-lsp-file-operations
nvim-tree.lua でファイル名変更などをしたときに、そのファイルを import しているファイルのパス指定部分を自動的に更新。
coc.nvim からの移行で困ったことと、その対処
Format on Save
現状、Format on Save 機能を提供しているプラグインが存在しない模様。調べたところ、自前で Autocommand を設定することで実現できるらしい。
Format してほしくないこともたまにあるので、グローバル変数で無効化できるようにちょっと変更。
vim.g.format_on_save = 1
vim.api.nvim_create_autocmd("BufWritePre", {
group = vim.api.nvim_create_augroup('FormatOnSave', {}),
callback = function()
if vim.g.format_on_save == 1 then
vim.lsp.buf.format { async = false }
end
end
})
TypeScript での ファイル名変更や import 補完
coc における CocActionAsync('runCommand', 'editor.action.organizeImport')
, coc-rename
に相当するコマンドがない。これも自前で定義することで解決。
local function organize_imports()
local params = {
command = "_typescript.organizeImports",
arguments = { vim.api.nvim_buf_get_name(0) },
title = ""
}
vim.lsp.buf.execute_command(params)
end
local lspconfig = require('lspconfig')
lspconfig.tsserver.setup {
capabilities = capabilities,
commands = {
OrganizeImports = {
organize_imports,
description = "Organize Imports"
},
RenameFile = {
rename_file,
description = "Rename File"
},
}
}
rename_file
の方は長いので以下を参照。organize_imports
もどこかに載っていたものだと思いますが、詳細は失念。
最後に
今回紹介したプラグインを一新したことで大分 Neovim 環境のモダン化ができたと思います。VSCode と違っていろいろと複雑な設定を書かなければいけないし、新しいプラグインのトレンドについていくにも痛みが伴いますが、その分、自分にとって快適な環境が作れますし、なにより、ほぼほぼキーボードだけで操作が完結するスピード感はやはり強みだなと感じます。また、設定ファイルの複雑さに関しても、今回 lua で書き直したことで、だいぶ解消したかなと思います。
本記事があなたの Neovim 環境改善の一助となることを祈って。
以上。