結論

Neovimは、Vimの操作のままLuaで設定でき、LSPを組み込んだテキストエディタです。コマンド名は nvim です。

この記事でわかること

  • Vim 9.1 と比べた既定値12項目の表(実測)
  • コピペ用 init.lua 3種(最小・lazy.nvim・vim.pack)
  • LSP のやりとりの実物とエラー8種の直し方

2026年10月22日更新|Neovim 0.12.6 のドキュメント・LuaJIT 2.1 で確認

Neovim は本体(Vim 互換の編集)の上に Lua の設定ファイル init.lua を置き、プラグインと、組み込みの LSP・Treesitter を組み合わせて使います。

flowchart TD
    A[nvim 本体<br>Vim と同じ操作] --> B[init.lua<br>Lua で書く設定]
    B --> C[プラグイン<br>lazy.nvim か vim.pack]
    B --> D[組み込みの LSP<br>と Treesitter]
    D --> E[言語サーバー<br>pyright など]

よく検索される操作を先にまとめます。

やりたいこと コマンド・書き方 補足
入れる(Mac) brew install neovim 2026年10月22日時点で 0.12.6
入れる(Windows) winget install Neovim.Neovim MSI・zip もある
入れる(Linux) GitHub の tar.gz を /opt に展開 Ubuntu 24.04 の apt は 0.9.5
起動・終了 nvim ファイル名・:q 保存して終了は :wq
設定ファイルの場所 ~/.config/nvim/init.lua Windows は ~/AppData/Local/nvim
状態の診断 :checkhealth LSP だけなら :checkhealth vim.lsp
プラグインを入れる lazy.nvim か vim.pack.add() vim.pack は 0.12 から
LSP を有効にする vim.lsp.enable('pyright') 0.11 から
練習する :Tutor Vim の vimtutor にあたる

