Vim makeprg make环境变量扩展
这让我感到非常困扰,我完全被难住了。我觉得找到答案会有一些很好的学习机会,所以希望它是相关的 我使用Vim进行嵌入式C开发,并使用Arduino(使用)为业余爱好者进行设置。我使用Vim makeprg make环境变量扩展,vim,makefile,Vim,Makefile,这让我感到非常困扰,我完全被难住了。我觉得找到答案会有一些很好的学习机会,所以希望它是相关的 我使用Vim进行嵌入式C开发,并使用Arduino(使用)为业余爱好者进行设置。我使用:make和一些构建项目的快捷方式 外部定义解析项目级Makefile中的Arduino Makefile根目录:“ARDMK_DIR=/usr/local/opt/Arduino mk”。这被定义为我的shell(zsh)中的导出。这就是它变得奇怪的地方: 在shell提示符下使用make,项目构建良好: 但是
:make
和一些构建项目的快捷方式
外部定义解析项目级Makefile中的Arduino Makefile根目录:“ARDMK_DIR=/usr/local/opt/Arduino mk”。这被定义为我的shell(zsh)中的导出。这就是它变得奇怪的地方:
- 在shell提示符下使用
,项目构建良好:make
- 但是,在Vim中使用
,define将成为旧安装的一部分::make
:echo返回我的shell定义(/usr/local/opt/arduino mk),但是setlocal makeprg=echo\$ARDMK\u DIR\&&\make \-d\
失败,出现上述错误李>make
:再次返回我的shell define:echo$ARDMK_DIR
my home directory for ARDMK_DIR,它定义的唯一位置是在我的shell导出中。从那时起,我的根目录就被删除了。同样的事情发生在$VIMRUNTIMEag
- 甚至vim dispatch调用相同的
?,也可以正常工作李>makeprg
- 在项目生成文件中重新定义
。一切按预期进行。但是,我不想这样做,因为我使用不同的系统编译ARDMK_DIR
- 相同的vim配置在其他macOS和Linux系统上工作,具有预期的行为
在
echo
和make
的实际执行之间,正在重新定义ARDMK_DIR。为什么有人能想出一种方法来找出这个问题并解决它呢?Zsh有多个源代码的init文件。当shell启动时,文件.zshenv
始终是源文件,只有当shell以交互模式启动时,文件.zshrc
才是源文件
如果在.zshenv
和.zshrc
中使用不同的值定义变量ARDMK_DIR
,则在与shell交互工作时(输入命令、启动Vim等),将使用.zshrc
中的值
但是当Vim启动一个命令时,它将启动一个非交互式shell。在这种情况下,只有文件.zshenv
将被源化,因此您可以从该文件获得值
还有一个问题:
为什么下面的命令首先回显正确的值,但make
使用了错误的值
:setlocal makeprg=echo\ $ARDMK_DIR\ &&\ make\ -d\
为了进行测试,我在
strace
下启动了Vim。然后:
:set makeprg=echo\ $EDITOR
:make
在strace文件中,我找到了以下行:
execve("/usr/bin/zsh", ["/usr/bin/zsh", "-c", "echo vi 2>&1| tee /tmp/vdxR5DH/"...], [/* 86 vars */]) = 0
如您所见,Vim执行echo vi,因此在调用shell之前,它已经将环境变量$EDITOR
扩展到它的值
因此,上述问题的答案是,
echo
命令回显文本,Vim插入命令行,而make
命令从环境中获取变量值。由于它是一个非交互式shell,它是.zshenv
中的值,设置shell的输出是什么?.shell=/usr/local/bin/zsh-正如echo
my env正确导出到vim shell。就是这样!在.zshenv
中有一个额外的ARDMK_DIR
导出。我的ag
搜索缺少--hidden
标志:facepalm:因此没有找到它。无论如何,我没有意识到,.zshenv
每一个新版本都会被读取-这解释了为什么vim在.zshrc
中有我的导出,但启动了make
源代码.zshenv
,这会重写它。谢谢我刚刚删除了我的评论,因为我认为我的测试用例是错误的:-)。很高兴我能提供帮助。非常感谢您澄清为什么echo
的输出与make
不同。从中吸取了一些有益的教训。
:set makeprg=echo\ $EDITOR
:make
execve("/usr/bin/zsh", ["/usr/bin/zsh", "-c", "echo vi 2>&1| tee /tmp/vdxR5DH/"...], [/* 86 vars */]) = 0