【问题标题】:Compiling C file from vim in a "path agnostic" way以“路径不可知”的方式从 vim 编译 C 文件
【发布时间】:2018-09-21 19:56:59
【问题描述】:

假设我从一个大型项目根文件夹启动 vim 并想要编译一个特定的示例(例如,我将使用 zephyr RTOS)。这个根文件夹位于/home/<user>/zephyr/

假设我运行vim samples/basic/blinky/src/main.c。 现在,如果我想编译它,我会从另一个终端转到 samples/basic/blinky/build/ 并运行 make

如果我想在不离开 vim 的情况下构建它,我可以运行 :make -C samples/basic/blinky/build/

我想自动化这个过程,按任意键,比如说 f5。

例如,如果我有两个垂直拆分,v1 和 v2。

在 v1 中我有 samples/basic/blinky/src/main.c,在 v2 中我有 samples/drivers/rtc/src/main.c

从 v1 中按 f5 将导致运行相当于 :make -C samples/basic/blinky/build/,而从 v2 中按 f5 将导致运行相当于 :make -C samples/drivers/rtc/build/

常见的模式是build文件夹位于当前c文件目录的../build/

我不想“永久”使用:cd:lcd 来更改工作目录,即使对于当前的拆分/窗口也是如此,因为:

  • 我的 ctags 标签文件位于根文件夹中,因此我希望能够跳转到 samples/basic/blinky/src/main.c 使用但不一定在同一个文件中定义的任何函数。
    • 如果我想打开一个新文件,我想使用根文件夹中的路径而不是当前文件路径来访问它

我当前的解决方案是在我的~/.vimrc 中有一个函数,它将工作目录临时更改为当前文件等效的构建文件夹,以便我可以运行:make,然后将工作目录更改回根文件夹。

看起来像这样:

nnoremap <F5> :call MakeTst()<CR> function! MakeTst(...) :cd %:p:h :cd ../build/ :make :cd /home/<user>/zephyr/ endfunction

虽然这可行,但缺点是根文件夹是硬编码在 ~/.vimrc 中的。

如何在不硬编码根文件夹路径的情况下获得相同的结果?

【问题讨论】:

  • cmake 标签与问题有何关联? (makecmake不同的东西)。
  • @Tsyvarev 感谢您的建设性意见!您是绝对正确的(正如您在粗体中指出的那样)。我将其添加为“缺乏思考”,因为示例项目使用它来生成 Makefile。由于它与问题无关,因此我将其删除。干杯
  • :make -C %:p:h/../build 可以工作吗?
  • @user58697 好吧,我真的很愚蠢,因为我自己没有把这些碎片拼凑起来……这行得通,谢谢!

标签: c vim ctags zephyr-rtos


【解决方案1】:

您自己给出了答案:在您的函数中。只要你的文件 结构保持该模式,您可以使用文件名修饰符来制作它 通用:

:nnoremap <F5> :make -C %:p:h/../build

这将始终构建在目录 build 的同一级别 当前文件所在的目录。就像你的例子:

a/b/c/src/file.c
a/b/c/build

在这样的情况下会中断:

a/b/c/src/include/features.h

因为它会尝试构建:

a/b/c/src/build

虽然有一个解决方法。如果您的build 始终相同 src 的级别,然后您可以使用 :s 执行文本替换 修饰符:

:nnoremap <F5> :make -C %:p:s!.*\zssrc.*!build!

这个简单的模式.*\zssrc.* 搜索你的最后一个src 路径并用build 替换它(以及它之后的任何内容)。它确实 如果路径中没有src,则什么都没有。

【讨论】:

  • 感谢您的回答和提示!
猜你喜欢
  • 1970-01-01
  • 2011-11-05
  • 2016-08-28
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
相关资源
最近更新 更多