コンテンツにスキップ

Neovim 機能ガイド — バックエンドエンジニアのための実践入門

はじめに

Neovim(nvim)は Vim をフォークして生まれたテキストエディタで、Lua による拡張性、組み込み LSP クライアント、Tree-sitter による構文解析を軸に「ターミナルで動く最新 IDE」へと進化を続けている。2026 年 4 月時点の安定版は v0.12.1 で、補完・デバッグ・ファジーファインダーなどのエコシステムも十分に成熟した。

VS Code から移行する人も増えているが、Neovim の強みは「軽量さ」と「すべてをキーボードで完結できる操作体系」にある。特にバックエンドエンジニアが SSH 先のサーバーやコンテナ内で開発する場面では、GUI 不要で動く Neovim の実用性は高い。

この記事では Neovim の主要機能を体系的に整理し、Go を中心としたバックエンド開発でどう活用するかを具体的に解説する。

背景・前提知識

Vim との違い

項目 Vim Neovim
設定言語 Vimscript Vimscript + Lua
LSP プラグイン依存 組み込みクライアント
構文解析 正規表現ベース Tree-sitter(増分パース)
非同期処理 制限あり 完全非同期アーキテクチャ
ターミナル 基本的 改良されたターミナルエミュレータ
API 限定的 豊富な API(外部プロセス連携向け)

バージョンの変遷(最近のハイライト)

  • v0.5(2021): 組み込み LSP クライアント・Tree-sitter 導入
  • v0.9(2023): Lua のエコシステム爆発的拡大
  • v0.11(2025 年 3 月): 組み込み自動補完、仮想行(virtual lines)、デフォルトキーマップ拡充
  • v0.12(2026 年): ターミナルエミュレータ再設計、「Press ENTER to continue」プロンプト廃止、カーソルスタイリング改善

本論

1. Lua ベースの設定

Neovim は ~/.config/nvim/init.lua を起点とする Lua 設定を推奨している。Vimscript に比べて構造化しやすく、条件分岐やモジュール分割が自然に書ける。

-- ~/.config/nvim/init.lua の基本構成例
vim.g.mapleader = " "

-- 基本オプション
vim.opt.number = true           -- 行番号表示
vim.opt.relativenumber = true   -- 相対行番号
vim.opt.expandtab = true        -- タブをスペースに
vim.opt.shiftwidth = 4          -- インデント幅
vim.opt.signcolumn = "yes"      -- サイン列を常に表示
vim.opt.clipboard = "unnamedplus" -- システムクリップボード連携

-- キーマップ
vim.keymap.set("n", "<leader>w", "<cmd>write<cr>", { desc = "ファイル保存" })
vim.keymap.set("n", "<leader>q", "<cmd>quit<cr>", { desc = "終了" })

設定をモジュール分割する場合は lua/ ディレクトリに配置する。

~/.config/nvim/
├── init.lua
└── lua/
    ├── options.lua
    ├── keymaps.lua
    └── plugins/
        ├── lsp.lua
        ├── telescope.lua
        └── treesitter.lua
-- init.lua からモジュールを読み込む
require("options")
require("keymaps")

2. プラグインマネージャ — lazy.nvim

2026 年現在のデファクトスタンダードは lazy.nvim だ。遅延読み込みが標準で、起動速度を犠牲にせずに大量のプラグインを管理できる。

-- lazy.nvim のブートストラップ
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({
    "git", "clone", "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git",
    "--branch=stable", lazypath,
  })
end
vim.opt.rtp:prepend(lazypath)

require("lazy").setup({
  -- プラグイン定義をここに書く
  { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate" },
  { "neovim/nvim-lspconfig" },
  { "nvim-telescope/telescope.nvim", dependencies = { "nvim-lua/plenary.nvim" } },
})

3. 組み込み LSP クライアント

Neovim 最大の武器。外部の Language Server と通信し、補完・定義ジャンプ・リネーム・診断(lint)を提供する。

基本セットアップ(Go 向け)

-- lua/plugins/lsp.lua
local lspconfig = require("lspconfig")

-- gopls の設定
lspconfig.gopls.setup({
  settings = {
    gopls = {
      analyses = {
        unusedparams = true,
        shadow = true,
      },
      staticcheck = true,
      gofumpt = true,
    },
  },
  on_attach = function(client, bufnr)
    local opts = { buffer = bufnr }
    vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
    vim.keymap.set("n", "gr", vim.lsp.buf.references, opts)
    vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
    vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts)
    vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, opts)
    vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts)
    vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts)
  end,
})

