← Vim研究所

Neovimにマルチカーソルが入った Qで複数箇所を同時に編集

2026-09-04 公開

Neovimに複数のカーソルが本体の機能として入りました。2026年9月1日にプルリクエスト#41587がマージされ、Qでカーソルを増やすと、増やした全部の位置で同じ編集が同時に走ります。これまでvim-visual-multiのようなプラグインが受け持っていた領域です。要望そのものは2017年に立っていて、9年近く動かなかったものが1つのPRで入りました。この記事は公式のnightlyを落として実際に打った結果です。

検証環境:使ったのは公式nightlyビルド NVIM v0.13.0-dev-1511+g5209695703(macOS)です。安定版の0.12.4にこの機能はありません。0.13はまだ開発中で、GitHubのマイルストーンには2026年10月1日という期日が付いています(2026-09-04時点で完了71パーセント、未解決76件)。この記事のキー操作はすべてnightlyで実際に打ち、画面と保存後のファイルの両方を確認しています。開発中なので正式版で変わる可能性があります。

目次(8項目)
キーこれだけ覚える
Qいまのカーソル位置にカーソルを1本足す(もう一度押すと外す)
1Q直前の検索に一致した全部の位置にカーソルを置く
Vで選択してQ選択した行それぞれにカーソルを置く
Ctrl-l増やしたカーソルを全部消す
gQ直前に消したカーソルを戻す
]C / [C次 / 前のカーソルへ移動する
q=移動も各カーソルで再生する追従モードの切り替え
gCtrl-a各カーソルに1、2、3と続き番号を入れる

9年ぶんの要望が1本のPRで閉じた

マージされたPRは3つのissueを同時に閉じています。そのうち#7257「Multiple cursors (again)」が立ったのは2017年9月10日で、タイトルに「again」と入っているとおり、その時点ですでに何度も蒸し返されていた話でした。9年近く開いていた要望が閉じたことになります。

実装が入る前の状態も見ています。Neovim 0.13の変更をまとめた記事を書いた2026-08-28時点のnightly(dev-1430)では、ヘルプにQの新しい意味だけが先に書かれていて、押すと0.12までの処理が動いてE354が返るという状態でした。機能を説明するはずのrepeat.txtの節もtodoの1語だけでした。今回のdev-1511では、その節に80行ほどの説明が入り、キーも実際に効きます。

ヘルプの書き出しには、マクロとの違いがはっきり書かれています。マクロがキー入力の列をそのまま流し直すのに対して、マルチカーソルは操作を意味の単位で再生するという説明です。この差は後で実際に効いてきます。

Unlike a |macro| (a stream of keys without any context), multicursor replays actions "semantically" (|CmdAtom|).

Neovim documentation: repeat.txt

カーソルの置き方は4通り

置き方が4つあり、それぞれ使う場面が違います。

Exコマンドから置くこともできます。ヘルプに載っている書き方をそのまま打つと、:globalで一致行に対して一括処理する方法と同じ考え方でカーソルを配れます。

:g/pattern/normal! nQ    " 一致した行ごとに1本ずつ
:cdo normal! Q           " quickfixの各項目に1本ずつ

プラグインから配るための入り口も用意されていて、nvim_mcursor()に行と桁を渡すとその位置にカーソルが増えます。位置は拡張マークとしてnvim.multicursorという名前空間に入るので、:marks nvim.multicursorで今どこにあるかを一覧できます。dev-1430では同じコマンドがE283を返していた場所です。

4か所を一度に書き換えてみる

いちばん短い実演です。同じ変数名が4行に散らばったファイルを開き、/で名前を検索してから1Qを押します。

Neovimで4行のJavaScriptを開き、1Qを押して4か所のalphaすべてにカーソルが置かれた画面。最下行に一致件数とカーソルの本数が出ている
NVIM v0.13.0-dev-1511。/alphaを検索してから1Qを押した直後。4か所が反転し、最下行の右に本数が出る

一致した4か所が色付きで示され、画面の右下に本数が出ます。この状態でciwと打って新しい名前を入れ、Escを押すと4行が同時に変わります。挿入中も4か所が同時に伸びていくので、打ち間違えたその場で気づけます。

BEFORE
const alpha = 1;
const alpha = 2;
const alpha = 3;
const alpha = 4;
1Q c i w beta Esc
AFTER
const beta = 1;
const beta = 2;
const beta = 3;
const beta = 4;

ここまでならcgnで検索語をそのまま変更する方法でもできます。cgnで1つ目を直し、.で次々に繰り返す形です。違いは結果を見るタイミングで、cgnは1つずつ確定させながら進むのに対し、マルチカーソルは4か所が同時に変わっていくところを見ながら打てます。

マクロもレジスタもカーソルごとに動く

面白いのはここから先です。ヘルプが「意味の単位で再生する」と書いているとおり、各カーソルは独立した文脈を持ちます。実際に打って確かめたものを並べます。

まずレジスタです。3行のファイルの各行にカーソルを置いた状態でyw$pと打つと、各行が「自分の行の最初の単語」を自分の行末に貼り付けます。ヤンクしたものが1つの共有レジスタに入るなら、3行とも同じ単語が付くはずです。そうならないので、レジスタがカーソルごとに分かれていることが分かります。

one two three     ->  one two threeone
four five six     ->  four five sixfour
seven eight nine  ->  seven eight nineseven

マクロの再生も同じです。qqで記録した操作を@qで流すと、記録した1回ぶんが各カーソルで走ります。マクロで複雑な繰り返しを組む方法と組み合わせると、行ごとに違う中身に対して同じ手順を当てられます。

取り消しは逆に、まとめて1回です。4か所を書き換えたあとにuを1回押すと「4 changes」と表示され、4か所ぶんが一度に戻ります。カーソルの数だけuを押す必要はありません。

連番を入れるgCtrl-aも入っています。縦に並んだカーソルに1から順に数字を入れる操作で、行末に印を付けてから押すと次のようになります。回数を付ければ開始の数字を選べます。

red     ->  red.1
green   ->  green.2
blue    ->  blue.3
yellow  ->  yellow.4

外し方と、移動を追従させるかどうか

増やしたカーソルはCtrl-lで全部消えます。もともと画面を描き直すキーで、:nohlsearchと同じ「散らかったものを片づける」側に割り当てられた形です。消しすぎたときはgQで直前の配置が戻ります。1本だけ外したいときは]Cでそのカーソルまで移動してQを押します。

