有没有办法让 Emacs tags-search 命令收集缓冲区中的所有搜索结果?类似于“grep”和“tags-apropos”的结果被收集在编译缓冲区中的方式?
M-,
如果有大量命中,使用迭代结果不是很有效,所以如果有一种方法可以浏览和搜索缓冲区中的结果,那就太好了。
谢谢,
本杰
我在第一个答案中误解了你的问题。这是一个可行的方法,但有点不好,因为它使用同步调用 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)))))
见icicle-tags-search
。它使您可以搜索标记表中列出的所有源文件以查找给定正则表达式的匹配项。
您可以在源代码文件中看到所有匹配的正则表达式,作为要访问的搜索命中。使用给定标签文件中的所有标签,包括来自相同或不同源文件的重复标签。
默认情况下,使用所有标签文件,但如果您提供前缀参数,则仅使用当前标签表。
搜索匹配项,包括完成、循环和搜索命中替换。
在指定定义搜索上下文的正则表达式后,键入输入(例如正则表达式或其他模式)以在上下文中匹配。与您的输入匹配的上下文可用作完成候选。您可以使用S-SPC
以进一步缩小候选者的范围,键入要匹配的其他模式。
默认情况下,候选项按缓冲区出现的顺序排列,但您可以使用C-,
.
您也可以选择搜索,而不是您提供的上下文 regexp 定义的搜索上下文,而是non-contexts,即文件中与 regexp不匹配的文本。为此,请C-M-~
在完成期间使用。(这是一个切换,它只影响未来的搜索命令,而不是当前的。)
icicle-search
有关更多信息,请参阅命令文档。