¿Cómo se puede eliminar automáticamente el espacio en blanco al final en vim?

Estoy recibiendo errores de "espacio en blanco al final" tratando de enviar algunos files en git.

Quiero eliminar estos caracteres de espacios en blanco finales automáticamente antes de save los files de Python.

¿Puedes configurar vim para hacer esto? ¿Si es así, cómo?

Encontré la respuesta aquí .

Agregando lo siguiente a mi file .vimrc hizo el truco.

autocmd BufWritePre *.py :%s/\s\+$//e 

Comstackción de arriba, más la position del cursor de ahorro:

 fun! <SID>StripTrailingWhitespaces() let l = line(".") let c = col(".") %s/\s\+$//e call cursor(l, c) endfun autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces() 

Si desea aplicar esto al save en cualquier file, autocmd el primer autocmd y use un comodín * :

 autocmd BufWritePre * :call <SID>StripTrailingWhitespaces() 

También usualmente tengo un:

 match Todo /\s\+$/ 

en mi file .vimrc , de modo que los espacios en blanco al final de la línea estén marcados.

Todo es una syntax de hilighting group-name que se utiliza para cifrar palabras key como TODO , FIXME o XXX . Tiene un color de background amarillento molesto y feo, y creo que es lo mejor para save cosas que no quieres en tu código 🙂

Destaco los espacios en blanco finales existentes y también quito el espacio en blanco al final.

Configuro mi editor (vim) para mostrar el espacio en blanco al final, por ej.

enter image description here

con esto en la parte inferior de mi .vimrc:

 highlight ExtraWhitespace ctermbg=networking guibg=networking match ExtraWhitespace /\s\+$/ autocmd BufWinEnter * match ExtraWhitespace /\s\+$/ autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/ autocmd InsertLeave * match ExtraWhitespace /\s\+$/ autocmd BufWinLeave * call clearmatches() 

y yo 'auto-strip' de los files al savelos, en mi caso * .rb para los files de ruby, de nuevo en mi ~ / .vimrc

 function! TrimWhiteSpace() %s/\s\+$//e endfunction autocmd BufWritePre *.rb :call TrimWhiteSpace() 

Aquí hay una forma de filtrar por más de un tipo de file.

 autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e 

Copiado y pegado de http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html (el enlace ya no funciona, pero el bit que necesita está debajo)

"Esto tiene la ventaja de no resaltar cada espacio que escribe al final de la línea, solo cuando abre un file o abandona el modo de inserción. Muy orderado".

 highlight ExtraWhitespace ctermbg=networking guibg=networking au ColorScheme * highlight ExtraWhitespace guibg=networking au BufEnter * match ExtraWhitespace /\s\+$/ au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/ au InsertLeave * match ExtraWhiteSpace /\s\+$/ 

Así es como lo estoy haciendo. No puedo recordar dónde lo robé de tbh.

 autocmd BufWritePre * :call <SID>StripWhite() fun! <SID>StripWhite() %s/[ \t]\+$//ge %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge endfun 

Una solución que simplemente elimina los espacios en blanco finales del file no es aceptable en todas las circunstancias. Funcionará en un proyecto que ha tenido esta política desde el principio, por lo que no hay espacios en blanco que no se haya agregado a sí mismo en su próximo compromiso.

Supongamos que desea simplemente no agregar nuevas instancias de espacio en blanco al final, sin afectar el espacio en blanco existente en líneas que no editó, para mantener su compromiso libre de cambios que son irrelevantes para su trabajo.

En ese caso, con git, puede usar un script como este:

 #!/bin/sh set -e # bail on errors git stash save commit-cleanup git stash show -p | sed '/^\+/s/ *$//' | git apply git stash drop 

Es decir, ocultamos los cambios y luego filtramos todas las líneas + en el diff para eliminar sus espacios en blanco al volver a aplicar el cambio al directory de trabajo. Si este conducto de command es exitoso, dejamos el alijo.

Los otros enfoques aquí de alguna manera no me funcionaron en MacVim cuando se usaban en el file .vimrc . Así que aquí hay uno que hace y resalta los espacios finales:

 set encoding=utf-8 set listchars=trail:· set list 

Vi esta solución en un comentario en VIM Wikia – Eliminar espacios no deseados

Realmente me gustó. Agrega a . en los espacios en blanco no deseados.

enter image description here

Pon esto en tu .vimrc

 " Removes trailing spaces function TrimWhiteSpace() %s/\s*$// '' endfunction set list listchars=trail:.,extends:> autocmd FileWritePre * call TrimWhiteSpace() autocmd FileAppendPre * call TrimWhiteSpace() autocmd FilterWritePre * call TrimWhiteSpace() autocmd BufWritePre * call TrimWhiteSpace() 

autocmd BufWritePre * :%s/\s\+$//<CR>:let @/=''<CR>

Para las personas que desean ejecutarlo para types de files específicos (FileTypes no siempre son confiables):

 autocmd BufWritePre *.c,*.cpp,*.cc,*.h,*.hpp,*.py,*.m,*.mm :%s/\s\+$//e 

O con vim7:

 autocmd BufWritePre *.{c,cpp,cc,h,hpp,py,m,mm} :%s/\s\+$//e 

Si recorta el espacio en blanco, solo debería hacerlo en files que ya están limpios. "Cuando en Roma…". Esta es una buena label cuando se trabaja en bases de código donde los cambios falsos no son bienvenidos.

Esta function detecta los espacios en blanco al final y activa el recorte solo si ya estaba limpio.

El mérito de esta idea recae en una joya de comentario aquí: https://github.com/atom/whitespace/issues/10 (el flujo de comentarios de tickets más largo jamás)

 autocmd BufNewFile,BufRead *.test call KarlDetectWhitespace() fun! KarlDetectWhitespace() python << endpython import vim nr_unclean = 0 for line in vim.current.buffer: if line.rstrip() != line: nr_unclean += 1 print "Unclean Lines: %d" % nr_unclean print "Name: %s" % vim.current.buffer.name cmd = "autocmd BufWritePre <buffer> call KarlStripTrailingWhitespace()" if nr_unclean == 0: print "Enabling Whitespace Trimming on Save" vim.command(cmd) else: print "Whitespace Trimming Disabled" endpython endfun fun! KarlStripTrailingWhitespace() let l = line(".") let c = col(".") %s/\s\+$//e call cursor(l, c) endfun