- 技術 💻
Neovimとは|インストール・init.lua設定・lazy.nvim・LSP入門
結論
Neovimは、Vimの操作のままLuaで設定でき、LSPを組み込んだテキストエディタです。コマンド名は nvim です。
この記事でわかること
- Vim 9.1 と比べた既定値12項目の表(実測)
- コピペ用 init.lua 3種(最小・lazy.nvim・vim.pack)
- LSP のやりとりの実物とエラー8種の直し方
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 では、組み込みのプラグイン管理(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 に入れる方法が向いています。
最新の安定版をダウンロードする
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz。arm64 の PC は nvim-linux-arm64.tar.gz にします。
/opt に展開する
sudo rm -rf /opt/nvim-linux-x86_64 で前の版を消してから、sudo tar -C /opt -xzf nvim-linux-x86_64.tar.gz。
PATH に足す
~/.bashrc か ~/.zshrc に export PATH="$PATH:/opt/nvim-linux-x86_64/bin" を書き、シェルを開き直します。
版を確かめる
nvim --version の1行目に版が出ます。which nvim で、どのファイルが動いているかも確かめます。
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
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を有効にする手順
言語サーバーを入れる
Python なら npm i -g pyright、TypeScript なら typescript-language-server、Lua なら lua-language-server。コマンドが PATH から実行できる状態にします。
設定を用意する
nvim-lspconfig を入れるか、vim.lsp.config() で cmd・filetypes・root_markers を書きます。
有効にする
init.lua に vim.lsp.enable('pyright') を書き、:restart。
つながったか確かめる
プロジェクトの中のファイルを開き、:checkhealth vim.lsp で、そのバッファにクライアントがつながっているかを見ます。
補完の設定
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 と比べて、どちらが向いているかを判断する材料を表にします。
どこで動くか
GUI が無いサーバーでは Neovim が使いやすい
設定の書き方
init.lua(Lua のプログラム)settings.json と設定画面Neovim は条件分岐や関数で設定を組み立てられる
最初の状態
始めるまでの手間は 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期連続の黒字決算。