Семантический, cedet, как заставить парсинг исходных файлов

Я экспериментировал с cedet и семантикой в ​​настройке разработки emacs c / c ++, и я вполне доволен ею, кроме одной маленькой детали.

Я использую 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 : есть ли другой способ принудительного parsingа всех исходных файлов в каталог?

Спасибо!

После долгого игнорирования этой проблемы я подумал, что должен потратить некоторое время на чтение 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 из буфера в рекурсивно сканируйте все связанные с c / c ++ файлы из этой директории имени загружаемого файла buferr.

Альтернативный и, возможно, предпочтительный способ вызова функции заключается lk-parse-dir-c интерактивном вызове lk-parse-dir-c который, в свою очередь, побудит вас к анализу каталога.

Если какой-либо elisp гуру имеет лучшее решение или предложения по улучшению кода, я бы с удовольствием их услышал.

Я недавно применил это для 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». Ключ «Мета» называется «Alt» в windowsх.