• 作成:
  • 更新:

helmの更新でhelm-agが壊れましたが、helm公式のhelm-grepがripgrep対応していたのでそちらに乗り換えました

問題

emacsorphanage/helm-ag: The silver searcher with helm interface というhelmでgrep串刺し検索を実現するソフトウェアを、 ripgrepを使うように設定して長年使っていたのですが、今日helmを更新したら壊れてしまいました。

ASCIIのエスケープシーケンスをそのまま表示してしまいます。

調査

調査するのにも無理矢理カスタマイズしているし再現が難しいな、まずはhelmのコアの更新を見て何処で壊れてるか見るかと調べたところ以下のissueで問題に触れられていることに気が付きました。

helm-grep fails with patterns starting with a hyphen · Issue #2475 · emacs-helm/helm

そして、これを知ることによってhelm本体が既に串刺しgrepをripgrepにも対応してサポートしていることが分かったので、無理に外部ソフトウェアを使うことはないと判断しました。

解決

変数を以下のように設定して、

(helm-grep-ag-command . "rg --color=always --smart-case --no-heading --line-number --type-not=svg --sort=path %s -- %s %s")

プロジェクト以下を検索するコマンドは無かったので生やしました。ここで言うプロジェクトはgitなどで管理されているディレクトリのことを指します。

(defun helm-do-grep-ag-project-dir (arg)
  "プロジェクトディレクトリ以下のファイルを対象にhelm-do-grep-ag検索を行います。"
  (interactive "P")
  (helm-grep-ag (expand-file-name (project-root (project-current))) arg))

また、デフォルトではhelm-grepはファイル名しか検索結果に出さないため、違うディレクトリの同じファイル名が出ると混乱するので、パスも表示しておくと良いでしょう。

helm-grep-file-path-styleでルートからの絶対表示か、現在のパスからの相対表示が選択できます。

(helm-grep-file-path-style . 'absolute)

検索対象からの相対表示があっても良いかもしれません。追加するかもしれません。