将文件路径传递给 vim 中的 shell 命令

Pass filepath to a shell command in vim

我如何正确 'escape' vim 中的以下命令?

:!file=expand('%:r')

基本上,我想做类似的事情:

$ file=my_filename

这样我就可以执行后续的 shell 命令来引用 $file。目前我收到此错误:

Press ENTER or type command to continue
/bin/bash: -c: line 0: syntax error near unexpected token (' \ /bin/bash: -c: line 0: file=expand('test')'

我认为这基本上意味着在传递给 shell 之前它不是 escaping/generating 文件名。我该怎么做?

您可以将其包装在 execute 中,例如:

:execute  "!file=" . expand('%:r')

也许我漏掉了什么,但是当你运行:!myvar=42然后:!echo $myvar,你可以看到这个变量没有被保存,肯定是因为它在运行中两个不同的 shell 会话。

要使每个 shell 命令都可以访问您的变量,您可以使用 setenv():call setenv('myvar', '42'),或者在您的情况下:

:call setenv('file', expand('%:r'))
  1. 要将 filename/path 传递给 shell 使用命令行特价

    :!AnyShellCommand %:r
    
  2. 设置环境变量使用:let

     " like this
     :let $AnyEnvVar = expand('%:r')
     " or like this
     let $AnyEnvVar = fnamemodify(@%, ':r')