6

我一直在我的 emacs c/c++ 开发设置中试验 cedet 和语义,除了一个小细节外,我对它非常满意。

ede-cpp-root-project用来创建一个项目并提供我的项目的根目录以及包含文件所在的目录,如下所示:

(ede-cpp-root-project "My Project"
                :name "My Project"
                :file "/path/to/rootdir/AFILE"
                :include-path '( 
                "/include2"
                "/include1"
                               )

                )

这使我可以轻松地跳转到函数的声明,semantic-ia-fast-jump但它不会让我了解这些函数的定义。所以它似乎只处理头文件而完全忽略源文件。即使我继续声明函数并触发semantic-analyze-proto-impl-toggle它,它也会告诉我找不到合适的实现。

如果我手动打开函数实现所在的源文件,那么只有这样它才会被语义解析并且上述所有函数都可以工作。

所以我的问题是,除了手动打开项目根目录下包含的所有源文件或ede-cpp-root-project通过:spp-files参数手动将它们包含在其中之外,还有其他方法可以强制解析目录下的所有源文件吗?

谢谢!

4

3 回答 3

8

在忽略了这个问题很长一段时间后,我想我应该花一些时间阅读 elisp 并尝试找出解决方法。它不是最漂亮的 elisp 代码,因为我仅将 elisp 用于我的 emacs 需求,但它可以满足我的需求。

(defvar c-files-regex ".*\\.\\(c\\|cpp\\|h\\|hpp\\)"
  "A regular expression to match any c/c++ related files under a directory")

(defun my-semantic-parse-dir (root regex)
  "
   This function is an attempt of mine to force semantic to
   parse all source files under a root directory. Arguments:
   -- root: The full path to the root directory
   -- regex: A regular expression against which to match all files in the directory
  "
  (let (
        ;;make sure that root has a trailing slash and is a dir
        (root (file-name-as-directory root))
        (files (directory-files root t ))
       )
    ;; remove current dir and parent dir from list
    (setq files (delete (format "%s." root) files))
    (setq files (delete (format "%s.." root) files))
    (while files
      (setq file (pop files))
      (if (not(file-accessible-directory-p file))
          ;;if it's a file that matches the regex we seek
          (progn (when (string-match-p regex file)
               (save-excursion
                 (semanticdb-file-table-object file))
           ))
          ;;else if it's a directory
          (my-semantic-parse-dir file regex)
      )
     )
  )
)

(defun my-semantic-parse-current-dir (regex)
  "
   Parses all files under the current directory matching regex
  "
  (my-semantic-parse-dir (file-name-directory(buffer-file-name)) regex)
)

(defun lk-parse-curdir-c ()
  "
   Parses all the c/c++ related files under the current directory
   and inputs their data into semantic
  "
  (interactive)
  (my-semantic-parse-current-dir c-files-regex)
)

(defun lk-parse-dir-c (dir)
  "Prompts the user for a directory and parses all c/c++ related files
   under the directory
  "
  (interactive (list (read-directory-name "Provide the directory to search in:")))
  (my-semantic-parse-dir (expand-file-name dir) c-files-regex)
)

(provide 'lk-file-search)

要使用它,可以像这样直接调用函数:(my-semantic-parse-dir "path/to/dir/root/" ".*regex")或者M-x lk-parse-curdir-c从缓冲区按以递归扫描该缓冲区的访问文件名目录中的所有 c/c++ 相关文件。

调用该函数的另一种可能更可取的方法是lk-parse-dir-c交互调用,这反过来会提示您输入要解析的目录。

如果任何 elisp 大师有更好的解决方案或建议来改进代码,我很想听听他们的意见。

于 2013-09-21T22:20:24.930 回答
1

我最近为 Python 实现了这个。它可以用于 C/C++,只需稍作改动。

(defvar python-extention-list (list "py"))

(defun semanticdb-rescan-directory (pathname)
  (dolist (file (cddr (directory-files pathname t)))
    (if (file-directory-p file)
        (semanticdb-rescan-directory file)
      (when (member (file-name-extension file) python-extention-list)
        (message "Parsing %s file." file)
        (ignore-errors
            (semanticdb-file-table-object file))))))

(defun semantic-python-rescan-includes ()
  (interactive)
  (dolist (includes (semantic-python-get-system-include-path))
    (message "Parsing %s" includes)
    (semanticdb-rescan-directory includes)))
于 2014-07-25T16:26:23.707 回答
0

尝试运行命令“bovinate”。这可以通过组合键 Meta + X 来完成,然后键入“bovinate”,然后按“Enter”键。“Meta”键在 Windows 中称为“Alt”键。

于 2013-08-15T22:29:17.123 回答