LoginSignup
8
6

2024年に向けてお世話になりたい Neovim プラグイン

Last updated at Posted at 2023-11-29

はじめに

世の中は猫も杓子も VSCode。新入社員に hjkl のキー移動を叩き込むなどという謎の修行を課すという光景もめっきり見なくなりました。しかしおじの両手に染み付いた Vim のキー操作はもはや取り去ることはできず、VSCode に移行しようと試みてはやれタブ移動が面倒だとか Vim エミュレーションの動きが気に食わないなどの理由から Vim に出戻りをするということを繰り返してきました。さながらスト6でパッドでモダン操作に入門しようとするが一向に手がなじまず「やっぱり棒だよね」とアケコンを愛でる格ゲーマーのよう。(スト6楽しいですよね)

どうも、Vimmerです。最近、約3年ぶりに Neovim の設定を見直しました。今までは coc.nvim を使っていたのですが、最近の Neovim 界隈では Neovim 組み込みの LSP 機能を使ったプラグインが主流になってきており、だいぶ世の中から取り残されている感が出てきたのでプラグインを全て見直しました。本記事では、今回新たに導入した主要なプラグインについて簡単に紹介して行きたいと思います。

Plugins

nvim-telescope/telescope.nvim

所謂Fuzzy Finder。ファイルやバッファー、クイックフィックスなど、様々なソースから情報を検索するUIを提供する。

image.png

nvim-telescope/telescope-fzf-native.nvim

Telescope の sorter として fzf を使うためのプラグイン。

lukas-reineke/indent-blankline.nvim

Neovim 上でインデント表示を実現する。今まで使っていた Yggdroot/indentLine とは異なり conceal を使っていないので、JSONファイルでダブルクォートの表示とインデント表示を両立できる。

image.png

nvim-lualine/lualine.nvim

Status Line 系。vim-airline/vim-airline から移行。

image.png

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 の見づらい質素な折り畳み表現をリッチにしてくれるプラグイン。

image.png

anuvyklack/fold-preview.nvim

折り畳みを開かずにPreview表示。

image.png

norcalli/nvim-colorizer.lua

"#123", "rgb()" などの色表現テキストに色付け。

image.png

phaazon/hop.nvim

EasyMotion のNeovim実装。画面上の任意の位置にジャンプ。

image.png

*: これを書いている最中に気が付きましたが、どうやらこちらのプロジェクトは 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 をグラフィカルに、簡単にインストールできる。

image.png

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

image.png

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 環境改善の一助となることを祈って。

以上。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6