Emacs ff-find-other-file 找不到我的头文件

3

我无论如何都无法使用emacs的ff-find-other-file找到我的头文件。以下是我的最小示例:

cd ~/tmp
mkdir test
cd test
mkdir -p src/a/b inc/a/b
echo "aaaa" > src/a/b/a.cpp
echo "bbbb" > inc/a/b/a.hpp
tree

提供:

.
├── inc
│   └── a
│       └── b
│           └── a.hpp
└── src
    └── a
        └── b
            └── a.cpp

这与我的项目结构类似。


emacs -Q src/a/b/a.cpp

将以下内容拷贝到*scratch*缓冲区中,并使用C-x C-e执行:

(setq cc-search-directories '("." "../inc" "../inc/*" "../../inc/*" "../../../inc/*" "/usr/include"))

在缓冲区中运行ff-find-other-file只会在minibuffer中显示提示信息:

在~/tmp/test/src/a/b/中查找或创建a.hpp

ff-search-directories上执行C-h v返回cc-search-directories,在cc-search-directories上执行C-h v返回如上列表。

我希望ff-find-other-file查找../../../inc/*并找到a.hpp。为什么它没有找到呢?


编辑:这里似乎是递归部分不起作用了。

之后:

cp inc/a/b/a.hpp inc/

a.hpp是从a.cpp找到的。

ff-search-directories的帮助文档如下:

星号不是通配符:它们与前面的斜杠一起搜索。星号表示除“..”之外的所有子目录,每个子目录将依次被搜索。

请注意,此引用来自ff-search-directories的帮助文档,而我修改的列表是cc-search-directories。但我不知道这会有什么区别。

这和其他SO主题让我相信*会递归地搜索目录树。错了吗?

3个回答

3

*代表其父级目录的每个直接子目录,仅如此。

注释稍微清晰一些:

星号并不是通配符字符:它只表示必须依次搜索该目录的子目录。

例如:对于这个具体的例子,我期望"../../../inc/*/b"可以工作。或者使用"../../../inc/*/*"(正如您最终使用的那样)。

另请参见https://stackoverflow.com/a/23662870/324105,特别要注意,您可以定义函数来动态生成目标文件路径。

我猜你想要a/b基于原始路径确定,因此编写一个返回适当路径到其他文件的函数可能是您最好的解决方案。


2

另一个选择是使用Projectile并执行projectile-find-other-file命令。由于Projectile知道您的项目结构,它会自动匹配您的cpp/h文件。虽然它比ff-find-other-file慢一点,但它似乎能很好地完成工作。


1

哦,搜索结果原来并不是递归的。这里的其他问题和答案让我误读了帮助文档(在问题中引用)。

“每个子目录将依次被搜索”并不意味着它们的子目录也会被搜索。

由于我的树的深度是有限的,因此我只修改了cc-search-directories

(setq cc-search-directories '("."
                              "../inc" "../inc/*" "../../inc/*" "../../../inc/*"
                              "../../inc/*/*" "../../../inc/*/*/*"
                              "../src" "../src/*" "../../src/*" "../../../src/*"
                              "../../src/*/*" "../../../src/*/*/*"
                              "/usr/include" "/usr/local/include/*"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接