我正在尝试将以下命令的结果添加到diy vim状态行中
git diff --numstat <filename>我尝试过很多方法,但都失败了,几乎是同样的方法。示例:
function! GetGitDiffSummary()
let l:adds = "+".system("git diff --numstat -- % | awk '{print($1)}'")
let l:subs = "-".system("git diff --numstat -- % | awk '{print($2)}'")
return l:adds."/".l:subs
endfunction然后试着像这样使用它:
set statusline+=\ \ %{GetGitDiffSummary()}\ \ 问题1:值本身并没有真正显示出来,我只看到+/-没有任何值。问题2:当我按下移动光标的键(箭头键& hjkl)时,就会打印出相应的字符。他们不会改变文件的内容,但我仍然能看到它们。
退出和重新打开文件不再显示奇怪的字符,但是如果我再次按下并按住/向下/j/k,我会在我的文件中再次看到它们。
发布于 2022-06-09 12:50:24
一个问题是,%字符只会变成Vim命令行中的当前缓冲区,而不是当通过system进行计算时。相反,您应该将expand('%')放在shellescape()中,并在理想情况下将其包装在shellescape()中,以确保对任何特殊字符进行转义以供在shell中使用。
如果您有一个最近的Vim,您还应该使用trim(函数来清除一些空白,因此该函数可能如下所示:
function! GetGitDiffSummary()
let l:git_command = "git diff --numstat -- " . shellescape(expand('%'))
let l:adds = "+".trim(system(l:git_command . " | awk '{print($1)}'"))
let l:subs = "-".trim(system(l:git_command . " | awk '{print($2)}'"))
return l:adds."/".l:subs
endfunction问题2:当我按下并按住移动光标的键(箭头键& hjkl)时,会打印出相应的字符。他们不会改变文件的内容,但我仍然能看到它们。
这是性能方面的问题。system调用可能需要一段时间,并且会阻塞Vim。每次移动游标时都会调用它,这对于这个特定的检查来说是不必要的-- git只在编写缓冲区时才会看到行的更改。所以,也许像这样的事情会更好:
augroup UpdateDiffSummary
autocmd!
autocmd BufReadPost * let b:git_diff_summary = GetGitDiffSummary()
autocmd BufWritePost * let b:git_diff_summary = GetGitDiffSummary()
augroup END
set statusline+=%{get(b:,'git_diff_summary')}这些自动命令应该在打开文件和写入缓冲区时触发,这是数据更改的两个时刻。使用get(b:, 'git_diff_summary')而不是b:git_diff_summary的原因是,如果没有设置该变量,则可以避免错误。
还有其他的优化可以完成--您可以进行一个系统调用,而不是两个,检查l:adds和l:subs是否是空字符串,将它们替换为0。但我认为这应该是个开始。
https://stackoverflow.com/questions/72551863
复制相似问题