9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

愛用しているNeovimプラグインとか紹介

Last updated at Posted at 2025-12-08

※これは「株式会社ネクスウェイ Advent Calendar 2025」8日目の記事です🎄

あらゆるコミュニケーションを支援する株式会社ネクスウェイの開発メンバーが、好きな技術・取り組み・学びをゆるく書いていきます :snowman2:

この記事について

私は普段NeoVimを使って開発を行っております。長年使用しているプラグインや設定に感謝をこめつつさらしていきたいと思います。

プラグイン紹介

1. Gruvbox

カラースキーマはずっとGruvboxにしてます。変えてみようかと思って、tokyonightとかもインストールはしたりはしたものの、結局Gruvboxにしてます。

2. fugitive

git操作にはfugitiveを使ってます。
使っているのは

  • git status表示(:G)
  • ステージング
  • diff表示
  • 3ペインマージ
  • git blame(:Gb)
  • ブラウザでGitHub表示(:GBrowse)

image.png

telescope

定番のfuzzy finderです。
window下部にオーバーレイ表示するivyテーマを使ってます。
よくつかっているのは

  • ファイル名検索(find_files)
  • ファイルGrep(live_grep)
  • 最近使用したファイル(old_files)

image.png

3. fern

ファイラーはfernを使ってます。ファイラーを探してるときに以下のようなことを考えて探してたと思います。

  • j,kで移動してlでオープンしたい
  • ドロワー式じゃなくて、フォーカスしているウィンドウに表示する方式
  • アイコンは表示したい
  • ファイルのコピー、移動(リネーム)、削除ができる

image.png

4. mason

定番のLSPサーバーのインストーラーです。
弊社では複数のサービスを担当することになるのですが、微妙にRubyやNodeのバージョンが違うのでプロジェクトごとに個別にサーバーがインストールするようにしてます。

local rootPathRelatedHome = string.gsub(vim.fn.getcwd(), os.getenv("HOME").."/" ,"")
require('mason').setup({
  install_root_dir = require("mason-core.path").concat { vim.fn.stdpath "data", "mason", rootPathRelatedHome},
  ui = {
    icons = {
      package_installed = "✓",
      package_pending = "➜",
      package_uninstalled = "✗"
    }
  }
})

5. vim-test

テストランナーです。
カーソル位置のテストだけ実行したり、ファイル全体のテストを実行したりできます。
RSpecでRubyテストしているときは行番号で実行できるのでコマンドで実行でよかったんですが、Java開発しているときに特定のテストを実行するときに長いテスト名を指定する必要があって面倒なので導入しました。

strategyはneovim_stickyを使ってます。
monorepoでも使えるように、test#project_rootは動的に設定するようにしてます。
dockerで実行したいときなんかは以下のような設定をしています。

let g:test#ruby#rspec#executable = "docker exec -it xxx-ruby bin/rspec"

let g:test#java#maventest#executable = "docker exec -it xxx-java ./mvnw"

プラグインじゃないもの紹介

6. タブの設定

vimを使い始めた時から設定しているタブを便利にする設定です。

普段はtelescopeでバッファーを切り替えながら実装するのであまりタブを使うことはないのですが、コードリーディングや複雑な動作確認などをしている場合にwindowを分割しまくっているときに「分割しまくったwindowの状態を残したまま別のバッファーを開きたい」ってときに別タブで開くなどで使ってます。

ほぼ記事のまま使ってますが、分割したwindowを全画面表示するためにttでtab splitが実行するようにしてます。

" 今のバッファーを新しいタブで開く(擬似的なwindowの拡大)
map <silent> [Tag]t :tab split<CR>

7. ローカル設定

ディレクトリごとに特殊な設定が必要な場合に個別設定を適用できる設定です。

弊社では複数のサービスを担当することになるのですが、プロジェクトごとにテストの実行ファイルやLSPの実行ファイルやオプションを微妙に変えたいと気があってその場合につかってます。

ほとんど記事のまま使ってます。

8. terminalドロワー

最近claude codecopilot cliを使うのに、それ用にwindowの右側に表示されるドロワー式のターミナルが欲しくなった。
ので作ってみました。(ChatGPTが)

local M = {}

