skip to content
私的歌詞倉庫

開発環境.nvim 2023

/ 7 min read

Updated:
Table of Contents

はじめに

GMOペパボEC Advent Calendar 2023 の3日目です。2日目はやんまーくんでした。

https://adventar.org/calendars/8672/embed

最近Web開発が多くなってきたので、Android StudioやXcodeなどのIDEから、Neovim(nvim)に引っ越しました。

ようやく、矢印キーでの移動をやめてhjklで移動するようになった自分が使っているプラグインや設定について紹介したいと思います。

設定たち

先に自分のdotfilesのリポジトリを貼っておきます。この中から紹介します。

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
00K00KMIT
ツールバージョン
nvim0.9.4
iTerm2Build 3.4.22

folke/tokyonight.nvim

https://github.com/folke/tokyonight.nvim

テーマは、tokyonight.nvimを使っています。tokyonightの中にさらにStorm、Night、Moon、Dayの4つがあります。自分は、Stormを使っています。おしゃれでいい感じです。

numToStr/Comment.nvim

https://github.com/numToStr/Comment.nvim

コメントアウトするために使ってます。カーソル行をコメントアウトするときgcc 、範囲選択した行をコメントアウトするときはgc と入力するとコメントアウト出来ます。

folke/noice.nvim

https://github.com/folke/noice.nvim

コマンドを入力するときや、Waring、Errorの表示をポップアップ形式(?)で表示するプラグインです。

コマンドを入力するときのUI

コマンドを入力するときのUI

非常に便利なのですが、LSPなどの起動時のWaringも表示するので、noiceで画面上が埋め尽くされるということがあります。表示するメッセージを絞るfilter機能もあります。こちらを使うことでフィルタリングも出来ます。自分の設定も載せておきます(追加が面倒で最近は設定を諦めました…)。

-- このような関数を作って使いまわしています。
local function ignore_msg(kind, msg)
return {
filter = {
event = "msg_show",
kind = kind,
find = msg,
},
opts = { skip = true },
}
end
require("noice").setup({
routes = {
-- 関数を呼び出して楽に設定できるようになりました。
ignore_msg("", "render_symbol_winbar"),
ignore_msg("lua_error", "CursorMoved"),
ignore_msg("lua_error", "SagaSymbolUpdate"),
},
})

vim-scripts/copypath.vim

https://github.com/vim-scripts/copypath.vim

現在開いているファイルファイル名やパスを取得できるプラグインです。

使い方は簡単で、CopyFileName でファイル名を、CopyFilePathで絶対パスをコピーできます。相対パスはコピーできないのですが、PR自体は立っているので参考(もしくはこのPR元のリポジトリを指定)にすればうまく動きそうです。

https://github.com/vim-scripts/copypath.vim/pull/1

nvimdev/lspsaga.nvim

https://github.com/nvimdev/lspsaga.nvim

Language Server(LS)の結果を表示するUIをかっこよくするプラグインです。

変数の使用箇所を表示している様子

変数の使用箇所を表示している様子

いろんな機能があって、設定のドキュメントも充実しているので初心者の自分にも優しかったです。

HiPhish/rainbow-delimiters.nvim

https://github.com/HiPhish/rainbow-delimiters.nvim

カッコを虹色にするプラグインです。Android Studioで開発をしているときにRainbow Bracketsというプラグインを使っていたので、似たようなプラグインをnvimでも探したところ、これを見つけました。

tpope/vim-rails

https://github.com/tpope/vim-rails

Rails開発をするときに便利なプラグインです。色々機能はあるのですがまだまだ使いこなせていません…ここでは、自分が使っているコマンドの一部を紹介します。以下のコマンドを実行することで、現在開いているファイル名から推測してファイルを開きます。

コマンド何をするか
EviewViewを開く
EcontrollerControllerを開く
EunitestUnittestを開く
EmodelModelを開く

デフォルトのままでもある程度はファイルを開いてくれるのですが、ControllerからRequestのテストファイルを開くことが出来ませんでした。そのため設定を追加しました。

これを応用すれば、開けないファイルがあってもある程度は制御できそうです(下のserviceは自分が適当に追加した設定なのでRequestだけを開きたいなら無視して大丈夫です)。

vim.cmd([[
let g:rails_projections = {
\ "app/controllers/*_controller.rb": {
\ "test": [
\ "spec/controllers/{}_controller_spec.rb",
\ "spec/requests/{}_spec.rb"
\ ],
\ },
\ "spec/requests/*_spec.rb": {
\ "alternate": [
\ "app/controllers/{}_controller.rb",
\ ],
\ },
\ "app/services/*_service.rb": {
\ "test": [
\ "spec/services/{}_service_spec.rb",
\ "spec/services/{}_spec.rb"
\ ],
\ },
\ "spec/services/*_spec.rb": {
\ "alternate": [
\ "app/services/{}_service.rb",
\ ],
\ }}
]])

Luaに置き換えたい…

andymass/vim-matchup

https://github.com/andymass/vim-matchup

%を入力すると対応するカッコに移動するプラグインです。vモードで範囲選択するときに便利で、vモード→%で一気に範囲選択できます。

その他

その他のnvim自体の設定についてです。

local keymap_opts = { noremap = true, silent = true }
local opt = vim.opt
vim.g.mapleader = " " -- leaderキーをSpaceに割当
vim.keymap.set("n", "<ESC><ESC>", ":nohlsearch<CR>", keymap_opts) -- ESC連打でハイライトを消す
vim.keymap.set("n", "<leader>a", "ggVG", { noremap = true }) -- スペース+aで全選択
opt.whichwrap = "b,s,h,l,<,>,[,]" -- 左右のキーで行をまたぐ
vim.opt.swapfile = false -- swapファイルを作らない
-- undoの永続化
if vim.fn.has("persistent_undo") == 1 then
opt.undodir = vim.fn.expand("~/.config/nvim/undo")
opt.undofile = true
end

最後に

普段自分が使っているプラグインであまり他の人が使ってなさそうなものをピックアップして紹介しました。改めて見直すとUIをカスタマイズする系の設定が多かったです。

今後はpakcerで管理しているプラグインをlazyに移行したいなと思っています。が、腰が重く全然やってません…

明日のアドベントカレンダーはいかちゃんです。

参考文献