有没有办法让Emacs tags-search命令收集缓冲区中的所有搜索结果?像'grep'和'tags-apropos'的结果一样收集在编译缓冲区中?
如果存在大量命中,则使用M-,
迭代结果并不是非常有效,所以如果有一种方法可以在缓冲区中浏览和搜索结果,那就太棒了。
谢谢,
BENJ
答案 0 :(得分:4)
答案 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
的文档。