確認環境:Neovim の仕様・既定値・コマンドは、Neovim 0.12.6(2026年10月9日のタグ)のヘルプ(runtime/doc)と INSTALL.md、ソースの runtime/lua/vim/ で確かめました。lazy.nvim 11.17.5・nvim-lspconfig・nvim-treesitter(main ブランチ)は各リポジトリの README とヘルプ、LazyVim・kickstart.nvim・vscode-neovim は公式ページで確かめました。Ubuntu 24.04 で apt の候補の版(apt-cache policy)と Vim 9.1 の既定値を実行して確認し、記事の init.lua はすべて LuaJIT 2.1(lupa 2.8)で構文を確認しています。LSP のやりとりは、pyright 1.1.414 の言語サーバーに Python から JSON-RPC を送って確かめました(確認日 2026年10月22日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Neovimとは|インストール・init.lua設定・lazy.nvim・LSP入門」

Neovimとは(読み方・できること)

この節では、Neovim が何で、何ができるのかを短くまとめます。

Neovim(ネオビム)は、Vim をもとに作られたオープンソースのテキストエディタです。 公式サイトは「hyperextensible Vim-based text editor(とても拡張しやすい、Vim ベースのテキストエディタ)」と紹介しています。ターミナルの中で動き、コマンドは neovim ではなく nvim です。

公式サイトは特徴を3つに分けています。

1拡張しやすい(Extensible)

設定とプラグインを Lua で書ける。API が文書化され、RPC でほかの言語やGUI・ブラウザからも操作できる。Tree-sitter で構文を解析する。

2使いやすい(Usable)

LSP でコードの解析・リファクタリング。:terminal を内蔵。現代の端末の機能を最初から有効にしている。

3Vim と入れ替えられる(Drop-in Vim)

Vim の編集の操作と Vimscript(v1)に互換。Vim からの移行の手順(:help nvim-from-vim)と、初心者向けの :Tutor がある。

4GUI からも使える

ターミナルのほか、Neovide などの GUI や、VS Code の拡張機能(vscode-neovim)の中で Neovim を動かす使い方もある。

どんな人が使っているか

使い方 例
メインのエディタ LSP・Treesitter・補完をそろえ、IDE の代わりに使う
サーバー上の編集 SSH 先で設定ファイルやログを直す(GUI が要らない)
ターミナル中心の開発 tmux と組み合わせ、エディタ・シェル・テストを1画面で回す
ほかのエディタの中で VS Code の vscode-neovim で、編集の部分だけ Neovim を使う

2026年10月22日時点の版

0.12.6最新の安定版2026年10月9日のタグ。Homebrew も 0.12.6
0.9.5Ubuntu 24.04 の apt の版apt-cache policy で確認
0.11.6Ubuntu 26.04 の apt の版packages.ubuntu.com で確認

0.12 では、組み込みのプラグイン管理(vim.pack)、入力中に補完の候補を出す 'autocomplete' オプション、Neovim を再起動する :restart などが加わりました(ヘルプの「news」より)。記事の設定は 0.12 を前提にし、0.11 でも使える書き方は節ごとに書き分けています。

NeovimとVimの違い

この節では、Vim と Neovim の違いを、既定値の比較と機能の表で確かめます。

Neovim は Vim の派生(フォーク)です。編集の操作(モード・移動・テキストオブジェクト)はほぼ同じで、違いは「最初からの設定」「設定の言語」「組み込みの機能」にあります。

既定値の違い(Vim 9.1 を実行して比較)

Vim 9.1 を設定ファイルなし(vim -u DEFAULTS)で起動し、オプションの値を書き出しました。Neovim 側の値は、ヘルプの「nvim-defaults」の一覧です。

LANG=C.UTF-8 vim -u DEFAULTS -i NONE -N -es -c 'redir! > vimdef.txt' \
  -c 'set hlsearch? incsearch? autoindent? hidden? laststatus? history? belloff? autoread? smarttab? encoding? ttimeoutlen? display?' \
  -c 'redir END' -c 'qa!'
nohlsearch
  incsearch
noautoindent
nohidden
  laststatus=1
  history=200
  belloff=
noautoread
nosmarttab
  encoding=utf-8
  ttimeoutlen=100
  display=truncate
オプション Vim 9.1(実行結果) Neovim 0.12.6(ヘルプ)
hlsearch(検索語を強調) オフ オン
incsearch(入力中に検索) オン オン
autoindent(前の行に合わせて字下げ) オフ オン
hidden(保存前でも別のバッファへ) オフ オン
laststatus(ステータス行) 1(ウィンドウが2つ以上のとき) 2(常に表示)
history(コマンドの履歴) 200 10000
belloff(ベルを鳴らさない) 空(鳴る) all(鳴らさない)
autoread(外で変わったら読み直す) オフ オン
smarttab オフ オン
encoding 環境による(下を参照) 常に UTF-8
ttimeoutlen(キーコードの待ち時間) 100 50
display truncate lastline

Vim の encoding は環境の言語設定で変わります。 上の実行で LANG を外すと encoding=latin1 になりました。Neovim は常に UTF-8 です。このほか Neovim は、ファイルの種類の判定・構文の色付けが最初から有効で、.editorconfig の設定も読みます。

機能の違い

観点 Vim 9.1 Neovim 0.12
設定ファイル ~/.vimrc(Vimscript) ~/.config/nvim/init.lua か init.vim
設定・プラグインの言語 Vimscript・Vim9 script Lua と Vimscript(Vim9 script は非対応)
LSP 本体に補完・診断のクライアントは無く、プラグインで足す クライアントを組み込み(vim.lsp)
構文の解析 正規表現ベースの構文ファイル 正規表現に加え Tree-sitter を組み込み
プラグイン管理 packages(pack/*/start) packages に加え vim.pack(0.12)
外部からの操作 channel・job msgpack-RPC の API(GUI・他言語から)
ファイルの置き場所 ~/.vim など XDG の規則(~/.config/nvim など)

Ubuntu 24.04 の apt で入る Vim(vim パッケージ)の vim --version では、-lua と -clipboard でした。Lua のプラグインは使えず、OS のクリップボードとも直接はつながりません。

Vim のコマンドはそのまま Neovim でも使えます。 モード別のコマンドや置換・マクロは、関連記事「vimコマンド一覧|モード別早見表と置換・マクロの実行結果つき」で扱っています。

Neovimのインストール(Windows・Mac・Linux)

この節では、OS ごとの入れ方と、入る版の違いをまとめます。

OS コマンド 補足(2026年10月22日時点)
Mac brew install neovim Homebrew の formula は 0.12.6
Windows winget install Neovim.Neovim ほかに choco install neovim・scoop install neovim
Windows GitHub の nvim-win64.msi 管理者権限が要らない zip もある
Linux GitHub の nvim-linux-x86_64.tar.gz arm64 版・AppImage もある
Ubuntu・Debian sudo apt install neovim 24.04 は 0.9.5、26.04 は 0.11.6
Arch Linux sudo pacman -S neovim

Macでのインストール

INSTALL.md のとおり、Homebrew で入れます。Homebrew は Linux でも使えます。

brew install neovim
nvim --version

Homebrew を入れるところからの手順は、関連記事「Homebrewの使い方|コマンド一覧とBrewfile・brew bundle」で扱っています。

Windowsでのインストール

winget が使える Windows 10・11 では、PowerShell で次の1行です。

winget install Neovim.Neovim

INSTALL.md の注意点です。

  • VCRUNTIME の DLL が無いと言われたら、Visual Studio の C++ 再頒布可能パッケージを入れる。
  • zip 版は好きな場所に展開して nvim.exe を実行する。bin フォルダを PATH に足すと、どこからでも nvim で起動できる。
  • :terminal を使うには Windows 10 の「Version 2004」以降が要る(ヘルプの supported-platforms)。

Windows の設定ファイルは ~/AppData/Local/nvim/init.lua(%LOCALAPPDATA%\nvim)です。

Linuxでのインストール(apt の版に注意)

Ubuntu 24.04 の apt で入る版は 0.9.5 です。 実行して確かめた候補の版です。

$ apt-cache policy neovim
neovim:
  Installed: (none)
  Candidate: 0.9.5-6ubuntu2
  Version table:
     0.9.5-6ubuntu2 500
        500 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages

0.9.5 では、この記事の設定の多くが動きません。各プロジェクトが求める版と比べた表です。

使うもの 求める Neovim の版 0.9.5 で使えるか
lazy.nvim 0.8.0 以上(LuaJIT でビルド) 使える
vscode-neovim 0.10.0 以上 使えない
vim.lsp.config・vim.lsp.enable 0.11 以上 使えない
nvim-lspconfig(現行) 0.11.3 以上 使えない
LazyVim 0.11.2 以上 使えない
nvim-treesitter(main) 0.12.0 以上 使えない
vim.pack 0.12 以上 使えない

そのため Linux では、INSTALL.md の「Pre-built archives」の手順で、GitHub の最新版を /opt に入れる方法が向いています。

1

最新の安定版をダウンロードする

curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz。arm64 の PC は nvim-linux-arm64.tar.gz にします。

約11MB

2

/opt に展開する

sudo rm -rf /opt/nvim-linux-x86_64 で前の版を消してから、sudo tar -C /opt -xzf nvim-linux-x86_64.tar.gz。

更新するときも同じ2行

3

PATH に足す

~/.bashrc か ~/.zshrc に export PATH="$PATH:/opt/nvim-linux-x86_64/bin" を書き、シェルを開き直します。

apt の nvim と両方あるときは前に足す

4

版を確かめる

nvim --version の1行目に版が出ます。which nvim で、どのファイルが動いているかも確かめます。

1行目が NVIM v0.12.6 なら最新

apt でも入れていると、PATH の順で apt の 0.9.5 が動くことがあります。PATH の書き方は、関連記事「Linux環境変数PATHの設定方法|exportと.bashrcの使い分け早見表」で扱っています。apt で入れた版を消すコマンドは、関連記事「aptコマンド一覧|updateとupgradeの違い・apt-getとの違い」で扱っています。

インストールの確認(nvim --version・:checkhealth)

この節では、入れた後に「正しく動くか」を確かめる2つのコマンドを説明します。

nvim --version

nvim --version は、Neovim の版とビルドの情報を表示します。1行目の版が、この記事の前提(0.12)以上かを見ます。 apt と GitHub の版の両方を入れている場合は、which nvim で動いているファイルも確かめます。

:checkhealth

:checkhealth は、Neovim と各プラグインの「健康診断」です。ヘルプの health.txt とソースの runtime/lua/vim/health.lua から、表示の決まりをまとめます。

項目 内容
調べる範囲 :checkhealth で全部、:checkhealth vim.lsp で LSP だけ、:checkhealth vim* で本体の全部
本体の主な診断 vim.health・vim.lsp・vim.pack・vim.provider・vim.treesitter
結果の印 ✅ OK・⚠️ WARNING・❌ ERROR
0.12 で増えたこと 項目ごとの見出しに、警告とエラーの数の要約が出る
浮動ウィンドウで出す vim.g.health = { style = 'float' }
閉じる q

まず ❌ ERROR の行だけを直します。 WARNING の多くは、使わない機能(Python・Ruby のプロバイダーなど)が入っていないという知らせです。LSP の言語サーバーが見つからないときは、vim.lsp の項目に次の警告が出ます(runtime/lua/vim/lsp/health.lua の文言)。

'pyright-langserver' is not executable. Configuration will not be used.

設定を読まずに起動する(--clean)

設定やプラグインが原因かを切り分けるときは、nvim --clean で起動します。ヘルプでは「新しく入れた直後の状態をまねる」と説明され、ユーザーの設定ファイルとフォルダを読みません(組み込みのプラグインは読みます)。--clean で直るなら、原因は自分の設定かプラグインです。

Neovimの基本操作(モードと早見表)

この節では、最初に覚える操作を表にします。操作は Vim と同じです。

Neovim には「モード」があり、同じキーでもモードによって動きが変わります。起動した直後はノーマルモードで、文字を打つには挿入モードに入ります。

flowchart TD
    N[ノーマル<br>移動と命令] -->|i a o| I[挿入<br>文字入力]
    N -->|v V| V[ビジュアル<br>範囲選択]
    N -->|コロン| C[コマンド<br>保存など]
    I -->|Esc| N
    V -->|Esc| N
    C -->|Enter| N
やりたいこと キー・コマンド 補足
文字を入力する i(カーソルの前)・a(後ろ)・o(下に行を足す) Esc でノーマルモードに戻る
保存する :w 名前を付けるなら :w ファイル名
終了する :q 保存して終了は :wq、捨てて終了は :q!
移動する h j k l(左・下・上・右) w で次の単語、gg・G で先頭・末尾
1行消す・コピー・貼り付け dd・yy・p 3dd で3行
取り消す・やり直す u・Ctrl-r
検索する /文字列 → n・N 強調は既定でオン(hlsearch)
全部置換する :%s/old/new/g 確認しながらは末尾に c
画面を分ける :split・:vsplit Ctrl-w と h j k l で移る
端末を開く :terminal Ctrl-\ Ctrl-n でノーマルモードへ
練習する :Tutor 対話式のチュートリアル
Neovim を再起動する :restart 0.12 から。設定を直した後に使う

設定しなくても使える既定のキーマップ

Neovim は起動時にいくつかのキーマップを作ります(ヘルプの default-mappings・lsp-defaults)。LSP の操作は gr で始まる2〜3文字に割り当て済みで、設定を書かなくても使えます。

キー 動き
K カーソル位置の説明(LSP の hover)
grn 名前を一括で変える(rename)
grr 使っている場所の一覧(references)
gri 実装へ移る(implementation)
grt 型の定義へ移る(type definition)
gra コードアクション(修正の候補)
gO ファイル内の記号の一覧(document symbol)
Ctrl-s(挿入モード) 関数の引数の説明(signature help)
]d・[d 次・前の診断(エラー・警告)へ
gcc・gc 行・範囲をコメントにする/外す

関連記事「vimコマンド一覧|モード別早見表と置換・マクロの実行結果つき」で、移動・テキストオブジェクト・マクロを実行結果つきで扱っています。

init.luaの書き方(場所・オプション・キーマップ)

この節では、設定ファイルの場所と、最小の init.lua の全文を示します。

設定ファイルの場所

ヘルプの starting.txt にある場所です。init.lua(Lua)か init.vim(Vimscript)のどちらか1つを置きます。

OS 設定ファイル データ(プラグインの置き場所)
Linux・Mac ~/.config/nvim/init.lua ~/.local/share/nvim
Windows ~/AppData/Local/nvim/init.lua ~/AppData/Local/nvim-data
$XDG_CONFIG_HOME を設定 $XDG_CONFIG_HOME/nvim/init.lua $XDG_DATA_HOME/nvim

Neovim の中で :echo stdpath('config') を実行すると、今の環境での設定フォルダが分かります。

環境変数 NVIM_APPNAME を使うと、設定を丸ごと切り替えられます。 NVIM_APPNAME=nvim-lazyvim nvim で起動すると、~/.config/nvim-lazyvim を設定フォルダとして読みます。今の設定を残したまま、別の設定を試すときに使います。

最小のinit.lua(プラグインなし・コピペ用)

プラグインを使わず、Neovim の組み込みの機能だけで、オプション・キーマップ・ヤンクの強調・LSP・補完までをそろえた init.lua です。

-- ~/.config/nvim/init.lua(プラグインなしの最小構成)

-- リーダーキーは最初に決める(後のキーマップで使う)
vim.g.mapleader = " "
vim.g.maplocalleader = "\\"

-- 1. オプション
local opt = vim.opt
opt.number = true          -- 行番号
opt.relativenumber = true  -- 相対行番号
opt.expandtab = true       -- Tab を空白にする
opt.shiftwidth = 2         -- 自動インデントの幅
opt.tabstop = 2            -- Tab 文字の表示幅
opt.ignorecase = true      -- 検索で大文字小文字を区別しない
opt.smartcase = true       -- 大文字を含むときだけ区別する
opt.signcolumn = "yes"     -- 診断の印の列を常に出す(画面が横に揺れない)
opt.clipboard = "unnamedplus" -- OS のクリップボードと共有
opt.undofile = true        -- 閉じても undo の履歴を残す
opt.splitright = true      -- :vsplit で右に開く
opt.splitbelow = true      -- :split で下に開く
opt.scrolloff = 5          -- カーソルの上下に5行の余白
opt.updatetime = 300       -- CursorHold までの時間(ミリ秒)
opt.completeopt = { "menuone", "noselect", "popup" }

-- 2. キーマップ
local map = vim.keymap.set
map("n", "<leader>w", "<cmd>write<CR>", { desc = "保存" })
map("n", "<leader>q", "<cmd>quit<CR>", { desc = "閉じる" })
map("n", "<Esc>", "<cmd>nohlsearch<CR>", { desc = "検索の強調を消す" })
map("n", "<C-h>", "<C-w>h", { desc = "左のウィンドウへ" })
map("n", "<C-j>", "<C-w>j", { desc = "下のウィンドウへ" })
map("n", "<C-k>", "<C-w>k", { desc = "上のウィンドウへ" })
map("n", "<C-l>", "<C-w>l", { desc = "右のウィンドウへ" })
map("t", "<Esc><Esc>", [[<C-\><C-n>]], { desc = "端末モードを抜ける" })
map("n", "<leader>e", vim.diagnostic.open_float, { desc = "診断を浮動ウィンドウで表示" })

-- 3. 自動コマンド:ヤンクした範囲を一瞬光らせる
vim.api.nvim_create_autocmd("TextYankPost", {
  group = vim.api.nvim_create_augroup("my.yank", { clear = true }),
  callback = function()
    vim.hl.on_yank()
  end,
})

-- 4. LSP(言語サーバーは別に入れておく。例:npm i -g pyright)
vim.lsp.config("lua_ls", {
  cmd = { "lua-language-server" },
  filetypes = { "lua" },
  root_markers = { { ".luarc.json", ".luarc.jsonc" }, ".git" },
  settings = { Lua = { runtime = { version = "LuaJIT" } } },
})
vim.lsp.config("pyright", {
  cmd = { "pyright-langserver", "--stdio" },
  filetypes = { "python" },
  root_markers = { "pyproject.toml", "setup.py", "requirements.txt", ".git" },
})
vim.lsp.enable({ "lua_ls", "pyright" })

-- 診断をその行の右に文字で出す(既定は false)
vim.diagnostic.config({ virtual_text = true })

-- LSP がつながったら補完を有効にする
vim.api.nvim_create_autocmd("LspAttach", {
  group = vim.api.nvim_create_augroup("my.lsp", { clear = true }),
  callback = function(ev)
    local client = assert(vim.lsp.get_client_by_id(ev.data.client_id))
    if client:supports_method("textDocument/completion") then
      vim.lsp.completion.enable(true, client.id, ev.buf, { autotrigger = true })
    end
  end,
})

このファイルを LuaJIT 2.1 で読み込み、vim の呼び出しを記録する仮の表に差し替えて実行し、何が設定されるかを数えました(Neovim の中で動かした結果ではなく、構文と呼び出しの数の確認です)。

LuaJIT 2.1.1774896198
OK   min/init.lua
mapleader: ' '
options set: 15 ['number', 'relativenumber', 'expandtab', 'shiftwidth', 'tabstop', 'ignorecase', 'smartcase', 'signcolumn', 'clipboard', 'undofile', 'splitright', 'splitbelow', 'scrolloff', 'updatetime', 'completeopt']
keymaps: 9
   n <leader>w  保存
   n <leader>q  閉じる
   n <Esc>  検索の強調を消す
   n <C-h>  左のウィンドウへ
   n <C-j>  下のウィンドウへ
   n <C-k>  上のウィンドウへ
   n <C-l>  右のウィンドウへ
   t <Esc><Esc>  端末モードを抜ける
   n <leader>e  診断を浮動ウィンドウで表示
autocmds: ['TextYankPost', 'LspAttach']
lsp.config: ['lua_ls cmd=lua-language-server', 'pyright cmd=pyright-langserver']
lsp.enable: ['lua_ls', 'pyright']

Neovim の Lua は LuaJIT(Lua 5.1 相当)です。Lua 5.4 の書き方(整数除算の // など)は使えません。

オプションの書き方(vim.opt・vim.o・vim.bo・vim.wo)

ヘルプの lua-guide にある書き分けです。

書き方 Vimscript の対応 使う場面
vim.opt.number = true :set number ふつうの設定。リストの値を表で書ける
vim.opt.shortmess:append({ I = true }) :set shortmess+=I 今の値に足す・前に足す・外す
vim.o.number = true :let &number = 1 値を直接読み書きする(print(vim.o.tabstop))
vim.opt_local・vim.bo・vim.wo :setlocal そのバッファ・ウィンドウだけ変える
vim.g.mapleader = " " :let g:mapleader = " " グローバル変数(プラグインの設定にも使う)

vim.opt.smarttab を print すると大きな表が出ます。値だけを見るときは vim.opt.smarttab:get() か vim.o.smarttab を使います。

キーマップの書き方(vim.keymap.set)

vim.keymap.set(モード, キー, 動作, オプション) の形です。モードは "n"(ノーマル)・"i"(挿入)・"v"(ビジュアル)・"t"(端末)で、{ "n", "v" } のように複数も書けます。動作には、コマンドの文字列("<cmd>write<CR>")か Lua の関数を渡します。desc に説明を書くと、キーマップの一覧やプラグインの画面に表示されます。

init.lua を分ける

設定が長くなったら、lua/ フォルダにファイルを分け、require で読みます。require("config.options") は lua/config/options.lua を読みます。

~/.config/nvim/
├── init.lua               -- require("config.options") と require("config.lazy") だけ
└── lua/
    ├── config/
    │   ├── options.lua    -- オプションとキーマップ
    │   └── lazy.lua       -- lazy.nvim の読み込み
    └── plugins/
        ├── editor.lua     -- 配色・検索・Git
        └── lsp.lua        -- LSP・Treesitter

Vimの設定(.vimrc)を引き継ぐ

ヘルプの nvim-from-vim の手順です。init.vim に次の3行を書くと、Neovim が ~/.vimrc と ~/.vim を読みます。

set runtimepath^=~/.vim runtimepath+=~/.vim/after
let &packpath = &runtimepath
source ~/.vimrc

init.lua と init.vim は同時に置けません。Lua で書く場合は、init.lua の中で vim.cmd("source ~/.vimrc") のように Vimscript を読む方法があります。Neovim に無い Vim のオプション(ttymouse など)は、if !has('nvim') で囲みます。

プラグイン管理(lazy.nvim と vim.pack)

この節では、プラグインを入れる2つの方法を比べ、それぞれの設定の全文を示します。

lazy.nvim(外部のプラグイン)

Neovim 0.8.0 以上で使える

イベント・コマンド・キー・ファイルの種類で遅延読み込み

管理画面(:Lazy)と起動時間の計測がある

ロックファイルは lazy-lock.json

vim.pack(0.12 の組み込み)

Neovim 0.12 以上。プラグインを入れなくてよい

Git だけで動く。ヘルプでは「まだ実験的」

遅延読み込みの仕組みは持たない

ロックファイルは nvim-pack-lock.json

状況 選ぶもの 理由
プラグインが10個以上・起動の速さを詰めたい lazy.nvim 遅延読み込みと :Lazy profile がある
LazyVim を使う lazy.nvim LazyVim は lazy.nvim の上に作られている
プラグインが少ない・追加の道具を減らしたい vim.pack 本体だけで入れる・更新する・消すができる
0.11 以前も使う lazy.nvim vim.pack は 0.12 から
版をチームや複数の PC でそろえたい どちらも可 ロックファイルを Git で管理する

lazy.nvimの設定(公式の Structured Setup)

lazy.nvim のドキュメントが勧める形です。init.lua から読む lua/config/lazy.lua に、lazy.nvim 自身を取ってくる処理(bootstrap)を書きます。

-- ~/.config/nvim/init.lua
require("config.options")
require("config.lazy")
-- ~/.config/nvim/lua/config/lazy.lua(lazy.nvim 公式の Structured Setup)
-- Bootstrap lazy.nvim
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
  local lazyrepo = "https://github.com/folke/lazy.nvim.git"
  local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
  if vim.v.shell_error ~= 0 then
    vim.api.nvim_echo({
      { "Failed to clone lazy.nvim:\n", "ErrorMsg" },
      { out, "WarningMsg" },
      { "\nPress any key to exit..." },
    }, true, {})
    vim.fn.getchar()
    os.exit(1)
  end
end
vim.opt.rtp:prepend(lazypath)

-- Setup lazy.nvim
require("lazy").setup({
  spec = {
    -- import your plugins
    { import = "plugins" },
  },
  install = { colorscheme = { "habamax" } },
  checker = { enabled = true },
})

mapleader は lazy.nvim を読む前に決めます。 後から決めると、プラグインの keys に書いた <leader> が意図と違うキーになります。上の構成では config/options.lua で先に設定しています。

プラグインは lua/plugins/ の下のファイルに、表(spec)を返す形で書きます。

-- ~/.config/nvim/lua/plugins/editor.lua
return {
  -- 配色。起動時に読む(lazy = false)、ほかより先に読む(priority)
  {
    "folke/tokyonight.nvim",
    lazy = false,
    priority = 1000,
    config = function()
      vim.cmd.colorscheme("tokyonight")
    end,
  },
  -- あいまい検索(ファイル・文字列・バッファ)。コマンドかキーで初めて読む
  {
    "nvim-telescope/telescope.nvim",
    dependencies = { "nvim-lua/plenary.nvim" },
    cmd = "Telescope",
    keys = {
      { "<leader>ff", "<cmd>Telescope find_files<CR>", desc = "ファイルを探す" },
      { "<leader>fg", "<cmd>Telescope live_grep<CR>", desc = "文字列で探す" },
      { "<leader>fb", "<cmd>Telescope buffers<CR>", desc = "開いているバッファ" },
    },
  },
  -- Git の差分を行番号の横に出す。ファイルを開いたときに読む
  {
    "lewis6991/gitsigns.nvim",
    event = { "BufReadPre", "BufNewFile" },
    opts = {},
  },
}
-- ~/.config/nvim/lua/plugins/lsp.lua
return {
  -- 言語サーバーごとの設定集(lsp/*.lua)。読み込むだけで vim.lsp.config が見つける
  {
    "neovim/nvim-lspconfig",
    lazy = false,
    config = function()
      vim.lsp.enable({ "pyright", "lua_ls", "ts_ls" })
    end,
  },
  -- 構文解析器(パーサー)を入れる。遅延読み込みには対応していない
  {
    "nvim-treesitter/nvim-treesitter",
    lazy = false,
    build = ":TSUpdate",
  },
}

5つのファイルを LuaJIT 2.1 で読み、各 spec がどの読み込み方を使っているかを書き出しました。

OK   lazy/init.lua
OK   lazy/lua/config/lazy.lua
OK   lazy/lua/config/options.lua
OK   lazy/lua/plugins/editor.lua
OK   lazy/lua/plugins/lsp.lua
editor.lua folke/tokyonight.nvim ['lazy', 'priority']
editor.lua nvim-telescope/telescope.nvim ['cmd', 'keys', 'dependencies']
editor.lua lewis6991/gitsigns.nvim ['event']
lsp.lua neovim/nvim-lspconfig ['lazy']
lsp.lua nvim-treesitter/nvim-treesitter ['lazy', 'build']

lazy.nvimのspecの書き方(早見表)

lazy.nvim のドキュメント(Plugin Spec)から、よく使う項目です。

項目 意味 例
[1] プラグインの短い名前(GitHub の 作者/名前) "lewis6991/gitsigns.nvim"
lazy true で必要になるまで読まない 配色は lazy = false
event このイベントで読む { "BufReadPre", "BufNewFile" }
cmd このコマンドを打ったときに読む "Telescope"
ft このファイルの種類を開いたときに読む "markdown"
keys このキーを押したときに読む { "<leader>ff", ... }
dependencies 一緒に読むプラグイン { "nvim-lua/plenary.nvim" }
opts require(名前).setup(opts) に渡す設定 opts = {} で既定のまま setup
config 読んだときに実行する関数 配色を当てる
build 入れた・更新したときに実行する ":TSUpdate"
priority 起動時に読むプラグインの順番(既定 50) 配色は 1000
version 使う版(Semver の範囲) "*" で最新のリリース

:Lazyのコマンド

コマンド 何をするか
:Lazy 管理画面を開く(? でキーの説明)
:Lazy sync install・clean・update をまとめて実行
:Lazy update 更新してロックファイルを書き換える
:Lazy restore ロックファイルの版に戻す
:Lazy clean spec から消したプラグインを削除
:Lazy profile 起動時間の内訳を表示
:Lazy health :checkhealth lazy を実行

vim.packの設定(0.12 の組み込み)

ヘルプの pack.txt の例をもとにした init.lua です。

-- ~/.config/nvim/init.lua(Neovim 0.12 の組み込み vim.pack を使う形)
vim.g.mapleader = " "

vim.pack.add({
  "https://github.com/neovim/nvim-lspconfig",
  "https://github.com/lewis6991/gitsigns.nvim",
  { src = "https://github.com/folke/tokyonight.nvim", version = vim.version.range("4") },
})

vim.cmd.colorscheme("tokyonight")
require("gitsigns").setup()
vim.lsp.enable({ "pyright", "lua_ls" })

ヘルプによると、vim.pack.add() は入っていないプラグインを Git で取得し、stdpath("data") の下の site/pack/core/opt に置きます。add() の直後から、そのプラグインのコードを使えます。 version には、ブランチ名・タグ・コミット、または vim.version.range() の範囲を書きます。tokyonight.nvim には v4.14.1 などの Semver のタグがあり、range("4") は 4 系の最新を指します。

操作 書き方 補足
入れる vim.pack.add({ ... }) init.lua に書き、:restart
更新する :lua vim.pack.update() 確認画面で :write すると確定、:quit で取り消し
一覧を見る :lua vim.pack.update(nil, { offline = true }) ネットにつながずに確認画面を開く
消す init.lua から消して :restart のあと vim.pack.del({ "名前" }) 先に init.lua から消さないと入れ直される
版を固定する version にロックファイルの rev を書く ロックファイルは手で直さない

ロックファイル nvim-pack-lock.json は設定フォルダ(~/.config/nvim)にできます。Git で設定と一緒に管理すると、別の PC で同じ版がまとめて入ります。

LSPの設定(補完・定義ジャンプ・診断)

この節では、LSP の仕組みを実際のやりとりで見せ、0.11 以降の設定方法を説明します。

LSP(Language Server Protocol)は、エディタと「言語サーバー」の間の共通の約束事です。 補完・定義へのジャンプ・エラー表示などは言語サーバーが計算し、Neovim はその結果を表示します。Neovim に入っているのはクライアントだけで、言語サーバーは言語ごとに別に入れます。

flowchart TD
    A[Python ファイルを開く] --> B[Neovim が filetypes と<br>root_markers で判定]
    B --> C[cmd の言語サーバーを起動<br>pyright-langserver --stdio]
    C --> D[initialize で<br>できることを交換]
    D --> E[didOpen で本文を送る]
    E --> F[診断と補完の結果を表示]

言語サーバーとのやりとりを実物で見る

Neovim がしていることを確かめるため、pyright 1.1.414(npm i pyright)の言語サーバーを起動し、Python から同じ形の JSON-RPC を送りました。開いたファイルは次の7行で、6行目に型の誤り、7行目に書きかけの os.pa があります。

import os

def add(a: int, b: int) -> int:
    return a + b

result: str = add(1, 2)
os.pa

送ったメッセージの先頭です。Content-Length の見出しの後に JSON が続く形で、標準入出力(--stdio)を通ります。

=== sent (raw, first 160 bytes) ===
b'Content-Length: 349\r\n\r\n{"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"processId": 14903, "rootUri": "file:///tmp/lspdemo", "clientInfo": {"name'

返ってきた内容です。

=== initialize result ===
serverInfo: None
capability keys: 16
  hoverProvider: {}
  definitionProvider: {}
  referencesProvider: {}
  renameProvider: {"prepareProvider": true}
  documentSymbolProvider: {}
  codeActionProvider: {}
  signatureHelpProvider: {"triggerCharacters": ["(", ",", ")"]}
  completionProvider: {"triggerCharacters": [".", "[", "\"", "'"], "resolveProvider": true}
initialize took 0.44s
=== publishDiagnostics ===
  line 6 col 15 severity=1 'Type "int" is not assignable to declared type "str"\n\xa0\xa0"int" is not assignable to "str"'
  line 7 col 4 severity=1 '"pa" is not a known attribute of module "os"'
=== completion at 'os.pa' ===
  items: 51 ['__package__', '__path__', '_path', 'path', 'defpath', 'pardir', 'pathsep', 'POSIX_FADV_NORMAL']
=== definition of add (line 6) ===
  [{"uri": "file:///tmp/lspdemo/main.py", "range": {"start": {"line": 2, "character": 4}, "end": {"line": 2, "character": 7}}}]
server exit code: 0
16個pyright が返した機能の数hover・rename・補完など
2件開いた直後に届いた診断型の誤りと、無い属性
51件os.pa での補完の候補並べ替えは Neovim 側で行う

この結果と Neovim の動きは、次のように対応します。

言語サーバーの返事 Neovim での見え方
completionProvider の triggerCharacters . などを打つと補完が出る(autotrigger = true のとき)
signatureHelpProvider の ( , 挿入モードの Ctrl-s で引数の説明
publishDiagnostics ]d で移れるエラー・警告。virtual_text で行末に表示
definition の行と桁(0 から数える) Ctrl-] で定義へ移る(tagfunc に LSP が入る)
renameProvider grn で名前を一括変更

vim.lsp.config と vim.lsp.enable(0.11 以降)

0.11 から、LSP の設定は2つの関数で書きます。

関数 役割
vim.lsp.config('名前', { ... }) 設定を定義・上書きする(cmd・filetypes・root_markers・settings)
vim.lsp.enable('名前') その設定を有効にする。filetypes のファイルを開くと起動する

設定の中身は自分で書くほか、nvim-lspconfig を入れると、その中の lsp/*.lua を vim.lsp.config が自動で見つけます。2026年10月22日時点で nvim-lspconfig の lsp/ には 421 個の設定がありました。pyright の設定(lsp/pyright.lua)の中心部分です。

return {
  cmd = { 'pyright-langserver', '--stdio' },
  filetypes = { 'python' },
  root_markers = {
    'pyrightconfig.json',
    'pyproject.toml',
    'setup.py',
    'setup.cfg',
    'requirements.txt',
    'Pipfile',
    '.git',
  },
  settings = {
    pyright = {
      disableTaggedHints = true,
    },
    python = {
      analysis = {
        autoSearchPaths = true,
        useLibraryCodeForTypes = true,
        diagnosticMode = 'openFilesOnly',
      },
    },
  },
}

nvim-lspconfig の README では、require('lspconfig').pyright.setup{} の書き方は非推奨です。 0.11 以降は vim.lsp.config と vim.lsp.enable を使い、nvim-lspconfig は「設定の集まり」として入れます。nvim-lspconfig 自体は Neovim 0.11.3 以上を求めます。

LSPを有効にする手順

1

言語サーバーを入れる

Python なら npm i -g pyright、TypeScript なら typescript-language-server、Lua なら lua-language-server。コマンドが PATH から実行できる状態にします。

サーバーは Neovim とは別に入れる

2

設定を用意する

nvim-lspconfig を入れるか、vim.lsp.config() で cmd・filetypes・root_markers を書きます。

PATH に無いサーバーは cmd にフルパス

3

有効にする

init.lua に vim.lsp.enable('pyright') を書き、:restart。

複数なら表で渡す

4

つながったか確かめる

プロジェクトの中のファイルを開き、:checkhealth vim.lsp で、そのバッファにクライアントがつながっているかを見ます。

root_markers のファイルがあるか

補完の設定

Neovim の補完は、組み込みの仕組みだけで LSP の候補を出せます。

方法 書き方 補足
手で出す 挿入モードで Ctrl-x Ctrl-o LSP がつながると omnifunc が自動で設定される
自動で出す(LSP) vim.lsp.completion.enable(true, client.id, buf, { autotrigger = true }) 上の init.lua の LspAttach の部分
入力中に出す(0.12) vim.o.autocomplete = true Ctrl-n と同じ候補を自動で出す
候補を決める Ctrl-y Ctrl-n・Ctrl-p で上下

ヘルプでは、自動で出す補完は 'completeopt' に noselect を入れると使いやすいと書かれています。さらに多機能な補完(スニペット・複数の候補元の合成)が欲しい場合は、blink.cmp などのプラグインを使う方法もあります。

Treesitterの設定(構文ハイライト)

この節では、Treesitter が何をするかと、パーサーの足し方を説明します。

Treesitter は、ファイルを構文木(プログラムの構造)として解析する仕組みです。 正規表現の色付けより正確に、関数・変数・文字列などを見分けます。Neovim のヘルプでは、まだ実験的な機能とされています。

0.12.6 に最初から入っているパーサーは、C・Lua・Markdown・Vimscript・Vimdoc・Treesitter のクエリの6つです。ほかの言語は、パーサーを足します。

やりたいこと 書き方
パーサーを入れる nvim-treesitter で require('nvim-treesitter').install { 'python', 'java' }
パーサーを更新する :TSUpdate
色付けを有効にする FileType の自動コマンドで vim.treesitter.start()
構文で折りたたむ vim.wo[0][0].foldexpr = 'v:lua.vim.treesitter.foldexpr()' と foldmethod = 'expr'
構文の単位で選ぶ(0.12) ビジュアルモードで an・in・]n・[n

nvim-treesitter の README の色付けの例です。

vim.api.nvim_create_autocmd('FileType', {
  pattern = { 'python', 'java', 'typescript' },
  callback = function() vim.treesitter.start() end,
})

nvim-treesitter は main ブランチで作り直されました。 README は「互換性のない全面的な作り直し」と書き、Neovim 0.12.0 以上・tar と curl・tree-sitter-cli 0.26.1 以上(npm ではなくパッケージマネージャーで入れる)・C コンパイラを求めています。0.11 のまま使う場合は、更新が止められた master ブランチを指定します。

NeovimとVS Codeの違い

この節では、VS Code と比べて、どちらが向いているかを判断する材料を表にします。

どこで動くか

Neovimターミナルの中。SSH 先でもそのまま使える
↔
VS CodeGUI のアプリ。リモートは拡張機能でつなぐ

GUI が無いサーバーでは Neovim が使いやすい

設定の書き方

Neoviminit.lua(Lua のプログラム)
↔
VS Codesettings.json と設定画面

Neovim は条件分岐や関数で設定を組み立てられる

最初の状態

NeovimLSP クライアントはあるが、言語サーバーと設定は自分で足す
↔
VS Code拡張機能を入れると言語サーバーも一緒に入ることが多い

始めるまでの手間は VS Code のほうが少ない

観点 Neovim 0.12 VS Code
操作 モードとキーで編集(Vim と同じ) マウスとショートカット。Vim 操作は拡張機能
拡張 Lua のプラグイン(GitHub から取得) Marketplace の拡張機能
LSP 組み込みのクライアント 拡張機能ごとにクライアントを持つ
デバッガー nvim-dap などのプラグイン 組み込み(Debug Adapter Protocol)
AI のコード補完 プラグインで追加 GitHub Copilot などを拡張機能で
両方を使う vscode-neovim で VS Code の中に Neovim を埋め込む 拡張 ID は asvetliakov.vscode-neovim

vscode-neovim は「Vim mode for VSCode, powered by Neovim」と紹介され、VS Code の中で本物の Neovim を動かします。Neovim 0.10.0 以上が要ります。VS Code 側の設定は、関連記事「VS Code settings.jsonおすすめ設定|コピペ用全文と各項目解説」で扱っています。

よくあるエラーと直し方

この節では、init.lua や LSP でよく出るエラーの原文と、原因・直し方をまとめます。Lua の構文エラーは、LuaJIT 2.1 で実際に出したものです。Neovim では、この文の前に E5113 などの番号と「Lua chunk:」が付いて表示されます(ヘルプの message.txt)。

エラー・症状(原文) 原因 直し方
'=' expected near 'relativenumber' init.lua に Vimscript の set relativenumber を書いた vim.opt.relativenumber = true と書く
'}' expected (to close '{' at line 2) near '{' 表の要素の間のカンマが無い 前の行の末尾に , を足す
unexpected symbol near '}' function() を end で閉じていない end を足す
module 'config.lazzy' not found: require の名前と lua/ 下のファイル名が違う lua/config/lazy.lua の名前に合わせる
E492: Not an editor command: Lazy lazy.nvim が読み込まれていない bootstrap の部分と require("config.lazy") を確かめる
'pyright-langserver' is not executable. 言語サーバーが入っていない・PATH に無い サーバーを入れるか、cmd にフルパス
clipboard: No clipboard tool. :help clipboard OS のクリップボードの道具が無い Linux は xclip・xsel・wl-copy、SSH は OSC 52
attempt to call field 'enable' (a nil value) Neovim が 0.10 以前で vim.lsp.enable が無い(apt の 0.9.5 など) GitHub か Homebrew の 0.12 を入れる

require の名前を間違えたときの出力です(LuaJIT 2.1。Neovim では探す場所の行が Neovim の runtimepath になります)。

d.lua:1: module 'config.lazzy' not found:
    no field package.preload['config.lazzy']
    no file './lua/config/lazzy.lua'
    no file './lua/config/lazzy/init.lua'

LSPが動かないときの確認

  • 1Neovim は 0.11 以上かnvim --version の1行目。apt の 0.9.5 では vim.lsp.config が無い
  • 2言語サーバーのコマンドが端末で動くか例:pyright-langserver --version。動かなければ PATH を直す
  • 3vim.lsp.enable を書いたかnvim-lspconfig を入れただけでは有効にならない
  • 4ファイルの種類が filetypes に入っているか:set filetype? で確かめる。拡張子とファイルの種類の名前は違うことがある
  • 5root_markers のファイルがあるかpyproject.toml や .git が無いフォルダでは、サーバーによっては起動しない
  • 6:checkhealth vim.lsp に ERROR が無いかつながったクライアントと、使われた設定の中身が表示される

クリップボードが共有されない

vim.opt.clipboard = "unnamedplus" を書いても OS のクリップボードに入らないときは、道具が見つかっていません。ヘルプ(provider.txt)が挙げる道具と、探す順番です。

環境 使われる道具
Mac pbcopy・pbpaste(最初から入っている)
Linux(Wayland) wl-copy・wl-paste
Linux(X11) xsel か xclip
Windows win32yank・clip(PowerShell)
tmux の中 tmux($TMUX があるとき)
SSH の先 OSC 52(端末が対応していれば)

:checkhealth vim.provider で、どの道具が見つかったかを確かめられます。tmux と組み合わせる設定は、関連記事「tmuxの使い方|キーバインド早見表とコピペ用.tmux.conf」で扱っています。

日本語入力(IME)がオンのままになる

挿入モードで日本語を打ってから Esc で抜けると、IME がオンのままになり、ノーマルモードのキーが日本語として入力されます。Neovim 本体には IME を切り替える機能は無いため、挿入モードを抜けたとき(InsertLeave の自動コマンド)に、IME を切り替える外部のコマンド(Mac・Windows の im-select など)を呼ぶ方法が使われます。

-- 例:挿入モードを抜けたら英字入力に切り替える(im-select を入れた Mac)
vim.api.nvim_create_autocmd("InsertLeave", {
  callback = function()
    vim.fn.jobstart({ "im-select", "com.apple.keylayout.ABC" })
  end,
})

最初からそろった設定を使う(LazyVim・kickstart.nvim)

この節では、ゼロから書かずに始める方法を2つ紹介します。

名前 何か 求めるもの
LazyVim lazy.nvim の上に作られた、すぐ使える設定一式 Neovim 0.11.2 以上・Git 2.19.0 以上。Nerd Font は任意
kickstart.nvim 自分の設定の「出発点」になる1つの init.lua 最新の安定版か nightly

kickstart.nvim の README は、自身を「ディストリビューションではなく、設定の出発点」と説明しています。Linux・Mac では次の1行で設定フォルダに置きます(先に今の設定を退避します)。

git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim

今の設定を残したまま試すなら、NVIM_APPNAME が使えます。 別の名前のフォルダ(例:~/.config/nvim-kickstart)に clone し、NVIM_APPNAME=nvim-kickstart nvim で起動すると、プラグインのデータも別のフォルダ(~/.local/share/nvim-kickstart)に分かれます。

起動が遅いときの測り方

この節では、起動の時間を測る方法をまとめます。

方法 コマンド 分かること
起動のログを取る nvim --startuptime startup.log 設定・プラグイン・最初のファイルを開くまでの、処理ごとの時間
設定なしと比べる nvim --clean --startuptime clean.log 本体だけの時間。差が設定とプラグインの分
プラグインごとに見る :Lazy profile lazy.nvim で読んだプラグインごとの時間

ヘルプによると --startuptime は、同じファイル名があると追記します。測り直すときはファイルを消してから実行します。遅いプラグインが見つかったら、lazy.nvim の event・cmd・keys・ft で、使うときまで読まないようにします。

よくある質問

Q. Neovim とは何ですか? A. Vim をもとに作られたオープンソースのテキストエディタです。Vim と同じ操作のまま、Lua で設定でき、LSP クライアントと Tree-sitter を組み込んでいます。コマンドは nvim です。

Q. Neovim の読み方は? A. 「ネオビム」と読みます。Vim(ヴィム)に「新しい」を意味する Neo を付けた名前です。

Q. Neovim と Vim の違いは? A. 編集の操作は同じで、設定の言語(Lua)、組み込みの LSP・Treesitter、最初からの設定(hlsearch・autoindent などがオン)が違います。「NeovimとVimの違い」の表にまとめています。

Q. Neovim のインストール方法は? A. Mac は brew install neovim、Windows は winget install Neovim.Neovim、Linux は GitHub の tar.gz を /opt に展開します。Ubuntu 24.04 の apt は 0.9.5 で、LSP の新しい設定方法が使えません。

Q. Neovim の設定ファイル(init.lua)はどこに置きますか? A. Linux・Mac は ~/.config/nvim/init.lua、Windows は ~/AppData/Local/nvim/init.lua です。:echo stdpath('config') で確かめられます。

Q. Neovim を終了するには? A. Esc でノーマルモードに戻り、:q で終了します。保存して終了は :wq、保存せずに終了は :q!、全部のウィンドウを閉じるなら :qa です。

Q. lazy.nvim と vim.pack はどちらを使えばよいですか? A. 遅延読み込みで起動を速くしたい・LazyVim を使うなら lazy.nvim、プラグインが少なく 0.12 以上だけで使うなら組み込みの vim.pack が向いています。「プラグイン管理」の判断表にまとめています。

Q. Neovim で LSP を使うには? A. 言語サーバー(例:pyright)を入れ、vim.lsp.config で設定し(または nvim-lspconfig を入れ)、vim.lsp.enable('pyright') を書きます。:checkhealth vim.lsp でつながったかを確かめます。

Q. Neovim と VS Code はどちらがよいですか? A. ターミナルや SSH 先で同じ環境を使いたい・キーボードだけで編集したいなら Neovim、すぐに始めたい・GUI のデバッガーを使いたいなら VS Code が向いています。vscode-neovim で両方を組み合わせる方法もあります。

Q. Neovim のおすすめのプラグインは? A. 役割で選びます。プラグイン管理(lazy.nvim)、LSP の設定集(nvim-lspconfig)、構文解析(nvim-treesitter)、あいまい検索(telescope.nvim)、Git の差分表示(gitsigns.nvim)が、記事の設定例で使っているものです。

まとめ

  • Neovim は Vim 互換のエディタで、Lua の init.lua で設定し、LSP クライアントと Treesitter を組み込んでいる。
  • Vim 9.1 と比べると、hlsearch・autoindent・hidden・autoread などが最初からオンで、文字コードは常に UTF-8。
  • 2026年10月22日時点の最新は 0.12.6。Ubuntu 24.04 の apt は 0.9.5 で、vim.lsp.config・nvim-lspconfig・vim.pack が使えない。
  • プラグイン管理は、遅延読み込みが要るなら lazy.nvim、0.12 以上で少ない数なら組み込みの vim.pack。
  • LSP は「言語サーバーを入れる → vim.lsp.config → vim.lsp.enable → :checkhealth vim.lsp」の順。言語サーバーは JSON-RPC で補完・診断・定義の位置を返す。
  • 困ったら nvim --clean で設定を外して切り分け、:checkhealth の ERROR から直す。

参考・出典

確認日はいずれも 2026年10月22日です。

  • Neovim 公式サイト:https://neovim.io/
  • Neovim(GitHub・v0.12.6):https://github.com/neovim/neovim/releases/tag/v0.12.6
  • Neovim INSTALL.md:https://github.com/neovim/neovim/blob/master/INSTALL.md
  • Neovim ヘルプ「vim_diff(Vim との違い・既定値)」:https://neovim.io/doc/user/vim_diff.html
  • Neovim ヘルプ「news(0.12 の変更点)」:https://neovim.io/doc/user/news.html
  • Neovim ヘルプ「starting(設定ファイル・XDG・NVIM_APPNAME)」:https://neovim.io/doc/user/starting.html
  • Neovim ヘルプ「lua-guide」:https://neovim.io/doc/user/lua-guide.html
  • Neovim ヘルプ「lsp」:https://neovim.io/doc/user/lsp.html
  • Neovim ヘルプ「treesitter」:https://neovim.io/doc/user/treesitter.html
  • Neovim ヘルプ「pack(vim.pack)」:https://neovim.io/doc/user/pack.html
  • Neovim ヘルプ「health(:checkhealth)」:https://neovim.io/doc/user/health.html
  • Neovim ヘルプ「provider(クリップボード)」:https://neovim.io/doc/user/provider.html
  • Neovim ヘルプ「support(対応プラットフォーム)」:https://neovim.io/doc/user/support.html
  • lazy.nvim:https://lazy.folke.io/
  • nvim-lspconfig:https://github.com/neovim/nvim-lspconfig
  • nvim-treesitter:https://github.com/nvim-treesitter/nvim-treesitter
  • LazyVim:https://www.lazyvim.org/
  • kickstart.nvim:https://github.com/nvim-lua/kickstart.nvim
  • vscode-neovim:https://github.com/vscode-neovim/vscode-neovim
  • Homebrew Formulae「neovim」:https://formulae.brew.sh/formula/neovim
  • Ubuntu Packages「neovim」:https://packages.ubuntu.com/search?keywords=neovim&searchon=names&exact=1
  • pyright:https://github.com/microsoft/pyright
  • Language Server Protocol Specification:https://microsoft.github.io/language-server-protocol/

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Neovimとは|インストール・init.lua設定・lazy.nvim・LSP入門」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?