Рішення 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))))))))
Щоб налаштувати simple-project-root
, потрібно створити .dir-locals.el , див. 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, ми повинні використовувати її (ripgrep, the_silver_searcher / ag, ... і т.д.), або інший запасний варіант grep за замовчуванням
вікно кандидата має використовувати повну ширину екрану, і користувачі можуть інтерактивно фільтрувати кандидатів (саме тому люди використовують плющ або кермо)
нам слід показати відносний шлях у вікні кандидата
можливість повторного використання попереднього результату. Тож попередній результат слід зберегти. Ви можете використовувати ivy-resume
з ivy
або helm-resume
відhelm
Коли ви зберігаєте попередній вилучений результат, контекст попереднього результату також повинен бути збережений. Наприклад, у коді рішення 2. default-directory
є контекст. Дивіться https://github.com/abo-abo/swiper/isissue/591 для отримання більш детальної інформації.
Необхідно використовувати розширений регулярний вираз, оскільки він простіший і його вже використовує counsel-git-grep
the_silver_searcher / ag.
helm-projectile-grep
командою (якщо у вас встановлений кермовий снаряд) абоprojectile-grep
?