如何显示Vim中的更改总数’;s差模?
在Vim中区分两个文件时,是否可以显示更改的总数?我想,这相当于计算折叠的数量,但我也不知道怎么做 理想情况下,我希望看到一条消息,上面写着“12个更改中的1个”,当我使用如何显示Vim中的更改总数’;s差模?,vim,diff,Vim,Diff,在Vim中区分两个文件时,是否可以显示更改的总数?我想,这相当于计算折叠的数量,但我也不知道怎么做 理想情况下,我希望看到一条消息,上面写着“12个更改中的1个”,当我使用]c循环更改时,该消息会更新 我在将我办公室的一些成员转化为Vim的奇迹方面取得了巨大成功,但Vimdiff是一个始终如一的问题。好的,下面是我能想到的最好的方法。此功能从当前缓冲区的顶部开始,使用]c运动,它在更改中移动,直到]c不再生效。它返回更改的数量(如果光标不是差异缓冲区,则返回0) 它似乎工作正常,当包含在我的状态
]c
循环更改时,该消息会更新
我在将我办公室的一些成员转化为Vim的奇迹方面取得了巨大成功,但Vimdiff是一个始终如一的问题。好的,下面是我能想到的最好的方法。此功能从当前缓冲区的顶部开始,使用
]c
运动,它在更改中移动,直到]c
不再生效。它返回更改的数量(如果光标不是差异缓冲区,则返回0
)
它似乎工作正常,当包含在我的状态行中时,并没有明显的性能影响
至于查找当前更改的“数字”,这里有一个函数,它使用向后的[c
运动来计算光标位置之前的更改数量。返回的值不太正确…我认为可能它应该只返回一个数字,如果光标在“内”更改的文本,而不是在更改的第一行之后
function! CurrentDiff()
if &diff
let num_diff = 0
let winview = winsaveview()
let pos = getpos(".")
let moved = 1
while moved
let startl = line(".")
keepj sil exe 'normal! [c'
let moved = line(".") - startl
if moved
let num_diff+=1
endif
endwhile
call winrestview(winview)
call setpos(".",pos)
return num_diff
endif
endfunction
同样,它似乎在我的状态行中运行,不会影响光标的移动。当更改也从缓冲区复制时,数字会正确更新
一旦问题被解决,我可以考虑把它作为VIM网站上的一个插件。
这里有一个稍微精炼的解决方案。它使用与我之前的答案相同的技术来计算差异,但是它将每个HOUK的第一行存储在一个全局变量<代码> G:DeffyHunks中。通过在列表中查找行号的位置可以找到光标下方的大块。另外请注意,我设置了
nocursorbind
和noscrollbind
,并在末尾重置它们,以确保不会破坏鼠标在不同窗口中的滚动
function! UpdateDiffHunks()
setlocal nocursorbind
setlocal noscrollbind
let winview = winsaveview()
let pos = getpos(".")
sil exe 'normal! gg'
let moved = 1
let hunks = []
while moved
let startl = line(".")
keepjumps sil exe 'normal! ]c'
let moved = line(".") - startl
if moved
call add(hunks,line("."))
endif
endwhile
call winrestview(winview)
call setpos(".",pos)
setlocal cursorbind
setlocal scrollbind
let g:diff_hunks = hunks
endfunction
无论何时修改差异缓冲区,都应该更新函数UpdateDiffHunks()
,但我发现它足以将其映射到CursorMoved
和BufEnter
function! DiffCount()
if !exists("g:diff_hunks")
call UpdateDiffHunks()
endif
let n_hunks = 0
let curline = line(".")
for hunkline in g:diff_hunks
if curline < hunkline
break
endif
let n_hunks += 1
endfor
return n_hunks . '/' . len(g:diff_hunks)
endfunction
函数!DiffCount()
如果!存在(“g:diff_hunks”)
调用UpdateDiffHunks()
恩迪夫
让n_hunks=0
让曲线=直线(“.”)
对于g中的hunkline:diff_hunks
如果curline
DiffCount()
的输出可以在statusline中使用,也可以绑定到一个命令。你是指大块的数量(或者在vim
调用它们时进行更改)?谢谢,它非常有用,但我只有在手动执行时才成功地使它在vim/nvim中工作,如:echo DiffCount()
要在statusline中显示结果,如1/10
,如何使其自动显示在状态行中,如您所说的CursorMoved
。我使用了autocmd CursorMoved,BufEnter*:echo DiffCount()
,但它始终显示0/0
function! DiffCount()
if !exists("g:diff_hunks")
call UpdateDiffHunks()
endif
let n_hunks = 0
let curline = line(".")
for hunkline in g:diff_hunks
if curline < hunkline
break
endif
let n_hunks += 1
endfor
return n_hunks . '/' . len(g:diff_hunks)
endfunction