语义,cedet如何强制解析源文件

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

我使用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它也会告诉我没有找到合适的实现。

如果我手动打开函数实现所在的源文件,那么它只能通过语义进行解析,并且所有上述函数都能正常工作。

所以我的问题是,如果没有手动打开项目根目录下包含的所有源文件,或者通过:spp-files参数手动将它们包含在ede-cpp-root-project ,还有其他任何方法可以强制解析所有源文件一个目录?

谢谢!

在忽略了这个问题很长一段时间之后,我认为我应该花一些时间阅读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") Mx lk-parse-curdir-c (my-semantic-parse-dir "path/to/dir/root/" ".*regex")或者从缓冲区按Mx lk-parse-curdir-c递归从该buferr的访问文件名目录中扫描所有与c / c ++相关的文件。

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

如果任何elisp guru有更好的解决方案或改进代码的建议,我很乐意听到它们。

我最近为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))) 

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