Решение 1 (лучшее решение):
Установить адвокат ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Потом M-x counsel-git-grep
.
Никаких настроек не требуется (git знает корень проекта и файлы для исключения). И то, git grep
и другое counsel
эффективно.
Проект должен управляться git.
адвокат требует режима плюща.
Решение 2:
Это решение использует grep и работает на любом проекте. Он уступает Solution 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 - просто прототип. Моя реальная реализация намного сложнее. Смотрите counsel-etags-grep
в https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.el
Резюме:
Это два лучших решения, которые я знаю.
Если существуют какие-либо другие лучшие решения, они должны по крайней мере решить следующие проблемы, чтобы быть готовыми к производству,
как получить ключевое слово для grep (например, получить ключевое слово из выбранного региона)
избежать ключевого слова
если существует более эффективная программа grep, мы должны использовать ее (ripgrep, the_silver_searcher / ag, ... и т. д.), либо использовать альтернативный вариант grep по умолчанию
Окно кандидата должно использовать всю ширину экрана, и пользователи могут фильтровать кандидатов в интерактивном режиме (именно поэтому люди используют плющ или шлем)
мы должны показать относительный путь в окне кандидата
возможность повторно использовать предыдущий результат. Таким образом, предыдущий результат должен быть сохранен. Вы можете использовать ivy-resume
от ivy
или helm-resume
отhelm
Когда вы сохраняете предыдущий полученный результат, контекст предыдущего результата также должен быть сохранен. Например, в коде решения 2. default-directory
есть контекст. См. Https://github.com/abo-abo/swiper/issues/591 для получения дополнительной информации.
Расширенное регулярное выражение следует использовать, потому что оно проще и уже используется counsel-git-grep
the_silver_searcher / ag.
helm-projectile-grep
команду (если у вас установлен снаряд шлем) илиprojectile-grep
?