【问题标题】:Can't assign file name to environment variable inside vim无法将文件名分配给vim内的环境变量
【发布时间】:2019-04-07 22:16:24
【问题描述】:

最后我想用 gcc 用 vimux 编译我的源代码

(假设文件名为 test.c)

在 vimux 之前我做过

:!gcc % -o test

安装 vimux 后我会这样做

nmap <leader>z :let $file_name = expand('%:t:r')<cr>:let $full_file_name = %<cr>:call VimuxRunCommand("gcc $full_file_name -o $file_name")<cr>

但我错了

无效的表达式:%

我也尝试过使用 vim 变量来做到这一点,因为我认为问题出在范围

【问题讨论】:

  • 改用:!make %:r;如果您使用 makefile,您可以更轻松地为编译器获得更多选项。就目前而言,您没有使用-Wall,因此正在浪费gcc。你不能不使用-Wall 编译;如果我按照我的方式进行编译,您将使用 -Wall -Wextra -Werror -Wstrict-prototypes -Wmissing-prototypes 进行编译(使用 makefile 很容易做到这一点,而您打算使用的则更难)。
  • :make %&lt; 更好
  • 否则,我看不出使用环境变量来执行这个 Vim 命令的意义。直接将最终字符串填充到命令中。顺便说一句,对于单文件项目,只需make 就足够了,我们甚至不需要Makefile。最后,它可能会变成这样::call VimuxRunCommand('make '.expand('%&lt;'))——但你会失去 quickfix 功能,它不再需要 tmux 来在后台编译,而是 vim 插件。

标签: c gcc vim environment-variables


【解决方案1】:

正如@JonathanLeffler 所说,make 更好,但如果你真的想继续使用 gcc,你应该:

  • 还要扩展$full_file_name,而不仅仅是file_name
  • 使用shellescape,您不希望文件名中的空格成为问题

你的代码应该是这样的:

nmap &lt;leader&gt;z :let $file_name = shellescape(expand('%:t:r'))&lt;cr&gt;:let $full_file_name = shellescape(expand('%:p'))&lt;cr&gt;:call VimuxRunCommand("gcc " . $full_file_name . " -o " . $file_name)&lt;cr&gt;

%:p 是因为我猜你想要带有完整路径的文件名。

【讨论】:

  • 它不起作用。输出:gcc $full_file_name -o $file_nameclang: error: no input files
  • @helsereet 我错过了连接,我无法测试它,但它现在应该可以工作(我已经编辑了答案)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2021-09-24
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
相关资源
最近更新 更多