Neovimプラグイン nvim-spectre: 高度な検索・置換エンジン設定

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' に変更
    },
  },
})

置換エンジンのカスタマイズ

置換エンジンパラメータの設定

置換エンジンも同様にカスタマイズ可能です。sedoxisdなどのツールが利用でき、それぞれの挙動を調整できます。

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コマンドで定義することで、外観を完全に制御できます。

タグ: Neovim nvim-spectre ripgrep The Silver Searcher sed

7月10日 23:37 投稿