Vim自定义状态栏集成git diff --numstat结果显示异常求助
Vim状态栏Git Diff统计功能故障修复
问题根因
两个问题都是实现逻辑有问题导致的:
- 统计数值不显示:Vim调用
system()执行Shell命令时,不会自动把命令里的%展开成当前缓冲区的文件路径,Shell拿不到有效文件参数,自然返回空的统计结果;另外system()返回的内容自带尾部换行符,不做处理也会打乱状态栏渲染。 - 长按移动键出现乱码:现有实现每次刷新状态栏都要同步跑两次Shell命令,长按按键会触发状态栏高频刷新,同步执行的Shell命令会卡住Vim主进程,导致按键输入序列解析出错,就会出现按键字符被打印到编辑区的现象。
修复后代码
先优化统计函数:提前展开文件路径,把两次Shell调用合并成一次减少性能损耗,同时清理返回结果里的多余字符,还加了Git仓库判断避免非Git目录报错:
function! GetGitDiffSummary() " 不在Git仓库内直接返回空 let l:git_root = system('git rev-parse --show-toplevel 2>/dev/null') if v:shell_error != 0 return '' endif " 展开当前文件绝对路径,转义Shell特殊字符避免空格等场景报错 let l:filepath = fnameescape(expand('%:p')) " 一次调用同时获取新增、删除行数,减少Shell调用开销 let l:diff_stat = system('git diff --numstat -- ' . l:filepath . ' | awk "{print \$1,\$2}"') if empty(l:diff_stat) return '+0/-0' endif let [l:adds, l:subs] = split(l:diff_stat, '\s\+') " 清除换行等多余空白字符 return '+'.trim(l:adds).'/-'.trim(l:subs) endfunction
原有状态栏调用配置不需要修改,直接用就行:
set statusline+=\ \ %{GetGitDiffSummary()}\ \
可选优化
如果文件比较大、仓库比较深,还是觉得刷新有卡顿,可以加一层缓存逻辑,只在切换缓冲区、写入文件的时候才重新统计Git diff结果,进一步降低性能消耗,彻底避免输入阻塞的问题。
内容的提问来源于stack exchange,提问作者DanTheMan
相关产品推荐
相关产品推荐

