有没有办法让emacs tag-search命令将所有结果输出到缓冲区?

时间:2010-11-24 02:05:39

标签: search emacs etag

有没有办法让Emacs tags-search命令收集缓冲区中的所有搜索结果?像'grep'和'tags-apropos'的结果一样收集在编译缓冲区中?

如果存在大量命中,则使用M-,迭代结果并不是非常有效,所以如果有一种方法可以在缓冲区中浏览和搜索结果,那就太棒了。

谢谢,

BENJ

3 个答案:

答案 0 :(得分:4)

尝试etags-select

答案 1 :(得分:0)

我在第一个回答中误解了你的问题。这是有用的东西,但有点不好,因为它使用同步调用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)))))

答案 2 :(得分:0)

icicle-tags-search。它允许您搜索标记表中列出的所有源文件,以查找给定正则表达式的匹配项。

您会看到源代码文件中正则表达式的所有匹配项,因为搜索会访问。使用给定标签文件中的所有标签,包括来自相同或不同源文件的重复标签。

默认情况下,使用所有标记文件,但如果您提供前缀 参数然后只使用当前标记表。

搜索匹配,完成,循环和搜索命中替换。

指定定义搜索上下文的正则表达式后,键入 输入(例如正则表达式或其他模式)以匹配上下文中的。 与您的输入匹配的上下文可用作完成 候选人。您可以使用S-SPC进一步缩小候选人的范围, 输入其他模式以匹配。

默认情况下,候选项按缓冲区出现的顺序排列,但您可以 使用C-,以各种方式对它们进行排序。

您也可以选择搜索,而不是搜索上下文 由您提供的上下文正则表达式定义,但非上下文,即 是,文件的文本与正则表达式匹配。去做这个, 在完成期间使用C-M-~。 (这是一个切换,它只影响 未来的搜索命令,而不是当前的搜索命令。)

有关详细信息,请参阅命令icicle-search的文档。