如何让vim理解makefile中括号'()'之间的env变量?

问题描述 投票:0回答:1

我正在尝试使用 gf 带括号的文件路径,如下所示 $(env_var)/aaa/bbb/foo.txt

尽管我设置了 isfname 但似乎 vim 将其视为空格 设置 isfname -=(,)

当我像下面这样使用 isfname 时,似乎括号本身被 vim 读取但不起作用 设置 isfname +=(,)

有什么方法可以在括号内使用 gf 和 env var 吗?

vim makefile gf
1个回答
0
投票

要对

gf
进行更复杂的替换,您可以使用
includeexpr
。它为
gf
提供了后备,如
:help gf
中所述。

首先,您需要向

isfname
添加括号,就像捕获
$(env_var)

所做的那样

然后你可以编写一个微小的替换函数。

要仅在 makefile 上使用它,您应该将以下代码放入

~/.vim/after/ftplugin/make.vim

setlocal isfname+=(,)
setlocal includeexpr=substitute(v:fname,'\\$(\\(.\\{-}\\))','\\=getenv(submatch(1))','g')

这将查看光标下方的文件名,并将字符串

$(env_var)
替换为
getenv(env_var)
的结果。正则表达式看起来有点吓人,因为反斜杠必须转义两次。它大致相当于
$(.*)
并非贪婪地捕获括号内的任何内容作为子匹配。然后将该子匹配输入到
getenv()

请参阅

:help 'includeexpr'
:help substitute()
以供参考。

请记住,当您编辑和运行文件时,

env_var
可能具有完全不同的值。

更正统的替代方案是在

env_var
指向
path
选项的地方添加。

© www.soinside.com 2019 - 2024. All rights reserved.