以 "path agnostic"方式从vim编译C文件

标签 c vim ctags zephyr-rtos

假设我从一个大型项目根文件夹启动 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 开始将导致运行相当于 :make -C samples/drivers/rtc/build/

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

我不想“永久”使用: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 内。 .

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

最佳答案

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

: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,则什么也没有。

关于以 "path agnostic"方式从vim编译C文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52450370/

相关文章:

c - 在c中实现3D数组的递归算法

vim - 如何用数字解决这些问题?

c - Vim + omnicppcomplete 枚举补全

python - 当我尝试为所有 python 库构建标记文件时,ctags 永远不会停止

c - 在 C 中执行字符串的特殊初始化

c - Bison 意外 token

c - __attribute__ 包含一个整数

vim - 如何在 Vim 中取消设置变量?

search - 在所有VI缓冲区中查找/Grep

ctags - 使用 ctags 生成调用层次结构图