让vimscript感叹号命令解释vim变量

4

我正在编写一个 vimscript 工具,通过调用 git difftool 命令,让我可以在当前的 vim 会话中查看 git diffs。当我硬编码两个 SHA 值时,这个工具可以正常工作,但是当我尝试将它们指定为变量时,就会失败。我编写了一个两行的 shell 脚本 do_git_difftool 来探究问题所在,它显示传递的是文字字符串 "l:left_sha" 和 "l:right_sha",而不是它们代表的变量值,尽管在前一行的 echom 命令中它们已经被正确解释了。这是怎么回事?

function! s:GitDiff (...)

     let l:the_count = 1
     :let l:syscommand = "get_sha back " . l:the_count
     :let l:left_sha = system(l:syscommand)
     :let l:syscommand = "get_sha top"
     :let l:right_sha = system(l:syscommand)
     echom "sha values"  l:left_sha l:right_sha

     :silent !git difftool l:left_sha l:right_sha
     :silent !do_git_difftool l:left_sha l:right_sha

endfunction

# in a bash script named do_git_difftool 
echo args are $1 and $2 > thelog
git difftool $1 $2

  in the log file I see: 

args are l:left_sha and l:right_sha
1个回答

8
TL;DR: 是的。你应该使用。
exec "!git_difftool " . l:left_sha . " " . l:right_sha

Bang命令会将其后的所有内容传递给终端,而不受Vim影响(因为shell命令不使用Vim语法)。要进行变量解释,请将其作为exec命令创建bang命令。

编辑:

如果需要保持安静,请在行前加上silent


这个有效,谢谢。正如我所预料的那样,在退出diffs后,我会收到“按Enter键或输入命令以继续”的提示,而在我的原始尝试中使用:silent时会将其删除。有没有办法在“执行”上下文中做到同样的事情? - Leonard
在编程中,添加“silent”可以实现这个功能。 - jeremysprofile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接