0

假设我从一个大型项目根文件夹启动 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使用但不一定在同一文件中定义的任何函数。
    • 如果我想打开一个新文件,我想使用根文件夹中的路径而不是当前文件路径来访问它

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

它看起来像这样:

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

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

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

4

1 回答 1

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!

This simple pattern .*\zssrc.* searches for the last src in your path and replaces it (and anything after it) with build. It does nothing if there is no src in the path.

于 2018-09-22T03:44:10.140 回答