Есть ли способ получить команду поиска тега emacs для вывода всех результатов в буфер? - PullRequest
5 голосов
/ 24 ноября 2010

Есть ли способ получить команду поиска тегов Emacs для сбора всех результатов поиска в буфер? Что-то вроде того, как результаты из 'grep' и 'tags-apropos' собираются в буфере компиляции?

Использование M-, для итерации по результатам не очень эффективно при большом количестве обращений, поэтому было бы замечательно, если бы был способ просматривать и искать результаты в буфере.

Спасибо

Benj

Ответы [ 3 ]

4 голосов
/ 24 ноября 2010

Попробуйте etags-select

0 голосов
/ 21 августа 2011

См. icicle-tags-search.Он позволяет вам искать во всех исходных файлах, перечисленных в таблицах тегов, совпадения для заданного регулярного выражения.

Вы видите все совпадения регулярного выражения в файлах исходного кода как поисковые хиты для посещения.Используются все теги в данном файле тегов, включая дубликаты тегов из одного и того же или разных исходных файлов.

По умолчанию используются все файлы тегов, но если вы укажете префиксный аргумент, то только текущая таблица тегов будетused.

Поиск совпадений с завершением, циклом и заменой поиска.

После указания регулярного выражения, определяющего контексты поиска, введите соответствующий ввод (например, регулярное выражение или другой шаблон) для сопоставления. в контекстах.Контексты, соответствующие вашему вводу, доступны в качестве кандидатов на завершение.Вы можете использовать S-SPC для дальнейшего сужения кандидатов, вводя дополнительные шаблоны для сопоставления.

По умолчанию кандидаты располагаются в порядке появления буфера, но вы можете сортировать их различными способами, используя C-,.

В качестве альтернативы вы можете выбрать поиск, а не контексты поиска, как определено предоставляемым вами регулярным выражением контекста, а не-контекстов , то есть текст в файлах , который делает не соответствует регулярному выражению .Для этого используйте C-M-~ во время завершения.(Это переключатель, и он влияет только на будущие команды поиска, а не на текущие.)

См. Документ для команды icicle-search для получения дополнительной информации.

0 голосов
/ 18 декабря 2010

Я неправильно истолковал ваш вопрос в своем первом ответе.Вот кое-что, что работает, но довольно плохо, потому что использует синхронные вызовы для grep, поэтому все блокируется во время работы.Улучшения оставлены читателю в качестве упражнения:

(require 'etags)
(require 'grep)

(defun tags-search-sel (regexp)
  "Search through all files listed in tags table for match for REGEXP.
Show all matches at once."
  (interactive "sTags search (regexp): ")
  ;; Get all unique filenames in TAGS files.
  (let ((keep-going t) files)
    (when (visit-tags-table-buffer)
      (while keep-going
        (save-excursion
          (goto-char (point-min))
          (while (re-search-forward "\f\n\\([^\n]+\\),[0-9]*\n" nil t)
            (add-to-list 'files
                         (expand-file-name
                          (buffer-substring (match-beginning 1) (match-end 1))
                          (file-truename default-directory)))))
        (setq keep-going (visit-tags-table-buffer t))))
    ;; grep through every file for regexp
    (when files
      (grep-compute-defaults)
      (let ((outbuf (get-buffer-create "*tags-search-sel*")))
        (with-current-buffer outbuf
          (setq buffer-read-only nil)
          (erase-buffer)
          (insert "Searching for '" regexp "' in tags files ...\n\n")
          (dolist (file files)
            (call-process-shell-command (concat grep-command regexp " " file) nil t))
          (grep-mode)
          (setq overlay-arrow-position nil)
          (set-buffer-modified-p nil)
          (setq buffer-read-only t)
          (goto-char (point-min)))
        (pop-to-buffer outbuf)))))
...