首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vim DIY statusline + git diff --numstat

vim DIY statusline + git diff --numstat
EN

Stack Overflow用户
提问于 2022-06-08 20:31:04
回答 1查看 40关注 0票数 0

我正在尝试将以下命令的结果添加到diy vim状态行

代码语言:javascript
复制
git diff --numstat <filename>

我尝试过很多方法,但都失败了,几乎是同样的方法。示例:

代码语言:javascript
复制
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

然后试着像这样使用它:

代码语言:javascript
复制
set statusline+=\ \ %{GetGitDiffSummary()}\ \ 

问题1:值本身并没有真正显示出来,我只看到+/-没有任何值。问题2:当我按下移动光标的键(箭头键& hjkl)时,就会打印出相应的字符。他们不会改变文件的内容,但我仍然能看到它们。

退出和重新打开文件不再显示奇怪的字符,但是如果我再次按下并按住/向下/j/k,我会在我的文件中再次看到它们。

EN

回答 1

Stack Overflow用户

发布于 2022-06-09 12:50:24

一个问题是,%字符只会变成Vim命令行中的当前缓冲区,而不是当通过system进行计算时。相反,您应该将expand('%')放在shellescape()中,并在理想情况下将其包装在shellescape()中,以确保对任何特殊字符进行转义以供在shell中使用。

如果您有一个最近的Vim,您还应该使用trim(函数来清除一些空白,因此该函数可能如下所示:

代码语言:javascript
复制
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只在编写缓冲区时才会看到行的更改。所以,也许像这样的事情会更好:

代码语言:javascript
复制
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:addsl:subs是否是空字符串,将它们替换为0。但我认为这应该是个开始。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72551863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档