emacs函数用于在标头和非标准项目结构的实现之间切换

时间:2013-11-07 17:47:48

标签: c++ emacs elisp

我正在开发一个C ++项目,其中有一些不常见的源和包含文件布局(好吧,至少它对于我迄今为止看到的情况来说并不常见)并且我正在尝试提供一个帮助器emacs函数进行切换在.cpp和相应的.h文件之间(仅针对这种特殊情况,因此它不需要超级灵活),因为ff-find-other-file在此设置上失败。这对我来说也是一个elisp学习经历。

项目结构设置如下:

  • 源文件属于projectname / src / namespacepath / * .cpp
  • 各个包含文件属于projectname / include / namespacepath / * .h

此外,我可能会额外检查该项目(projectname2 / ....),并且cpp和h之间的切换应该在项目边界内进行。

换句话说,对于名称空间a :: b :: c中类Foo的源文件Foo.cpp,我有:

  • 项目/ SRC / A / B / C / Foo.cpp中
  • 项目/包括/ A / B / C / foo.h中

“项目”本身保存在“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)
      )
    )
  )

1 个答案:

答案 0 :(得分:3)

我建议您查看cc-other-file-alistff-find-other-file一起使用的内容。它允许自定义函数调用,您可以保存一些编码:

示例:

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