【问题标题】:Recursive makefiles within vimvim 中的递归生成文件
【发布时间】:2012-09-20 17:32:10
【问题描述】:

我的 c++ 项目由多个目录组成,每个目录都有自己的 makefile。再上一层,我还有一个顶级 makefile,它按顺序调用其他的。

在 vim 中,我想制作顶级 makefile 或一个子文件。我想在 vim 中查看我的错误,在一行上按 ENTER 以跳转到源代码行。

这可以使用

make | copen

但一次只有一个目录。错误窗口中列出的文件名只是一个名称,没有路径。如果您尝试构建顶级 makefile 并在文件名/行号上按 ENTER,它不知道文件的路径。

有没有办法解决这个问题?我想从 vim 中构建顶级 makefile,无论错误在哪个目录中,都可以跳转到正确的文件。问题可能是g++只输出文件名,不输出路径。

【问题讨论】:

    标签: vim g++ makefile


    【解决方案1】:

    'errorformat' 有一个内置的机制;来自:help errorformat

    一些编译器生成的消息由目录名组成,这些目录名必须 被添加到 %f 读取的每个文件名之前(例如:GNU make)。以下 代码可用于扫描这些目录名称;它们将被存储在一个 内部目录堆栈。 E379 %D "进入目录" 格式字符串;期待以下 %f 找到目录名 %X "离开目录" 格式字符串;预计以下 %f

    定义“进入目录”或“离开目录”格式时,“%D”或 "%X" 必须在该子字符串的开头给出。 Vim 跟踪目录 更改当前目录并将其添加到每个发现的错误文件中 相对路径。见 |quickfix-directory-stack|有关详细信息、提示和 限制。

    因此,您需要让 Makefile 输出这些“更改目录”消息,并确保通过您的 'errorformat' 设置正确解析它们。

    【讨论】:

    • 我需要对一般的错误格式感到满意,所以目前正在寻找一些好读的东西。开始阅读 vim 帮助,很快就迷路了。当我了解这些内容时,我会回来报告。
    • 如果您不想自己输出消息,make -w 会这样做。
    【解决方案2】:

    你可以给 Vim 一个自定义命令来执行 :make:

    :set makeprg=make\ -f\ /path/to/your/toplevel/makefile
    

    【讨论】:

    • 我试试这个,然后我打开其中一个子文件并 `make |哥本”。错误列表包含一个没有目录的文件名,因此它不会打开现有文件,而是打开一个新的空文件。
    【解决方案3】:

    你可以在你的vim中创建一个映射到下面的

    !find .. -type d -exec make -C {} \;
    

    类似:

    map  <F12>    <esc>:!find .. -type d -exec make -C {} \;<cr>
    

    我相信您仍然应该在 :clist 中看到错误。

    如果要运行上层 make 文件,可以执行以下操作:

    :make -C .. | copen
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 2016-04-25
      • 2020-02-09
      • 2013-11-19
      • 2021-09-27
      • 2015-12-23
      相关资源
      最近更新 更多