nvim-spectreは、Neovimでプロジェクト全体にわたる強力な検索・置換機能を提供するプラグインです。この記事では、nvim-spectreの検索エンジンと置換エンジンを詳細に設定し、個々の開発ワークフローに最適化する方法を解説します。基本的な設定から高度なカスタマイズまで、具体的なコード例を交えながら進めていきます。
設定構造の概要
nvim-spectreの設定は、Luaファイル内でrequire('spectre').setup({})を通じて行います。この設定テーブルには、インターフェースの見た目、キーマッピング、そして最も重要な検索エンジン (find_engine) と置換エンジン (replace_engine) の設定が含まれます。
検索エンジンのカスタマイズ
ripgrep (rg) パラメータの調整
nvim-spectreはデフォルトで高速な検索ツールであるripgrep (rg) を使用します。このエンジンの動作は、find_engine.rg.argsテーブルを編集することで細かく調整できます。
require('spectre').setup({
find_engine = {
['rg'] = {
cmd = 'rg',
args = {
'--color=never', -- 結果の色付けを無効化
'--no-heading', -- ファイル名の見出しを非表示
'--with-filename', -- 各結果にファイル名を表示
'--line-number', -- 行番号を表示
'--column', -- 列番号を表示
'--hidden', -- デフォルトで隠しファイルを検索対象に含める
'--glob=!{.git,node_modules,build}', -- .git, node_modules, buildディレクトリを検索から除外
},
},
},
})
上記の例では、検索結果の表示形式を調整し、通常は除外される隠しファイルを含めたり、特定のディレクトリを無視したりするようにripgrepを設定しています。
カスタム検索オプションの追加
find_engine.rg.optionsを利用すると、頻繁に切り替える検索オプションを定義し、nvim-spectreのオプションメニューから簡単にアクセスできるようになります。
options = {
['ignore-case'] = {
value = '--ignore-case',
icon = '[i]', -- 小文字 'i' を使用
desc = '大文字・小文字を区別しない検索',
},
['hidden'] = {
value = '--hidden',
desc = '隠しファイルも検索対象に含める',
icon = '[H]',
},
['word-regexp'] = {
value = '--word-regexp',
icon = '[W]',
desc = '単語の完全一致検索',
},
['smart-case'] = { -- 新しいオプションを追加
value = '--smart-case',
icon = '[S]',
desc = 'スマートケース検索 (小文字の場合は区別しない、大文字を含む場合は区別する)',
},
}
これらのオプションは、デフォルトのキーマップ<leader>o(またはo)で開くメニューから選択して切り替えることができます。
異なる検索エンジンへの切り替え
ripgrepの他に、nvim-spectreはThe Silver Searcher (ag) もサポートしています。デフォルトの検索エンジンを切り替えるには、以下のように設定します。
require('spectre').setup({
default = {
find = {
cmd = 'ag', -- デフォルト検索エンジンを 'ag' に変更
},
},
})
置換エンジンのカスタマイズ
置換エンジンパラメータの設定
置換エンジンも同様にカスタマイズ可能です。sed、oxi、sdなどのツールが利用でき、それぞれの挙動を調整できます。
require('spectre').setup({
replace_engine = {
['sed'] = {
cmd = 'sed',
args = '-i.bak', -- 置換前に元のファイルのバックアップを作成 (.bak 拡張子)
options = {
['ignore-case'] = {
value = 'i', -- sedの置換フラグは単独 'i'
icon = '[i]',
desc = '大文字・小文字を無視して置換',
},
},
},
['sd'] = { -- sd置換エンジンの設定例
cmd = 'sd',
options = {
['case-sensitive'] = {
value = '--case-sensitive',
icon = '[C]',
desc = '大文字・小文字を区別して置換',
},
['string-mode'] = { -- sd独自のオプションを追加
value = '--string-mode',
icon = '[s]',
desc = '文字列リテラルとしてパターンを扱う',
},
},
},
},
})
sedの-i.bakオプションは、置換操作を行う前に元のファイルのコピー(.bak拡張子付き)を作成し、予期せぬ変更から保護するのに役立ちます。
置換エンジンの切り替え
デフォルトの置換エンジンを設定することも、実行時に切り替えることもできます。
-- デフォルト置換エンジンを 'sd' に設定する例
require('spectre').setup({
default = {
replace = {
cmd = 'sd',
},
},
})
nvim-spectreには、trs (sedへ切り替え) や tro (oxiへ切り替え) といった組み込みのキーマップを通じて、動的に置換エンジンを切り替える機能も用意されています。
高度な設定テクニック
カスタムキーマップの追加
作業効率を高めるために、独自のキーマップを追加できます。
mapping = {
['toggle_word_match'] = {
map = 'tw',
cmd = "<cmd>lua require('spectre').change_options('word-regexp')<CR>",
desc = '単語の完全一致オプションを切り替える',
},
['next_match_in_file'] = { -- 新しいキーマップを追加
map = 'n<CR>',
cmd = "<cmd>lua require('spectre').next_file_match()<CR>",
desc = '現在のファイル内で次のマッチへ移動',
},
}
リアルタイム更新の設定
リアルタイム更新を有効にすると、ファイルが保存されるたびに検索結果が自動的に再生成されます。
require('spectre').setup({
live_update = true, -- ファイル保存時に検索結果を自動更新
})
この機能は、キーマップ tu を使ってオン/オフを切り替えることも可能です。
UIスタイルのカスタマイズ
nvim-spectreの表示スタイルは、Neovimのハイライトグループを介してカスタマイズできます。
highlight = {
headers = 'SpectreHeaderGroup', -- ヘッダー部分のハイライト
ui = 'SpectreUIGroup', -- UI全体の基本ハイライト
filename = 'SpectreFilenameGroup', -- ファイル名のハイライト
search = 'SpectreSearchMatch', -- 検索キーワードのハイライト
replace = 'SpectreReplaceTarget', -- 置換対象のハイライト
}
これらのグループをNeovimのカラースキームや独自のhighlightコマンドで定義することで、外観を完全に制御できます。