【问题标题】:Vim makeprg make environment variable expansionvim makeprg make 环境变量扩展
【发布时间】:2019-01-20 23:13:09
【问题描述】:

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

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

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

  • 在 shell 提示符下使用 make 可以正常构建项目:
make -d
This program built for i386-apple-darwin11.3.0
Reading makefiles...
Reading makefile `Makefile'...
Reading makefile `/usr/local/opt/arduino-mk/Arduino.mk' (search path) (no ~ expansion)...
  • 但是,在 Vim 中使用 :make,定义变成了旧安装的东西:
:make
This program built for i386-apple-darwin11.3.0
Reading makefiles...
Reading makefile `Makefile'...
Reading makefile `/usr/local/Cellar/arduino-mk/1.5.2/Arduino.mk' (search path) (no ~ expansion)...
Makefile:24: /usr/local/Cellar/arduino-mk/1.5.2/Arduino.mk: No such file or directory

我终生无法找到将 ARDMK_DIR 重新定义为“/usr/local/Cellar/arduino-mk/1.5.2”的位置。我尝试过的事情:

  • setlocal makeprg=echo\ $ARDMK_DIR\ &&\ make\ -d\: echo 用我的 shell 定义 (/usr/local/opt/arduino-mk) 返回,但 make 失败并出现上述错误!!
  • :echo $ARDMK_DIR: 再次返回我的 shell 定义。
  • ag 我的 ARDMK_DIR 主目录,唯一定义它的地方是我的 shell 导出。因为我的根目录和同样的事情。 $VIMRUNTIME 也是如此
  • 即使 vim-disptach 调用相同的 makeprg?!
  • 也能正常工作
  • 在项目 Makefile 中重新定义ARDMK_DIR。一切都按预期构建。但是我不想这样做,因为我使用不同的系统进行编译。
  • 相同的 vim 配置在其他 macOS 和 Linux 系统上也能正常工作。

echomake 的实际执行之间的某个位置,正在重新定义 ARDMK_DIR。为什么以及任何人都可以想出一种方法来找出并解决这个问题?

【问题讨论】:

  • set shell? 的输出是什么。
  • shell=/usr/local/bin/zsh - 如echo所示,我的环境正在正确导出到vim shell。
  • 就是这样!在.zshenv 中有一个额外的ARDMK_DIR 导出。我的ag 搜索缺少--hidden 标志:facepalm:所以没找到。无论如何,我没有意识到 .zshenv 在每个新生成时都会被读取 - 这解释了为什么 vim 在 .zshrc 中导出我的导出但启动 make 来源 .zshenv,它覆盖了它。谢谢!
  • 我刚刚删除了我的评论,因为我认为我的测试用例是错误的:-)。很高兴我能帮上忙。

标签: vim makefile


【解决方案1】:

Zsh 有多个源文件。文件 .zshenv 始终在 shell 启动时被获取,而文件 .zshrc 仅在 shell 以交互模式启动时被获取。

如果您在.zshenv.zshrc 中使用不同的值定义变量ARDMK_DIR,则当您与shell 交互工作时(输入命令、启动Vim、... )。

但是当 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 的值。

【讨论】:

  • 非常好,感谢您阐明为什么 echomake 有不同的输出。吸取了一些很好的经验教训。
猜你喜欢
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多