我使用ctags为目录中的* .h和* .cpp文件生成了TAGS文件。 如何在TAGS文件中查找文件。
假设我已经为文件one.h two.h three.h生成了TAGS文件。查找文件one.h,two.h,three.h的命令是什么,而不是这些文件中的标记。
答案 0 :(得分:5)
假设您只是想知道如何使用TAGS文件...
使用以下内容加载TAGS文件:
M-x visit-tags-table
RET TAGS文件或父目录 RET
然后你可以用它:
find-tag
)tags-search
RET pattern RET tags-apropos
RET 模式 RET tags-query-replace
RET 模式 RET 替换 RET 这些是默认值。当然,有一些增强功能:
http://www.emacswiki.org/emacs/EmacsTags
我个人使用etags-select
(你可以通过ELPA获得),我有 M - 。绑定到etags-select-find-tag
。
答案 1 :(得分:2)
几年前我写过这篇文章,但我还没有发布它,尽管......享受!
函数tags-extra-find-file
将允许您访问当前标记表中的文件,完成文件名完成。如果您有许多源文件分布在大量目录中,这是完美的。 (老实说,我每天至少使用它一百次......)
(defun tags-extra-get-all-tags-files ()
"Return all, fully qualified, file names."
(save-excursion
(let ((first-time t))
(while (visit-tags-table-buffer (not first-time))
(setq first-time nil)
(setq res
(append res (mapcar 'expand-file-name (tags-table-files)))))))
res))
(defun tags-extra-find-file (name)
"Edit file named NAME that is part of the current tags table.
The file name should not include parts of the path."
(interactive
(list
(completing-read "Name of file: "
;; Make an a-list of all files without path.
(mapcar
(lambda (file)
(cons (file-name-nondirectory file) nil))
(tags-extra-get-all-tags-files)))))
(let ((files (tags-extra-get-all-tags-files))
(done nil)
(name-re (concat "^" (regexp-quote name) "$")))
(while (and (not done)
files)
(let ((case-fold-search t))
(if (string-match name-re (file-name-nondirectory (car files)))
(setq done t)
(setq files (cdr files)))))
(if files
(find-file (car files))
(error "File not found in the tags table."))))
答案 2 :(得分:1)
这样的东西?它可能不完全健壮。
(defun visit-tags-table-and-files (file)
"Run `visit-tags-table FILE', then visit all the referenced files."
(interactive "fTags file: ")
(visit-tags-table file)
(save-excursion
(set-buffer (get-file-buffer tags-file-name))
(mapc #'find-file (tags-table-files)) ) )
答案 3 :(得分:0)
谢谢@ Lindydancer的回答和emacswiki ido。 emacswiki版本仅支持一个标记文件。将它们组合起来,可以跳转到所有TAG文件中的任何文件。靠近崇高文本的小资其他任何东西。
这是代码。
;;; using ido find file in tag files
(defun tags-extra-get-all-tags-files ()
"Return all, fully qualified, file names."
(save-excursion
(let ((first-time t)
(res nil))
(while (visit-tags-table-buffer (not first-time))
(setq first-time nil)
(setq res
(append res (mapcar 'expand-file-name (tags-table-files)))))
res)))
(defun ido-find-file-in-tag-files ()
(interactive)
(find-file
(expand-file-name
(ido-completing-read
"Files: " (tags-extra-get-all-tags-files) nil t))))
答案 4 :(得分:0)
此更正适用于emacs 26.3。带有古老的标签,M-。会接受文件名(例如Setup.cpp),并在etags找到文件的地方访问该文件。非常方便,在许多目录中都有很多文件。无需记住该文件所在的目录即可访问它。我很惊讶这不是开箱即用的功能!
(defun tags-extra-get-all-tags-files ()
"Return all, fully qualified, file names."
(setq res nil)
(save-excursion
(let ((first-time t))
(while (visit-tags-table-buffer (not first-time))
(setq first-time nil)
(setq res
(append res (mapcar 'expand-file-name (tags-table-files)))))))
res)