ソリューション1(最適なソリューション):
弁護士をインストールする(https://github.com/abo-abo/swiper/blob/master/counsel.el)
その後M-x counsel-git-grep
。
セットアップは不要です(gitはプロジェクトのルートと除外するファイルを認識しています)。両方git grep
とcounsel
効率的です。
プロジェクトはgitで管理する必要があります。
弁護士はアイビーモードが必要です。
解決策2:
このソリューションはgrepを使用し、任意のプロジェクトで動作します。速度が遅く、手動セットアップが必要なため、ソリューション1より劣ります。また、アイビーモードに基づいています。
(defvar simple-project-root "~/.emacs.d")
(defun simple-grep ()
(interactive)
(unless (featurep 'ivy)
(require 'ivy))
(let* ((default-directory (file-name-as-directory simple-project-root))
(keyword (read-string "Keyword:")))
(ivy-read (format "Grep at %s:" simple-project-root)
(split-string (shell-command-to-string (format "grep -rsnI %s ." keyword)) "\n" t)
:action (lambda (val)
(let* ((lst (split-string val ":"))
(linenum (string-to-number (cadr lst))))
;; open file
(find-file (car lst))
;; goto line if line number exists
(when (and linenum (> linenum 0))
(goto-char (point-min))
(forward-line (1- linenum))))))))
セットアップするには.dir-locals.elを作成する必要があります。技術的な詳細simple-project-root
についてはhttps://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.htmlを参照してください
ソリューション2のコードは単なるプロトタイプです。私の実際の実装ははるかに複雑です。https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.elを参照counsel-etags-grep
してください
概要:
これらは、私が知っている最高の2つのソリューションです。
他の優れたソリューションが存在する場合、少なくとも以下の問題を解決して生産準備を整える必要があります。
grepにキーワードを取得する方法(たとえば、選択した地域からキーワードを取得する)
キーワードをエスケープする
より効率的なgrepプログラムが存在する場合は、それを使用する必要があります(ripgrep、the_silver_searcher / ag、...など)、またはデフォルトのgrepをフォールバックします
候補ウィンドウは画面の全幅を使用する必要があり、ユーザーは候補をインタラクティブにフィルター処理できます(そのため、人々はivyまたはhelmを使用します)
候補ウィンドウに相対パスを表示する必要があります
以前のgrepされた結果を再利用できます。したがって、以前の結果を保存する必要があります。ivy-resume
from ivy
またはhelm-resume
from を使用できますhelm
以前のgrepされた結果を保存すると、以前の結果のコンテキストも保存されます。たとえば、ソリューション2のコードにdefault-directory
はコンテキストがあります。詳細については、https://github.com/abo-abo/swiper/issues/591を参照してください。
拡張された正規表現は、より単純でcounsel-git-grep
あり、the_silver_searcher / ag によって既に使用されているため、使用する必要があります。
helm-projectile-grep
コマンド(ヘルム発射体がインストールされている場合)を使用して試しましたかprojectile-grep
?