Neovimで検索文字の入力中にvery magicをトグルする

この記事はVim駅伝の2025年7月28日の記事です。
前回(2025年7月25日)AmaさんのPartedit で Neovim LSP が起動しないでした。


筆者は今まで、//\vとして登録していました。/は検索、\vはvery magicです(:help /magic)。ただvery magicをトグルできたほうがいろいろと都合がよかったため、それ用のキーマップを設定しました。

どういう動作?

設定したキーを押すと\vの有無がトグルできます。

very magicって何がうれしいの?

?()などの正規表現がエスケープなしで書けます。

キーマップ

実装は単純で、検索文字の最初に\vがあるなら\vを削除、ないなら付与しているだけです。

vim.keymap.set("c", "<C-v>", function()
local cmdtype = vim.fn.getcmdtype()
if cmdtype == "/" or cmdtype == "?" then
local cmdline = vim.fn.getcmdline()
local pos = vim.fn.getcmdpos()
if cmdline:sub(1, 2) == "\\v" then
-- \vを削除
vim.fn.setcmdline(cmdline:sub(3))
vim.fn.setcmdpos(pos - 2)
else
-- \vを追加
vim.fn.setcmdline("\\v" .. cmdline)
vim.fn.setcmdpos(pos + 2)
end
return ""
end
-- 検索モード以外では通常の<C-v>の動作
return "<C-v>"
end, { expr = true, desc = "検索モードでvery magicをトグル" })

なぜ生み出されたのか

筆者はblink.cmpを使っているのですが、blink.cmpだと\vがある時にvの部分が消えてしまいます。Issueが挙がってはいるものの、複雑なようでまだ未解決です。

(この問題を解決するのが一番ですが、)とりあえず今回は応急処置としてこのキーマップを作ったのでした。


以上、自作キーマップの紹介でした。Vim駅伝はまだまだ参加者を募集中です!