Mason で Language Server を管理

mason.nvim を使えば :Mason コマンドで LSP サーバー、リンター、フォーマッターをインストールできる。手動で goplslua-language-server を入れる手間がなくなる。

{
  "williamboman/mason.nvim",
  dependencies = { "williamboman/mason-lspconfig.nvim" },
  config = function()
    require("mason").setup()
    require("mason-lspconfig").setup({
      ensure_installed = { "gopls", "lua_ls", "pyright" },
    })
  end,
}

主要な LSP キーマップ一覧

キー 動作
gd 定義へジャンプ
gr 参照一覧
K ホバードキュメント
<leader>rn シンボルリネーム
<leader>ca コードアクション
[d / ]d 前/次の診断へ移動

4. Tree-sitter — 構文解析エンジン

正規表現ではなく増分パーサーで構文を解析するため、ハイライトの正確さと速度が段違い。Go のような構文が明確な言語では特に恩恵が大きい。

require("nvim-treesitter.configs").setup({
  ensure_installed = { "go", "gomod", "gosum", "lua", "yaml", "json", "markdown" },
  highlight = { enable = true },
  indent = { enable = true },
  incremental_selection = {
    enable = true,
    keymaps = {
      init_selection = "<cr>",
      node_incremental = "<cr>",
      node_decremental = "<bs>",
    },
  },
})

incremental_selection は便利で、<CR> を押すたびに構文ノード単位で選択範囲が広がる。関数 → ブロック → ファイルと段階的に選択できる。

5. Telescope — ファジーファインダー

ファイル検索、grep、LSP シンボル検索、Git 操作などすべてを統一インターフェースで行える。

local telescope = require("telescope.builtin")

vim.keymap.set("n", "<leader>ff", telescope.find_files, { desc = "ファイル検索" })
vim.keymap.set("n", "<leader>fg", telescope.live_grep, { desc = "テキスト検索" })
vim.keymap.set("n", "<leader>fb", telescope.buffers, { desc = "バッファ一覧" })
vim.keymap.set("n", "<leader>fs", telescope.lsp_document_symbols, { desc = "シンボル検索" })
vim.keymap.set("n", "<leader>fd", telescope.diagnostics, { desc = "診断一覧" })
vim.keymap.set("n", "<leader>gc", telescope.git_commits, { desc = "Git コミット" })
vim.keymap.set("n", "<leader>gs", telescope.git_status, { desc = "Git ステータス" })

telescope-fzf-native.nvim を追加すると、C 実装の fzf アルゴリズムでソートが高速化される。大規模リポジトリで体感が変わる。

6. DAP — デバッグアダプタープロトコル

nvim-dap を使えば Neovim 内でブレークポイント設置・ステップ実行・変数インスペクションができる。Go の場合は delve と連携する。

local dap = require("dap")

dap.adapters.delve = {
  type = "server",
  port = "${port}",
  executable = {
    command = "dlv",
    args = { "dap", "-l", "127.0.0.1:${port}" },
  },
}

dap.configurations.go = {
  {
    type = "delve",
    name = "Debug",
    request = "launch",
    program = "${file}",
  },
  {
    type = "delve",
    name = "Debug Test",
    request = "launch",
    mode = "test",
    program = "./${relativeFileDirname}",
  },
}

vim.keymap.set("n", "<leader>db", dap.toggle_breakpoint, { desc = "ブレークポイント切替" })
vim.keymap.set("n", "<leader>dc", dap.continue, { desc = "デバッグ続行" })
vim.keymap.set("n", "<leader>do", dap.step_over, { desc = "ステップオーバー" })
vim.keymap.set("n", "<leader>di", dap.step_into, { desc = "ステップイン" })

nvim-dap-ui を併用すると、変数ウォッチ・コールスタック・ブレークポイント一覧が分割ウィンドウに表示される。

7. ターミナル統合

Neovim はエディタ内にターミナルを開ける。v0.12 でターミナルエミュレータが再設計され、レスポンスが向上した。

-- トグルターミナル
vim.keymap.set("n", "<leader>tt", "<cmd>split | terminal<cr>", { desc = "ターミナル(水平)" })
vim.keymap.set("n", "<leader>tv", "<cmd>vsplit | terminal<cr>", { desc = "ターミナル(垂直)" })
vim.keymap.set("t", "<Esc><Esc>", "<C-\\><C-n>", { desc = "ターミナルモード脱出" })

go testmake をエディタ内で実行し、結果を見ながらコードを修正する流れが自然に作れる。