local terminal_bufnr = nil
local terminal_winid = nil
local TERMINAL_BUF_NAME = "TERMINAL_SIDE"

function M.toggle_terminal()
  -- すでに表示されているならウィンドウを閉じる
  if terminal_winid and vim.api.nvim_win_is_valid(terminal_winid) then
    vim.api.nvim_win_close(terminal_winid, true)
    terminal_winid = nil
    return
  end

  -- 既存の terminal バッファが存在しない場合は新規作成
  if not terminal_bufnr or not vim.api.nvim_buf_is_valid(terminal_bufnr) then
    -- いったん新しいウィンドウを下に追加
    vim.cmd("botright split")
    terminal_winid = vim.api.nvim_get_current_win()

    -- terminal 起動(この時点でバッファが作成される)
    vim.cmd("terminal")
    terminal_bufnr = vim.api.nvim_get_current_buf()

    -- 名前をつける
    vim.api.nvim_buf_set_name(terminal_bufnr, TERMINAL_BUF_NAME)

    -- ← ここで split 配置を右に追い出す
    vim.cmd("wincmd L")
    vim.api.nvim_win_set_width(terminal_winid, math.floor(vim.o.columns * 0.4))

    -- 挿入モードへ
    vim.cmd("startinsert")
    return
  end

  -- 再表示時:右側に新規 vsplit → terminal buf を再表示
  vim.cmd("vsplit")
  vim.cmd("wincmd L")  -- split 配置を右に追い出す
  terminal_winid = vim.api.nvim_get_current_win()
  vim.api.nvim_win_set_buf(terminal_winid, terminal_bufnr)
  vim.api.nvim_win_set_width(terminal_winid, math.floor(vim.o.columns * 0.4))
  vim.cmd("startinsert")
end

vim.api.nvim_create_user_command("MyTerminalToggle", M.toggle_terminal, {})
vim.keymap.set("n", "<leader>0", "<cmd>MyTerminalToggle<CR>", { desc = "Toggle side terminal", silent = true })

return M

<space>0でwindow右側のterminalで実行したCopilot cliが開閉します。
image.png

9. キーマッピング

この設定がされてないと操作できない。ずっと愛用のマッピングです。

" leaderを<Space>に設定
let mapleader = "\<Space>"

" <Space>oを押して新しいファイルを開く
nnoremap <Leader>o :enew<CR>
" <Space>wを押してファイルを保存する
nnoremap <Leader>w :w<CR>
nnoremap <Leader>q :q<CR>
" <Space><Space>でビジュアルラインモードに切り替える
nmap <Leader><Leader> V

"x時にyankされないようにする
nnoremap x "_x
nnoremap X "_X

"選択領域にはりつけるときに、貼り付け先をyankしないようにする
xnoremap p pgvygv<esc>

" INSERTモードから抜けるときにESCの代わりにjjをつかう
inoremap <silent> jj <ESC>

" 検索時にデフォルトでvery magicを有効にする
nnoremap /  /\v

" 検索中の文字を置換する
nnoremap # :%s///gc<left><left><left>

" コマンドモードでemacsバインディングが使えるようにする
cnoremap <C-a> <Home>
cnoremap <C-e> <End>
cnoremap <C-b> <Left>
cnoremap <C-f> <Right>
" 前の単語へ移動
cnoremap <M-b> <S-Left>
" 次の単語へ移動
cnoremap <M-f> <S-Right>

" quickfixを移動しやすくする
nnoremap <silent> <C-[> :cp<CR>
nnoremap <silent> <C-]> :cn<CR>

" terminalモードを使いやすくする
nnoremap <silent> <C-t> :term<CR>i
tnoremap <Esc> <C-\><C-n>
tnoremap <C-]> <C-\><C-n>

最後に

プラグインも最近見直しをしていないので、年末年始に棚卸したいと思ってます。
設定もvimscriptだったりluaだったりなのも気が向いたら見直したいと思います。


最後まで読んでいただきありがとうございました。

株式会社ネクスウェイ Advent Calendar 2025では明日以降も、開発メンバーがそれぞれの「好き」と「学び」を自分の言葉で綴っていく予定です。

明日 9 日目の記事は、同じくネクスウェイ開発メンバー@saocy_penguin さん です。

引き続き、お楽しみください🎄


9
1
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
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?