Neovim(コマンド名はnvim)は、Vimの操作体系を受け継ぎ、設定をLuaで書けるターミナル型のテキストエディタです。最新の安定版は2026年10月9日公開の0.12.6で、プラグイン管理のvim.packとLSPクライアントが本体に入っています。この記事では、インストールから保存・終了、検索と置換、init.luaの書き方、プラグインとLSPの導入までを、使い始める順に説明します。掲載した設定とコマンドは、0.12.6の公式バイナリ(macOS版)で読み込み、エラーなく動くことを確認したものです。
まとめ:nvimの学習順序と設定の要点
- 最初の壁はモード。
iで入力、Escでノーマルモードへ戻り、:wで保存、:qで終了します。:Tutorで練習用の教材が開きます。 - 掲載コードをそのまま使うなら0.12以上を選ぶ。0.11ではプラグイン管理部分をlazy.nvimなどに置き換えます。Windowsは
winget install Neovim.Neovim、macOSはbrew install neovim。Ubuntu 24.04のaptは0.9.5なので、LSPの新しい設定方法が使えません。 - 設定は1ファイルの
init.luaから始める。場所はLinux・macOSが~/.config/nvim/init.lua、Windowsが~/AppData/Local/nvim/init.luaです。 - プラグインは0.12なら
vim.packで足りる。コマンドやイベント単位の遅延読み込みを宣言的に管理したいならlazy.nvimを選びます。 - LSPは
vim.lsp.enable()で有効化し、リネームgrnや参照一覧grrは既定のキーで使えます。
Neovimのインストールと初回起動
Windows・macOS・Linuxのインストールコマンド
公式のインストールページが案内するコマンドは次のとおりです。
| OS | コマンド・入手先 | 入る版の目安 |
|---|---|---|
| Windows | winget install Neovim.Neovim |
最新の安定版 |
| macOS | brew install neovim |
最新の安定版 |
| Ubuntu 26.04 | sudo apt install neovim |
0.11.6 |
| Ubuntu 24.04 | sudo apt install neovim |
0.9.5 |
| Linux共通 | GitHubのnvim-linux-x86_64.tar.gzまたは.appimage |
最新の安定版 |
Ubuntuの版はUbuntuのパッケージ情報で、24.04(noble)が0.9.5、26.04(resolute)が0.11.6です。0.9.5では後述のvim.lsp.config()(0.11で追加)もvim.pack(0.12で追加)も使えません。Ubuntuで新しい書き方を使うなら、GitHubのリリースページからtar.gzを展開し、bin/nvimを含む展開先のbinディレクトリをPATHに追加します。WindowsでWSL2のUbuntuに入れる場合も同じ判断になります。
nvim –versionと:checkhealthによる導入結果の確認
nvim --version
# NVIM v0.12.6
# Build type: Release
# LuaJIT 2.1.1774638290
版が表示されたらnvimで起動し、:checkhealthを実行します。クリップボード連携やLSPなど、足りない外部ツールが項目ごとにERROR・WARNINGで表示されます。
nvimの基本操作:モード切り替え・保存と終了・移動
4つのモードと切り替えキー
Neovimは「何を押すと何が起きるか」がモードで変わります。起動直後はノーマルモードで、ここで文字を打っても入力されません。
| モード | 入るキー | 用途 |
|---|---|---|
| ノーマル | Esc |
移動・削除・コピー |
| インサート | i a o |
文字の入力 |
| ビジュアル | v V Ctrl-v |
範囲選択(文字・行・矩形) |
| コマンドライン | : / |
保存・終了・検索・置換 |
保存・終了のコマンド
ファイル名を指定せずに起動した場合は、最初に:w memo.txtのように保存先を指定します。起動時にnvim memo.txtと指定しても構いません。
| コマンド | 動作 |
|---|---|
:w |
保存 |
:q |
終了(未保存の変更があると止まる) |
:wq または ZZ |
保存して終了 |
:q! |
変更を捨てて終了 |
:qa |
開いている全ウィンドウを閉じて終了 |
終了できないときは、まずEscを押してノーマルモードに戻ります。保存して終了するなら:wq、変更を破棄してよい場合だけ:q!を実行します。インサートモードのまま:qと打つと、文字として入力されるだけです。
移動・コピー・貼り付け・取り消しのキー
- 移動:
hjkl(左・下・上・右)、wb(単語単位)、0$(行頭・行末)、ggG(先頭行・最終行) - 削除とコピー:
dd(行を削除)、yy(行をコピー)、p(貼り付け)。NeovimのYは、Vimの行コピーと違いy$(カーソルから行末まで)と同じ動作です。 - 取り消し:
u(元に戻す)、Ctrl-r(やり直す)、.(直前の変更を繰り返す)
操作を体で覚えるには、Neovimに同梱の:Tutorが向いています。移動・削除・置換を、教材のテキストを実際に編集しながら練習する形式です。
ファイル内の検索と置換
検索はノーマルモードで/に続けて語を打ち、Enterで確定します。nで次、Nで前の一致へ移動し、カーソル下の単語は*で検索できます。大文字小文字を区別しない検索は、/\cwordのように\cを付けます。
:%s/foo/bar/g " ファイル全体のfooをbarへ置換
:%s/foo/bar/gc " 1件ずつ y/n で確認しながら置換
:10,20s/foo/bar/g " 10〜20行目だけ置換
:'<,'>s/foo/bar/g " 選択範囲が含まれる行全体を置換
Neovimはinccommandオプションの既定値がnosplitで、:%sを打っている途中から置換結果がバッファ上にプレビューされます。正規表現の誤りに確定前に気づけるので、Vimより置換を試しやすい点です。検索のハイライトが残ったら:nohlsearchで消します。
複数ファイル・画面分割・ターミナルの使い分け
| やりたいこと | コマンド・キー |
|---|---|
| 別のファイルを開く | :e path/to/file |
| 開いているファイル(バッファ)の一覧と切り替え | :ls、[b ]b |
| 横・縦に分割 | :split :vsplit |
| 分割したウィンドウ間の移動 | Ctrl-wのあとh j k l |
| タブを開く・切り替える | :tabnew、gt gT |
| 端末を開く | :terminal |
| 端末からノーマルモードへ戻る | Ctrl-\のあとCtrl-n |
:terminalで開いた端末は、入力中はターミナルモードになりEscがシェルへ渡ります。抜けるキーがCtrl-\ Ctrl-nと押しにくいので、後述のinit.luaでEsc2回に割り当てておくと楽になります。画面分割やセッションの保持を端末側で行いたい場合は、tmuxの使い方|Windows(psmux・WSL)の導入とコマンド・画面分割【3.7対応】と組み合わせる方法もあります。
設定しなくても使える既定のキーマップ
古い入門記事ではコメントアウトや診断の移動にプラグインを入れていますが、0.10と0.11で本体の既定キーマップに入りました。0.12.6でmaparg()を使って割り当てを確認した結果は次のとおりです。LSP系のキーは、言語サーバーが接続したバッファで機能します。
| キー | 動作 | 追加された版 |
|---|---|---|
gcc / gc(選択範囲) |
コメントの切り替え | 0.10 |
[d ]d |
前・次の診断へ移動 | 0.10 |
Ctrl-w d |
カーソル位置の診断を表示 | 0.10 |
K |
LSPのホバー(型・説明) | 0.10 |
grn |
名前の変更(リネーム) | 0.11 |
grr |
参照箇所の一覧 | 0.11 |
gra |
コードアクション | 0.11 |
gri |
実装へ移動 | 0.11 |
gO |
シンボル一覧 | 0.11 |
Ctrl-s(インサート) |
関数のシグネチャ表示 | 0.11 |
[q ]q / [b ]b |
quickfix・バッファの前後移動 | 0.11 |
追加された版は、0.11.0のnews.txtと各版の_defaults.luaで確かめています。0.10では既定のカラースキームも変わりました。従来の配色に戻すなら:colorscheme vimです。
init.luaの書き方:基本設定・キーマップ・自動コマンド
設定ファイルの場所と作り方
設定ファイルの置き場所は:echo stdpath('config')で確認できます。0.12.6のstarting.txtによると、既定はLinux・macOSが~/.config/nvim、Windowsが~/AppData/Local/nvimです。このフォルダにinit.luaを作ります。
次の作成コマンドはLinux・macOS向けです。Windowsでは、先に確認した設定フォルダにinit.luaを作成してください。
mkdir -p ~/.config/nvim
nvim ~/.config/nvim/init.lua
Vimscriptのinit.vimも読めますが、同じフォルダにinit.luaと両方を置くと、起動時にE5422: Conflicting configsが出ます。どちらか一方にします。Vimの.vimrcを引き継ぐ場合は、init.luaの中でvim.cmd('source ~/.vimrc')と読み込む方法があります。
最初に書く基本設定とキーマップ
次の内容は、行番号・インデント・検索・クリップボードの設定と、よく使うキーマップをまとめた最小構成です。0.12.6で読み込んで、各オプションの値が反映されることを確認しています。
-- 基本設定
vim.g.mapleader = " " -- <leader> をスペースにする
vim.opt.number = true -- 行番号
vim.opt.relativenumber = true -- 相対行番号
vim.opt.expandtab = true -- Tabをスペースにする
vim.opt.shiftwidth = 4
vim.opt.tabstop = 4
vim.opt.ignorecase = true -- 検索で大文字小文字を区別しない
vim.opt.smartcase = true -- 大文字を含むときだけ区別する
vim.opt.undofile = true -- 閉じても取り消し履歴を残す
vim.opt.clipboard = "unnamedplus" -- ヤンクをOSのクリップボードと共有
-- キーマップ(モード, キー, 実行内容, オプション)
vim.keymap.set("n", "<leader>w", "<cmd>write<CR>", { desc = "保存" })
vim.keymap.set("n", "<Esc>", "<cmd>nohlsearch<CR>")
vim.keymap.set("t", "<Esc><Esc>", [[<C-\><C-n>]], { desc = "ターミナルモードを抜ける" })
-- 自動コマンド:ヤンクした範囲を一瞬ハイライトする
vim.api.nvim_create_autocmd("TextYankPost", {
callback = function() vim.hl.on_yank() end,
})
vim.keymap.setの第1引数はモードで、"n"がノーマル、"i"がインサート、"t"がターミナルです。ヤンクのハイライトに使う関数は0.11でvim.highlightからvim.hlへ改名されました。古い記事のvim.highlight.on_yank()は0.12.6でも動きますが、新しく書くならvim.hlを使います。
クリップボード共有が効かないとき
clipboard = "unnamedplus"は、OS側のクリップボードツールがあって初めて効きます。macOSは標準のpbcopyを使うので追加作業は要りません。Linuxは、Waylandならwl-clipboard、X11ならxclipかxselを入れます(:help clipboard-tool)。:checkhealthのProvider欄でどのツールが使われているかを確認できます。
プラグインを入れる:0.12はvim.pack、0.11以前はlazy.nvim
vim.packによるプラグイン導入(0.12以降)
0.12で本体に入ったvim.packは、Gitリポジトリを指定してプラグインを取得・読み込みします。事前にGitが必要です。公式ドキュメントでは「実験的だが日常利用には十分安定」という位置付けです。
vim.pack.add({
"https://github.com/neovim/nvim-lspconfig",
})
初回はインストールの確認が表示され、取得先はstdpath('data')配下のsite/pack/core/optです。どの版を入れたかは設定フォルダのnvim-pack-lock.jsonにコミットIDで記録されます。このファイルを設定と一緒にGitで管理すれば、別のPCでも同じ版がそろいます。更新は:lua vim.pack.update()で、差分を確認してから:writeで確定します。
lazy.nvimによるプラグイン導入と遅延読み込み
lazy.nvim本体はNeovim 0.8.0以上とGit 2.19.0以上で動きます。読み込む各プラグインの必要な版はこれとは別なので、それぞれのREADMEで確認します。公式のインストール手順のbootstrapを短くすると次の形です。
vim.g.mapleader = " "
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable",
"https://github.com/folke/lazy.nvim.git", lazypath })
end
vim.opt.rtp:prepend(lazypath)
require("lazy").setup({
{ "folke/tokyonight.nvim", priority = 1000,
config = function() vim.cmd.colorscheme("tokyonight") end },
{ "nvim-telescope/telescope.nvim", dependencies = { "nvim-lua/plenary.nvim" },
cmd = "Telescope" }, -- :Telescope を実行したときに初めて読み込む
})
0.12.6でこの設定を読み込むと、4つのプラグインがstdpath('data')/lazyに入り、カラースキームが適用されました。telescope.nvimはcmdを指定したため、起動直後は読み込まれていません。:Lazyで一覧と更新画面が開きます。
vim.packとlazy.nvimの選び方
0.12以上で、イベントやコマンド単位の遅延読み込みを細かく設定する必要がなければ、vim.packを選びます。外部のマネージャーを入れる手間がなく、ロックファイルも標準で付きます。プラグインが多くて起動時間を詰めたい場合や、0.11以前の環境を残す場合はlazy.nvimが向いています。cmd・event・ftで読み込むタイミングを宣言でき、vim.packで同じことをするには自分で:packaddを書く必要があるためです。移行の詳細はNeovim 0.12系への移行手順:vim.packと内蔵LSP・自動補完の実装【0.12.6対応】にまとめています。
古い入門記事で見かけるdein.vimとpacker.nvimは、新規導入の候補から外します。dein.vimはREADMEで開発の停止と後継のdpp.vimを告知しており、packer.nvimはREADMEに「currently unmaintained」と書かれています。
LSPの補完・定義ジャンプ・リネーム設定
言語サーバーの導入とvim.lsp.enableによる有効化
Neovimが持っているのはLSPのクライアントだけで、言語ごとのサーバーは別に入れます。macOSでXcode Command Line Toolsを入れているなら、C・C++用のclangdが最初から使えます。サーバーの起動コマンドや対象ファイルを自分で書く代わりに、nvim-lspconfigを入れると定義済みの設定を名前で呼べます。nvim-lspconfigはNeovim 0.11.3以上が必要です。
vim.pack.add({ "https://github.com/neovim/nvim-lspconfig" })
vim.lsp.enable("clangd")
-- LSP接続後、サーバー指定のトリガー文字の入力時に補完候補を自動表示する
vim.api.nvim_create_autocmd("LspAttach", {
callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id)
if client:supports_method("textDocument/completion") then
vim.lsp.completion.enable(true, client.id, args.buf, { autotrigger = true })
end
end,
})
この設定で、未定義の変数を参照するCファイルを0.12.6で開くと、clangdが接続し「Use of undeclared identifier ‘y’」の診断が返りました。Kにはホバーが割り当てられ、Ctrl-]で定義へ移動できます(LSP接続時にtagfuncが設定されるため)。補完候補はCtrl-yで確定し、手動で呼び出すときはCtrl-x Ctrl-oを使います。nvim-lspconfigを使わずに書く場合は、LSPのドキュメントのクイックスタートどおり、vim.lsp.config('名前', { cmd = ..., filetypes = ..., root_markers = ... })で定義してからvim.lsp.enable('名前')を呼びます。
LSPが動かないときの確認
:checkhealth vim.lspで、設定が有効か・バッファに接続しているかを確認します。- サーバーのコマンド(
clangdやlua-language-server)が端末で実行できるかを確かめます。PATHに無いと起動しません。 - プロジェクトのルートが見つからないと接続しないサーバーがあります。
.gitやcompile_commands.jsonなどのroot_markersに当たるファイルがあるかを見ます。 - 0.12では
:lsp restart・:lsp stopで、接続中のクライアントを再起動・停止できます。
起動が遅いときの測り方
nvim --startuptime startup.log +q
startup.logには読み込んだファイルごとの所要時間(ミリ秒)が並び、最終行のNVIM STARTEDが起動完了までの合計です。2列目の値が大きい行のプラグインを、lazy.nvimのcmdやeventで後から読み込むようにすると短くなります。上のLSP設定を入れた状態で測った例では、init.luaの読み込みが約30ミリ秒、合計が約196ミリ秒でした(macOS・x86_64、ヘッドレス起動)。
Neovimの使い方でよくある質問
nvimで保存して終了するには?
Escでノーマルモードに戻り、:wqと打ってEnterを押します。保存せずに終了するなら:q!です。
Neovimで文字列を一括置換するには?
ファイル全体なら:%s/前/後/g、1件ずつ確認するなら末尾をgcにします。入力中から置換結果がプレビューされます。
init.luaはどこに作ればよいですか?
Linux・macOSは~/.config/nvim/init.lua、Windowsは~/AppData/Local/nvim/init.luaです。:echo stdpath('config')で実際のフォルダを表示できます。
WindowsでもNeovimは使えますか?
使えます。winget install Neovim.Neovimで入り、PowerShellからnvimで起動します。Linuxと同じ環境で使いたい場合は、WSL2とは?WSL1との違い・仕組み・インストール手順【WSL 3.0対応・2026年10月】のUbuntuに入れる方法もあります。その場合はaptの版が古い点に注意してください。
VimとNeovimはどちらを使えばよいですか?
基本操作は共通なので、どちらで覚えても使い回せます。設定をLuaで書きたい、LSPやプラグイン管理を本体の機能で済ませたい場合はNeovimです。サーバーに最初から入っているエディタを使う場面が多いなら、Vimの操作から覚えるほうが役立ちます。Vim側の基本はVimとは|テキストエディタの使い方・基本コマンドと他エディタとの違いで解説しています。