Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim makeprg make环境变量扩展_Vim_Makefile - Fatal编程技术网

Vim makeprg make环境变量扩展

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,项目构建良好: 但是

这让我感到非常困扰,我完全被难住了。我觉得找到答案会有一些很好的学习机会,所以希望它是相关的

我使用Vim进行嵌入式C开发,并使用Arduino(使用)为业余爱好者进行设置。我使用
:make
和一些构建项目的快捷方式

外部定义解析项目级Makefile中的Arduino Makefile根目录:“ARDMK_DIR=/usr/local/opt/Arduino mk”。这被定义为我的shell(zsh)中的导出。这就是它变得奇怪的地方:

  • 在shell提示符下使用
    make
    ,项目构建良好:
  • 但是,在Vim中使用
    :make
    ,define将成为旧安装的一部分:
我一辈子都找不到ARDMK_DIR被重新定义为“/usr/local/ceral/arduino mk/1.5.2”的地方。我尝试过的事情:

  • setlocal makeprg=echo\$ARDMK\u DIR\&&\make \-d\
    :echo返回我的shell定义(/usr/local/opt/arduino mk),但是
    make
    失败,出现上述错误
  • :echo$ARDMK_DIR
    :再次返回我的shell define
  • ag
    my home directory for ARDMK_DIR,它定义的唯一位置是在我的shell导出中。从那时起,我的根目录就被删除了。同样的事情发生在$VIMRUNTIME
  • 甚至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