如何在emacs中找到TAGS文件中的文件

时间:2011-10-05 21:20:49

标签: emacs elisp

我使用ctags为目录中的* .h和* .cpp文件生成了TAGS文件。 如何在TAGS文件中查找文件。

假设我已经为文件one.h two.h three.h生成了TAGS文件。查找文件one.h,two.h,three.h的命令是什么,而不是这些文件中的标记。

5 个答案:

答案 0 :(得分:5)

假设您只是想知道如何使用TAGS文件...

使用以下内容加载TAGS文件:
M-x visit-tags-table RET TAGS文件或父目录 RET

然后你可以用它:

  • M - 。(即find-tag
  • M-x tags-search RET pattern RET
    M - ,移动到每个连续的匹配)
  • M-x tags-apropos RET 模式 RET
  • Mx 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)