8. v0.11 / v0.12 の注目新機能

v0.11(2025 年 3 月)

  • 組み込み自動補完: vim.lsp.completion で外部プラグインなしでも LSP 補完が動く
  • 仮想行(virtual lines): 診断メッセージを該当行の下にインライン表示
  • デフォルトキーマップ拡充: grn(リネーム)、gra(コードアクション)、grr(参照)が初期状態で使える

v0.12(2026 年)

  • ターミナルエミュレータ再設計: 描画パフォーマンス向上、tmux / screen との互換性改善
  • 「Press ENTER to continue」廃止: 長年の UX 課題が解消
  • カーソルスタイリング改善: ターミナルマルチプレクサ越しでもカーソル形状が正しく反映

実践・ユースケース

Go バックエンド開発の日常ワークフロー

1. <leader>ff でファイルを開く
2. コードを編集(LSP が型エラーをリアルタイムで表示)
3. gd で関数定義にジャンプ、gr で呼び出し元を確認
4. <leader>rn でリネーム(プロジェクト全体に反映)
5. <leader>tt でターミナルを開き go test ./... を実行
6. 問題があれば <leader>fd で診断一覧を確認
7. <leader>db でブレークポイントを設置し <leader>dc でデバッグ開始

SSH 先 / Docker コンテナ内での開発

GUI が使えない環境でも Neovim なら同じ設定・同じ操作感で開発できる。~/.config/nvim/ を Git 管理しておけば、どの環境でも git clone 一発で開発環境が整う。

おすすめプラグイン構成(バックエンド向け最小セット)

プラグイン 用途
lazy.nvim プラグインマネージャ
nvim-lspconfig + mason.nvim LSP 設定・サーバー管理
nvim-treesitter 構文ハイライト・選択
telescope.nvim ファジーファインダー
nvim-dap + nvim-dap-ui デバッグ
gitsigns.nvim Git 差分表示
oil.nvim ファイラー
conform.nvim フォーマッター統合

まとめ

Neovim は「Vim の操作体系」に「モダン IDE の機能」を載せたエディタだ。

  • LSP: 補完・定義ジャンプ・リネーム・診断をエディタ組み込みで提供
  • Tree-sitter: 正確で高速な構文解析
  • Telescope: すべてをファジー検索で統一
  • DAP: エディタ内デバッグ
  • Lua 設定: 構造化・モジュール化しやすい設定システム
  • ターミナル統合: エディタを離れずにコマンド実行

v0.12 で UX の細かい課題も解消され、VS Code からの移行ハードルはかなり下がっている。まずは lazy.nvim + nvim-lspconfig + telescope.nvim の 3 つから始めて、必要に応じてプラグインを足していくのがおすすめ。

おすすめ YouTube チャンネル・動画

Neovim は動画で見たほうがワークフローのイメージがつかみやすい。以下は特におすすめのチャンネル。

チャンネル 特徴 おすすめ内容
TJ DeVries Neovim コア開発者。kickstart.nvim の作者 kickstart.nvim のウォークスルー動画。設定ファイルを一行ずつ解説してくれるので、Neovim の仕組みが根本から理解できる
ThePrimeagen 元 Netflix エンジニア。Vim モーション・Neovim の伝道師 「0 to LSP」シリーズで LSP をゼロから構築する過程を見られる。2026 年には Neovim AI エージェント「99」も開発
devaslife (craftzdog) 日本人エンジニア(松山拓也)。Inkdrop 開発者 macOS での Neovim 環境構築を美しいターミナル画面で紹介。日本語コメント多め。フロント寄りだがセットアップの参考に最適
typecraft 初心者向けに丁寧な解説 Neovim + lazy.nvim + LSP の入門チュートリアルが充実。初めて触る人はここから

学習の進め方

  1. まず触る: kickstart.nvim を clone して :Tutor で Vim 操作を覚える
  2. 動画で全体像: TJ DeVries の kickstart.nvim 解説動画で設定の意味を理解する
  3. 操作を鍛える: ThePrimeagen の vim-be-good プラグインで Vim モーションを練習
  4. 自分の設定を育てる: kickstart.nvim をベースに少しずつカスタマイズしていく

次に学ぶべきこと

  • LazyVim: lazy.nvim ベースの Neovim ディストリビューション。設定済みの状態からカスタマイズしたい人向け
  • Neovim の Lua API: vim.apivim.fnvim.cmd を使ったカスタムプラグイン開発
  • dotfiles 管理: chezmoiGNU Stow で Neovim 設定をマシン間で同期

参考