混乱しやすいのが追従モードです。移動そのものを各カーソルで再生するかどうかの切り替えで、q=で反転します。オンのときに$を押すと、各カーソルがそれぞれの行末へ動きます。行の長さが違っても、それぞれの行末です。オフのときは主カーソルだけが動きます。

厄介なのは、置き方によって初期状態が違うところです。ビジュアルモードのQは追従モードをオンにし、素のQはオフにします。同じ$を押しても、直前にどう置いたかで結果が変わります。切り替えたつもりが逆になることを避けたいなら、1q=でオン、2q=でオフと、回数で指定できます。

プラグインを外せるかどうか

結論から言うと、いま外すのは早いです。動くのはnightlyだけで、安定版の0.12系には入っていません。0.13の期日は2026年10月1日ですが、マイルストーンには76件が開いたままです。

そのうえで、上げたときに困る変更が1つあります。Qが持っていた「最後に記録したレジスタを再生する」という意味が無くなることです。マクロをQで回していた人は手が覚えているので、上げた日にいちばん引っかかります。:help newsに戻し方が載っていて、そのまま写せます。

vim.keymap.set('n', 'Q', function()
  -- 0.12までのQ(最後に記録したレジスタを再生)に戻す
  local reg = vim.fn.reg_recorded()
  return reg == '' and '' or ('@' .. reg)
end, { expr = true })

プラグインと比べたときの差も見ておきます。vim-visual-multiCtrl-nで次の一致を選んでいく操作系で、標準のほうは検索してから1Qという順序です。手順が違うので、両方を入れたまま行き来すると指が迷います。標準に寄せるなら片方を外すほうが早いです。

制限として書かれているもののうち、実際に踏みそうなのは3つです。カーソルはバッファごとに持つので、別のバッファへ移ると効きません。折りたたみは再生中は無視され、ddは折りたたみ全体ではなくカーソル行だけを消します。再生が長くかかるときはCtrl-cで止まります。

標準機能だけで複数箇所を直す方法が要らなくなるわけでもありません。マルチカーソルと標準機能での代用にまとめたやり方は、Vim本体にも0.12系にも効きます。ドットコマンドで直前の変更を繰り返す方法cgnの組み合わせは、カーソルを配る手間が要らないぶん、数か所なら今でも速いです。

使ってみて

1週間前に同じnightlyを落として3QE354を見ていたので、今回いちばん驚いたのはciwを打っている最中に4行が同時に伸びたことでした。効き目がはっきり出たのは連番のgCtrl-aで、テストデータのIDを振り直すのに:gprintf()を組み立てていた作業が2キーで済みました。逆に手が止まったのが追従モードで、ビジュアルから置いたときだけ$が全カーソルに効くのを知らず、行末に付けたはずの記号が1行にしか入らない、を何度かやりました。1q=2q=で明示するようにしてから安定しました。

まとめ

Neovimのマルチカーソルは2026年9月1日に本体へ入り、nightlyでは実際に動きます。カーソルを置くのはQ、検索の全一致に配るのは1Q、行ごとに配るのはビジュアルモードのQ、片づけはCtrl-lです。レジスタはカーソルごとに分かれ、マクロも各カーソルで走り、取り消しだけはまとめて1回で戻ります。移動を追従させるかどうかは置き方で初期状態が変わるので、1q=2q=で指定するほうが確実です。安定版に降りてくるのは0.13からで、期日は2026年10月1日です。上げる前に、Qでマクロを再生していた人は戻し方を用意しておくと当日が静かになります。

関連記事

← Vim研究所 トップへ戻る