Функция emacs для переключения между заголовком и реализацией для нестандартной структуры проекта

Я работаю над проектом C ++ с немного необычным расположением исходного кода и включаемых файлов (ну, по крайней мере, это необычно для того, что я видел до сих пор), и пытаюсь придумать вспомогательную функцию emacs для переключения между .cpp и соответствующий файл .h (только для этого конкретного случая, поэтому он не должен быть сверхгибким), потому что ff-find-other-file завершается с ошибкой в ​​этой настройке. Это также опыт обучения elisp для меня.

Структура проекта настроена следующим образом:

  • исходные файлы попадают в имя проекта / src / namespacepath / *. cpp
  • соответствующие файлы включают в себя имя проекта / include / namespacepath / *. h

Кроме того, у меня может быть дополнительная проверка этого проекта (projectname2 / ….), и переключение между cpp и h должно происходить в границах проекта.

Другими словами, для исходного файла Foo.cpp класса Foo в пространстве имен a :: b :: c у меня есть:

  • проект / SRC / A / B / C / foo.cpp
  • Проект / включают / A / B / C / foo.h

Сам «проект» хранится в каталоге «src», где я храню все свои источники (поэтому полный путь — что-то вроде ~ / src / project / src / ….), что означает, что функция должна только заменить «src». «with» для последнего «src» вхождения в пути.

Я придумал следующую функцию elisp; он заменяет последнее вхождение «src» на «include» в текущем пути к файлу, а расширение «cpp» — на «h» (или наоборот) и пытается посетить полученный файл.

Так как я новичок в lisp, мне было бы интересно узнать, можно ли сделать это проще? Или, возможно, ff-find-other-file может быть настроен именно для этого? (и да, я видел ff-search-directory, но это не помогло бы при работе над несколькими проверками одного и того же проекта).

(defun alternate-include-or-src()
(interactive)
(let (
(name)
(newname "")
(repl t)
)
(setq name (nreverse (split-string (buffer-file-name) "/")))
(setq filename (car name))
(dolist (p (cdr name)) ;; iterate over reversed list of path components
(if repl   ;; do the src <-> substitution only once
(if (string= p "src")
(progn
(setq p "include"repl nil)
(setq filename (concat (file-name-sans-extension filename) ".h"))
)
(if (string= p "include")
(progn
(setq p "src"repl nil)
(setq filename (concat (file-name-sans-extension filename) ".cpp"))
)
)
)
)
(setq newname (concat p "/" newname))
)
(setq newname (concat newname filename))
(if (file-exists-p newname)
(find-file newname)
)
)
)

0

Решение

Я предлагаю вам взглянуть на cc-other-file-alistдля его использования с ff-find-other-file, Это позволяет настраивать вызовы функций, и вы можете сохранить некоторую кодировку:

Пример:

(setq cc-other-file-alist
`(
("\\.cxx$" ,(my-look-for-other-file-1))
("\\.hxx$" ,(my-look-for-other-file-2))))
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]