---
title: "Neovim（nvim）の使い方｜基本操作・init.lua設定・プラグイン・LSP【0.12.6対応】"
url: "https://www.issoh.co.jp/tech/details/5870/"
published: 2025-03-17
updated: 2026-10-20
categories: ["開発"]
publisher: "株式会社一創"
---

# Neovim（nvim）の使い方｜基本操作・init.lua設定・プラグイン・LSP【0.12.6対応】

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のインストールコマンド

公式の[インストールページ](https://neovim.io/doc/install/)が案内するコマンドは次のとおりです。

| 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のパッケージ情報](https://packages.ubuntu.com/noble/editors/neovim)で、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のリリースページ](https://github.com/neovim/neovim/releases)から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`と打つと、文字として入力されるだけです。

### 移動・コピー・貼り付け・取り消しのキー

- 移動：`h` `j` `k` `l`（左・下・上・右）、`w` `b`（単語単位）、`0` `$`（行頭・行末）、`gg` `G`（先頭行・最終行）
- 削除とコピー：`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`で`Esc`2回に割り当てておくと楽になります。画面分割やセッションの保持を端末側で行いたい場合は、[tmuxの使い方｜Windows(psmux・WSL)の導入とコマンド・画面分割【3.7対応】](/tech/details/9564/)と組み合わせる方法もあります。

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

古い入門記事ではコメントアウトや診断の移動にプラグインを入れていますが、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](https://raw.githubusercontent.com/neovim/neovim/v0.11.0/runtime/doc/news.txt)と各版の`_defaults.lua`で確かめています。0.10では既定のカラースキームも変わりました。従来の配色に戻すなら`:colorscheme vim`です。

## init.luaの書き方：基本設定・キーマップ・自動コマンド

### 設定ファイルの場所と作り方

設定ファイルの置き場所は`:echo stdpath('config')`で確認できます。[0.12.6のstarting.txt](https://raw.githubusercontent.com/neovim/neovim/v0.12.6/runtime/doc/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](https://github.com/folke/lazy.nvim)本体はNeovim 0.8.0以上とGit 2.19.0以上で動きます。読み込む各プラグインの必要な版はこれとは別なので、それぞれのREADMEで確認します。公式の[インストール手順](https://lazy.folke.io/installation)の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対応】](/tech/details/17440/)にまとめています。

古い入門記事で見かける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](https://github.com/neovim/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のドキュメント](https://neovim.io/doc/user/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月】](/tech/details/3410/)のUbuntuに入れる方法もあります。その場合はaptの版が古い点に注意してください。

### VimとNeovimはどちらを使えばよいですか？

基本操作は共通なので、どちらで覚えても使い回せます。設定をLuaで書きたい、LSPやプラグイン管理を本体の機能で済ませたい場合はNeovimです。サーバーに最初から入っているエディタを使う場面が多いなら、Vimの操作から覚えるほうが役立ちます。Vim側の基本は[Vimとは｜テキストエディタの使い方・基本コマンドと他エディタとの違い](/tech/details/4840/)で解説しています。

## 関連記事

- [Neovim 0.12系への移行手順：vim.packと内蔵LSP・自動補完の実装【0.12.6対応】](/tech/details/17440/)
- [Vimとは｜テキストエディタの使い方・基本コマンドと他エディタとの違い](/tech/details/4840/)
- [denops.vimとは｜Deno 2でVim/Neovimプラグインを書く仕組みと導入・開発手順【v8対応】](/tech/details/12611/)
- [Firenvimとは？ブラウザのテキストエリアでNeovimを使う設定と切り分け手順](/tech/details/10295/)
- [tmuxの使い方｜Windows(psmux・WSL)の導入とコマンド・画面分割【3.7対応】](/tech/details/9564/)

---

出典: [Neovim（nvim）の使い方｜基本操作・init.lua設定・プラグイン・LSP【0.12.6対応】](<https://www.issoh.co.jp/tech/details/5870/>)（株式会社一創）
