consult-ripgrepの検索対象を現在開いているバッファたちに限定するには

以下の関数を使う(consult-ripgrep-multi-file)。通常のconsult-ripgrepはあるディレクトリ以下の全ファイルが検索対象になるが、今回は「現在開いているバッファ(に対応するファイルたち)」に検索対象を限定したということ(串刺し検索)。

consult-line-multihelm-swoopの代替に相当する。

検索対象から外したい*scratch*バッファや*Messages*バッファ の除外にはido-ignore-buffersで指定される正規表現を利用した。

;; perspective.el内の関数を参考にした
(defun consult--make-ignore-buffer-rx ()
  (defvar ido-ignore-buffers)
  (if ido-ignore-buffers
      (rx-to-string (append (list 'or)
                            (mapcar (lambda (rx) `(regexp ,rx))
                                    ido-ignore-buffers)))
    "$^"))

(defun consult--get-curret-buffer-list ()
  (let (buffer-mode-matches)
    (mapc (lambda (buf)
            (when (get-buffer buf)
              (with-current-buffer (get-buffer buf)
                (if (and (buffer-live-p buf)
                         (not (string-match-p (consult--make-ignore-buffer-rx)
                                              (buffer-name buf))))
                    (add-to-list 'buffer-mode-matches (buffer-file-name buf))))))
          (buffer-list))
    buffer-mode-matches))

(defun consult-ripgrep-multi-files ()
  "Call `consult-ripgrep' for the current buffers (multiple files)."
  (interactive)
  (let* ((consult-project-function (lambda (x) nil))
         (files (mapconcat
                 (lambda (x) (concat (shell-quote-argument x)))
                 (consult--get-curret-buffer-list) " "))
         (consult-ripgrep-args
          (concat "rg "
                  "--null "
                  "--line-buffered "
                  "--color=never "
                  "--line-number "
                  "--smart-case "
                  "--no-heading "
                  "--max-columns=1000 "
                  "--max-columns-preview "
                  "--with-filename "
                  files)))
    (consult-ripgrep)))