Есть ли способ заставить команду emacs tag-search выводить все результаты в буфер?

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

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

Спасибо,

Бендж


person Benj Carson    schedule 24.11.2010    source источник
comment
Возможный дубликат Помощь в написании emacs lisp для поиска emacs etags, проверьте некоторые из решений там.   -  person Trey Jackson    schedule 18.12.2010


Ответы (3)


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

person scottfrazer    schedule 24.11.2010
comment
А, прикольно, не знал об этом. Однако tags-search ищет регулярное выражение во всех файлах, перечисленных в ваших загруженных таблицах тегов (в отличие от поиска тегов, что, по-видимому, делает etags-select). Хотя, может быть, я смогу что-нибудь из него вытащить. - person Benj Carson; 24.11.2010
comment
Установите пакет etags-select, и вы сможете использовать функции etags-select-find-tag-at-point и etags-select-find-tag. - person Debajit; 14.01.2017

Я неправильно истолковал ваш вопрос в своем первом ответе. Вот что-то, что работает, но плохо тем, что использует синхронные вызовы 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)))))
person scottfrazer    schedule 18.12.2010

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

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

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

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

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

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

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

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

person Drew    schedule 20.08.2011
comment
Whoever: Потрудитесь объяснить, почему вы проголосовали за этот ответ? - person Drew; 28.01.2014