複数ファイルを一括で書き込めるquicker.nvimの使い方

Neovimのプラグインquicker.nvimの紹介です。

quicker.nvimとは

quicker.nvimはNeovimのquickfixを便利にしてくれるプラグインです。

quickfixが見やすくなる

quickfixの表示が見やすくなります。

quickerの使用前後で比較
  • カラムが整列
  • signcolumnが非表示
  • 行番号のみ(桁番号が非表示)
  • シンタックスハイライトが付く

前後の行も表示できる

前後の行の表示もできます。

quickfixで前後の行を表示

quickfixでの編集が一括で反映

quickfixで表示されている行をバッファとして編集できます。quickfixのバッファを保存すると、各行の変更がファイルに反映されます。

複数ファイルにまたがった一括置換やqによるマクロと組み合わせるととんでもなく強力です。

:cdoなどのコマンドでも似たようなことはできます。
一方で、quicker.nvimを使えばバッファとして編集できるため、挿入モードやビジュアルモードなどで柔軟な編集ができます

インストール方法

依存するプラグインはありません。各自のプラグインマネージャーでインストールできます。

READMEに、いろんなプラグインマネージャーの管理ファイルにコピペできるコードブロックが記載されています。

リポジトリ名コピペ用
stevearc/quicker.nvim
lazy.nvimでの例
{
'stevearc/quicker.nvim',
event = "FileType qf",
---@module "quicker"
---@type quicker.SetupOptions
opts = {},
},

設定

とりあえず使いたいだけなら次の1行だけで設定は終わりです。

require("quicker").setup()

前後の行を表示するキーマップ

前述のとおりquicker.nvimでは前後の行を表示できます。

quickfixで前後の行を表示

この切り替えのAPIをキーマップとして登録しておくと便利です。

require("quicker").setup({
keys = {
{ ">", "<cmd>lua require('quicker').expand()<CR>", desc = "Expand quickfix content" },
{ "<", "<cmd>lua require('quicker').collapse()<CR>", desc = "Collapse quickfix content" },
},
})

注意点

※ おま環かもしれません。

bufferline.nvimを入れた状態で大量のファイル(40以上?)を一気に書き込もうとするとエラーになることがあります。bufferline.nvimが大量のバッファを一度にたくさん開く想定では作られていないからだと思われます。

筆者はエラーになったときだけ、いったんbufferline.nvimをオフにして同じ操作をやり直しています。

もう少し調査できたら追記します。

そもそも、どうやってquickfixに送るのか

quickfixを開く方法もちょっと書いておきます。

プラグインなしでやる方法

まずはプラグインを使わないやり方。次のようなコマンドで、grepした結果をquickfixに送って開けます。

:grep foo src/content/* | cw

プラグインを使ってやる方法

fuzzy finder系のプラグインでは、「絞り込み結果をquickfixに送る」というAPIが用意されていることがあります。こういったプラグインを活用している人はその機能を使ったほうが便利です。

たとえば、telescope.nvimではsend_to_qflistopen_qflistというAPIが用意されています。

telescope.nvimでの例
local actions = require("telescope.actions")
local telescope = require("telescope")
telescope.setup({
pickers = {
git_files = {
mappings = {
i = {
["<C-q>"] = actions.send_to_qflist + actions.open_qflist,
-- ...
},
},
},
live_grep = {
mappings = {
i = {
["<C-q>"] = actions.send_to_qflist + actions.open_qflist,
-- ...
},
},
},
},
})

上記の設定では、Telescopeで絞り込んでから<C-q>を押すと「絞り込んだ結果」がquickfixに表示されます。

quickfixの機能と組み合わせる

quickfixの操作を知っておくと便利なのでここでいくつか紹介します。

もう少し絞り込みたい

quickfixのリストをもう少し絞り込みたいときにはcfilter機能を使いましょう。

次のように実行できます。

:packadd cfilter
:Cfilter /foo/

cfilterプラグインはデフォルトではロードされていないため、上記のようにpackaddを使って手動でロードします。

:Cfilter /pattern/のように書けば、指定した正規表現に一致するエントリのみがリストに残ります

一致しない行を絞り込みたい

指定した正規表現に一致しないエントリを絞り込みたい場合は!をつけて実行しましょう。

:Cfilter! /foo/

絞り込んだけど元に戻したい

:Cfilterで絞り込んだ後、やっぱり元のリストに戻したい」というときは:colderを使いましょう(c+older=古くなるんだなぁ~で覚えられます)。

検索とコマンドの組み合わせで効率UP

検索に関係する操作を覚えておくとquickerでの編集効率が上がるので紹介します。別にquickerに限ったことではないですが。

gn

gnを入力すると、「最後の検索パターンに一致する次の箇所」がビジュアルモードで選択されます。

これをdcと組み合わせてみましょう。
dgnは、最後の検索パターンに一致する次の箇所を削除します。
cgnは、最後の検索パターンに一致する次の箇所を削除して挿入モードの開始します。

gn単体でも便利なのですが、「たまに変更したくない箇所もあるけど、きっちり正規表現書くのはだるいな」というときにも便利です。
流れはこうです。/などで検索後、cgnで一ヵ所を編集します。nで次にマッチする箇所へ飛びます。ここで、変更したければ.でドットリピートします。あとはn.n.nn.n.nnnnのように移動とドットリピートを繰り返すだけです。

見るよりも実際に手を動かしたほうが分かりやすいです。というか操作感が気持ちいいです。

練習用
3年foo組 -今から皆さんは、fooです-
foo参道高校合唱部!
30歳までfooだとfoo使いになれるらしい
fooさんずラブ

別の記事Neovimの検索と置換を便利にするには検索や置換関係の設定を書きました。興味があればどうぞ。

この「gn系コマンドで柔軟にquickfixを書き換えてからquickerで反映する」というのがめちゃくちゃ捗ります。

マクロも使って効率UP

複雑な変更を加えたい場合はマクロqを組み合わせるのも便利です。この記事にたどり着く皆さんはすでに活用できると思うので割愛します。


以上、quicker.nvimの活用方法でした。
ライブラリのアップデート時、ライブラリ名やプロパティ名などが変わってしまったケースで何度もお世話になっています。
また、以前ブログの画像をR2へ移行した際にimgタグのsrc属性を書き換えるときにも大活躍でした。