Я работаю над проектом C ++ с немного необычным расположением исходного кода и включаемых файлов (ну, по крайней мере, это необычно для того, что я видел до сих пор), и пытаюсь придумать вспомогательную функцию emacs для переключения между .cpp и соответствующий файл .h (только для этого конкретного случая, поэтому он не должен быть сверхгибким), потому что ff-find-other-file завершается с ошибкой в этой настройке. Это также опыт обучения elisp для меня.
Структура проекта настроена следующим образом:
Кроме того, у меня может быть дополнительная проверка этого проекта (projectname2 / ….), и переключение между cpp и h должно происходить в границах проекта.
Другими словами, для исходного файла Foo.cpp класса Foo в пространстве имен a :: b :: c у меня есть:
Сам «проект» хранится в каталоге «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)
)
)
)
Я предлагаю вам взглянуть на 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))))
Других решений пока нет …