我正在开发一个C ++项目,其中有一些不常见的源和包含文件布局(好吧,至少它对于我迄今为止看到的情况来说并不常见)并且我正在尝试提供一个帮助器emacs函数进行切换在.cpp和相应的.h文件之间(仅针对这种特殊情况,因此它不需要超级灵活),因为ff-find-other-file在此设置上失败。这对我来说也是一个elisp学习经历。
项目结构设置如下:
此外,我可能会额外检查该项目(projectname2 / ....),并且cpp和h之间的切换应该在项目边界内进行。
换句话说,对于名称空间a :: b :: c中类Foo的源文件Foo.cpp,我有:
“项目”本身保存在“src”目录中,我保存所有源代码(所以完整路径就像〜/ src / project / src / ....),这意味着该函数应该只将“src”替换为“include”,以替换路径中的最后一个“src”。
我想出了下面的elisp函数;它将“src”的最后一次出现替换为当前文件路径中的“include”,将“cpp”扩展名替换为“h”(反之亦然),并尝试访问生成的文件。
由于我是lisp的新手,我有兴趣知道它是否可以变得更简单?或者也许ff-find-other-file可以自定义来做到这一点? (是的,我已经看过ff-search-directories,但是在处理同一个项目的多个签出时这无济于事。)
(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 :(得分:3)
我建议您查看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))))