emacs ff-find-other-file找不到我的标题

时间:2016-06-23 11:21:38

标签: emacs

不知怎的,我无法制作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中运行a.cpp,只会导致迷你缓冲区出现提示:

  

Find or create a.hpp in: ~/tmp/test/src/a/b/

C-h v上的

ff-search-directories返回cc-search-directoriescc-search-directories上的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上的这个和其他线程让我相信http://192.168.4.134:9084/....会递归搜索目录树。错?

3 个答案:

答案 0 :(得分:1)

*表示其父级的每个直接子目录;仅此而已。

评论的措辞略显清楚:

  

星号不是一般的通配符:它只是表示必须依次搜索每个目录的子目录。

即。对于这个具体的例子,我希望"../../../inc/*/b"可以工作。或者确实"../../../inc/*/*"(因为你已经结束了使用)。

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

我怀疑您希望根据原始路径确定a/b,因此将相应路径返回到其他文件的函数将是您的最佳解决方案。

答案 1 :(得分:1)

另一种选择是使用 Projectile 并执行projectile-find-other-file命令。由于projectile了解您的项目结构,它将自动匹配您的cpp / h文件。它比ff-find-other-file慢一点,但似乎做得很好。

答案 2 :(得分:0)

哦,毕竟搜索结果不是递归的。这些其他问题和答案让我误解了帮助(在问题中引用)。

"将依次搜索这些子目录中的每一个",并不暗示他们的子目录也将被搜索。

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

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