¿Cómo puedo quitar el espacio en blanco solo desde líneas cambiadas?

Me gustaría configurar Vim para que solo elimine los espacios en blanco finales de las líneas que he cambiado. Mi caso de uso es que muchos de los files en nuestro repository tienen espacios en blanco en algunas de sus líneas y si indiscriminadamente quito todos los espacios en blanco, entonces la culpa del git me muestra como la persona que cambió esas líneas. Me gustaría hacer esto en Vim, en lugar de a través de un enlace precompromiso, porque no deseo tener que volver a cargar el file en Vim, ya que eso confunde mi historial de deshacer.

No estoy seguro de si esto es lo que quieres (quizás quieras usar la git blame etc.), pero si usas el complemento vim-gitgutter , puedes confiar en la function GitGutterGetHunks() para implementar algo como esto ( solo una idea):

 function! s:removeTrailingSpacesFromHunks() let hunks = GitGutterGetHunks() for hunk in hunks let cmd = ':' . hunk[2] . ',' . (hunk[2] + hunk[3] - 1) . 's/\s\+$//e' "debug: display command echo cmd "run command execute cmd endfor endfunction command! FixMySpaces call <SID>removeTrailingSpacesFromHunks() 

Por supuesto, usando ese complemento, incluso puede saltear esto y simplemente mirar los signos que se muestran a la izquierda para seleccionar visualmente las líneas modificadas / agregadas y llamar a un command sustituto, o un envoltorio de command personalizado simple que elimina los espacios finales para el (los) range (s) seleccionado (s) manualmente.

El command se puede invocar antes de la puesta en escena, cualquier cantidad de veces (idealmente, después de save, en cualquier caso, cuando los signos / tetones están sincronizados).

 function! s:linesNotComitted(filename) let l:blameResult = system('git blame -sn ' . shellescape(a:filename)) let l:blameResultLines = split(l:blameResult, "[\n\r]") let l:result = [] for l:line in l:blameResultLines let l:match = matchlist(l:line, '\v^0+\s(\d+)') if !empty(l:match) call add(l:result, str2nr(l:match[1])) endif endfor return l:result endfunction function! s:stripTrailingWhitespaceFromLines(lineNumbers) for l:lineNumber in a:lineNumbers let l:line = getline(l:lineNumber) let l:modifiedLine = substitute(l:line, '\v\s+$', '', '') if l:line != l:modifiedLine call setline(l:lineNumber, l:modifiedLine) endif endfor endfunction command! StripTrailingWhitespaceFromNotComittedLines call s:stripTrailingWhitespaceFromLines(s:linesNotComitted(expand('%')))