AI時代の入門Neovim
2025-12-09 18:33
こんにちは。
この記事はLivetoon Tech Advent Calendar 2025の9日目の記事らしいです。 定番の文句にお付き合いください。
Livetoonと言うところでは、AIキャラクターとお話ができるアプリであるkaiwaというプロダクトをやっています。 私もインフラなどの面倒をみました。 今回のアドベントカレンダーでは、そんなLivetoonのメンバーがアプリ、LLM、音声合成、インフラ、GPUなど色々な話をするらしいです。 ぜひ記事を追ってみてくださいね。
AI時代らしい
さて、大きなタイトルに出ましたが、近年はAI時代ということで、Livetoonでも積極的にAIを用いた開発を行なっています。 私もCodexやClaude Codeなどを多用します。 まぁWeb開発分野においては、ですが。
さて、そんなAI時代では、サーバにSSHに入ってエージェントを動かして放置すれば、開発がよしなに進むようになりました。 私はiPad ProでSSHを繋ぎ、tmuxでNeovimとCodexのウインドウを開き、と言った開発スタイルが定着してきました。 もちろん、家や研究室ではMacBookなどを使うのですが、外でサッと開発するには、このスタイルが一番楽です。 Neovimは大概軽量なので、重さで困ることもありません。
そんな話を社内でしたところ、「Neovimいいなあ」「ターミナルだけでサッと開発できるのは魅力的」と言う声が聞こえてきたので、本記事を書くこととしました。 AI時代に即した内容かどうかは不明ですが、AIとの併用を踏まえ、どのようにしてNeovimに入門するか、そして自分が行ったことを書いていきたいと思います。
まず初めに:モードを切り替えよう
まずNeovimを起動しましょう。
nvim [ファイル] で起動できます。
さて、まずはNeovimと言うかVim系の概念に慣れるところからがスタートです。 Vim系のエディタはもれなく、モードという概念が存在しています。 Normalモードから各モードへモード切り替えを行い、編集をしていくわけです。
なんでそんな煩わしいことを?と思われるかもしれませんが、これがなかなか便利なのです。
例えば、NormalモードとInsertモードを例にして考えてみましょう。
Vim系のエディタでは、Normalモードで hjkl が左下上右にマップされています。
これにより、カーソルの移動が矢印キーを使うことなく実現できるのです。
矢印キーというのは意外と使いづらく、矢印キーのために指を動かすのは時間のロスだったり、そもそもノートパソコンなどでは矢印キーが小さくてミスタイプの原因になったりします。
そのため、Normalモードのこのマップは非常に便利です。
ではどうやって hjkl の文字を入力するのでしょうか。
ここでInsertモードへ切り替えです。
Normalモードで i を入力すると、Insertモードに切り替わります。
Insertモードはいわゆる一般的なテキスト編集モードで、普通に入力ができます。
カーソルを動かしたくなったら、EscapeキーでNormalモードに戻ります。
モード切り替えによって、キー入力の意味が変わる。 それはキー操作がしやすくなることにつながる、と覚えていただければいいと思います。
他にもモードがありますが、ここではVisualモードだけ紹介しておきます。
Visualモードには、Normalモードで v を入力することで入れます。
Visualモードでは、Normalモードの時のカーソル位置から範囲選択が可能です。
範囲選択で y を入力するとコピー、 d を入力すると切り取りになります。
ここでも様々なコマンドが使えるため、マウスに手を動かすことなく範囲選択が可能になり、便利です。
コマンドを入力してみる
では、保存や終了はどのようにして行うのでしょうか?
ここでコマンドの登場です。
Normalモードで : を入力してみてください。
下のスペースにカーソルが移動すると思います。
ここで、 w と入力してエンターを入力します。
このコマンドにより、直前に編集していた内容がファイルに保存されます。
終了するには :q を入力。
すると、Neovimが終了します。
基本的にはこのコマンドを覚えておけばだいたいなんとかなります。
あとはなんか変な入力をして変なモードに入った時も、Escapeを連打して :q を入力すればなんとかなります。
あとは組み合わせで色々使ってみると便利です。
例えば、 :wq は保存して終了、 :q! は保存せずに終了、 :w! はファイルを上書き保存、などです。
ここまでできれば、基本的な操作はできたと言っていいでしょう。
タブを切り替えてみる
エディタではタブや縦横分割ができることがほとんどだと思います。 Neovimではどうするのか?これもコマンドで解決です。
Normalモードで Ctrl+w 、 s の順で入力してみてください。
画面が上下に分割されたと思います。
Ctrl+w 、 v の順で入力すると、左右に分割されます。
自分は s はsplit、 v はvertical、で覚えています。
新しいタブは、 :tabnew コマンドで開きます。
gt で次のタブ、 gT で前のタブに移動します。
キーマップを変更する
さて、ここまでの話を読んで、「いやキーバインド面倒くないか?Escape入力するとか、PageDownしたい時とかどうすんねん。 :tabnew はだるすぎる」という声が聞こえてきそうです。
そんな時こそキーマッピング! キーマップを変更すると、好きなキーバインドで様々な操作ができるようになります。
キーマッピングのために、まずは設定ファイルである ~/.config/nvim/init.lua を開きます。
なお、Neovimでは設定ファイルでLuaが使えます。
このファイルの中に、以下の内容を書いてみましょう。
vim.keymap.set("n", "s", "<c-w>", { noremap = true, silent = true })
これは、 n ormalモードで、 s を Ctrl+w にマップする、という意味です。
これがどういう意味を持つのか、ぱっと見わからないかもしれません。 これを書いたらファイルを保存して閉じ、もう一度Neovimを開いてみてください。
このキーマップ変更により、 s、 s の順に入力することで、上下分割ができるようになっています!
これは、 Ctrl+w を s にマップすることにより、 Ctrl+w 、 s と入力しなければならなかったコマンドを、 s 、 s と入力するだけでよくなりました。
以下も追記してみましょう。
vim.keymap.set("n", "st", ":tabnew<cr>", { noremap = true, silent = true })
これは、 s 、 t の入力を、 :tabnew コマンド、エンターにマップするというものです。
これにより、これまで :tabnew コマンドを入力する必要のあった新規タブ作成が、 st のみでできるようになりました!
あとはカーソルを一気に移動したい時。 私はこれを使っています。
vim.keymap.set("n", "H", "^", { noremap = true, silent = true })
vim.keymap.set("n", "L", "$", { noremap = true, silent = true })
vim.keymap.set("n", "J", "<c-d>", { noremap = true, silent = true })
vim.keymap.set("n", "k", "<c-u>", { noremap = true, silent = true })
それぞれ、 H キーで行頭移動、 L キーで行末移動、 J キーで半ページ下移動、 K キーで半ページ上移動です。
これは本当に多用します。
他に個人的におすすめなのは、Insertモードでの jj からEscapeへのマッピングです。
vim.keymap.set("i", "jj", "<esc>", { noremap = true, silent = true })
NeovimではNormalモードとInsertモードの行き来が多発します。
その度にEscapeまで手を伸ばすのは億劫なので、 jj の入力をEscapeにマッピングしてしまおう!というものです。
これは割と賛否あるマッピングですが、自分はかなり快適に使えています。
InsertからNormalに、 jj と素早く入力するだけで移動できるのはかなり楽です。
これをすると、 jj を素早く入力することができなくなりますが、意外とコーディングでも日本語入力でも使わない組み合わせなので、このキーマップにしています。
プラグインを導入する
プラグインの導入も簡単です。 先ほどの設定ファイルに、以下を追記します。
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({
"neovim/nvim-lspconfig",
})
これを書くことにより、NeovimのパッケージマネージャであるLazyと、LSPの設定集が次のNeovim起動時に自動でインストールされます。
Lazyは setup 関数内に記述されたGitHubのリポジトリにあるプラグインを自動でインストールしてくれます。
ここではプラグイン紹介はしませんが、やりたいこと+Neovimで検索すると、だいたいプラグインが見つかると思います。 各プラグインのマニュアルに従い、色々インストールしていくといいと思います。
見栄えを良くする
プラグインが導入できるようになったら、カラースキームなどのプラグインを導入して、どんどん自分好みのエディタに変えていきましょう。 各カラースキームのページに導入方法は書いてあると思いますが、例えば私は次のような設定を使っています。
require("lazy").setup({
{ "catppuccin/nvim", name = "catppuccin" },
})
vim.opt.termguicolors = true
vim.opt.background = "dark"
require("catppuccin").setup({
flavor = "mocha",
transparent_background = true,
color_overrides = {
mocha = {
base = "#000000",
mantle = "#000000",
crust = "#000000",
},
},
integrations = {
notify = true,
},
})
vim.cmd("colorscheme catppuccin")
好きなカラースキームプラグインをインストールし、 colorscheme コマンドを用いて、変更できます。
termguicolors を有効にしないと、ターミナルで綺麗な色で表示されなかったりするのでご注意を!
AIとの同居
さて、ここからはAIとNeovimを同居させるにあたり、やっておいて良かったことを話します。 やっとAI時代の話になりましたね。
AI系のプラグインも検索すれば出てくるので、すべては紹介しないとして、入れておいて便利だったプラグインを書いてみます。 ちなみに私はavante.nvimというAIプラグインを入れています。
自動読み込み
AIエージェントはファイルを編集しまくるので、ファイル変更時の自動読み込みは必須と言えるでしょう。 ファイルの自動読み込みは、設定すればできるのですが、まぁ簡単のために小さいプラグインをサッとインストールしてしまいましょう。
プラグインのリポジトリは、 djoshea/vim-autoreadです。
require("lazy").setup({
"djoshea/vim-autoread",
})
これでおしまいでした。 簡単!
Diff表示
AIはたくさんの編集を行うので、レビューの上でリッチなDiff表示は重要だと思います。
私はsindrets/diffview.nvimなんかがいいなぁと思って使っています。
発展:設定ファイルをGit管理する
Neovimの何よりいい点は、設定ファイルが簡単にGit管理できることです。 dotfilesをGit管理している人は多いと思いますが、当然Neovimの設定ファイルもGit管理できます。 ぜひGit管理してみてください。
おわりに
ということでNeovim語りでした。 本当に初心者という人に向けて書きましたが、これでNeovimに触ってくれる人が増えると嬉しいです。
私の設定はcordx56/dotfilesにあるので、それを参考にしていただいても構いません。
参考になるかは分かりませんが……