git - linea - vim inicio
¿Cómo se puede eliminar automáticamente el espacio en blanco al final en vim? (13)
Aquí hay una forma de filtrar por más de un tipo de archivo.
autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s//s/+$//e
Estoy recibiendo errores de "espacio en blanco al final" tratando de enviar algunos archivos en git.
Quiero eliminar estos caracteres de espacios en blanco finales automáticamente antes de guardar los archivos de Python.
¿Puedes configurar vim para hacer esto? ¿Si es así, cómo?
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
Compilación de arriba, más la posición 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 guardar en cualquier archivo, autocmd
el primer autocmd
y use un comodín *
:
autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()
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 archivo o abandona el modo de inserción. Muy ordenado".
highlight ExtraWhitespace ctermbg=red guibg=red
au ColorScheme * highlight ExtraWhitespace guibg=red
au BufEnter * match ExtraWhitespace //s/+$/
au InsertEnter * match ExtraWhitespace //s/+/%#/@<!$/
au InsertLeave * match ExtraWhiteSpace //s/+$/
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.
con esto en la parte inferior de mi .vimrc:
highlight ExtraWhitespace ctermbg=red guibg=red
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 archivos al guardarlos, en mi caso * .rb para los archivos de ruby, de nuevo en mi ~ / .vimrc
function! TrimWhiteSpace()
%s//s/+$//e
endfunction
autocmd BufWritePre *.rb :call TrimWhiteSpace()
Encontré la respuesta here .
Agregando lo siguiente a mi archivo .vimrc hizo el truco.
autocmd BufWritePre *.py :%s//s/+$//e
Los otros enfoques aquí de alguna manera no me funcionaron en MacVim cuando se usaban en el archivo .vimrc
. Así que aquí hay uno que hace y resalta los espacios finales:
set encoding=utf-8
set listchars=trail:·
set list
Para las personas que desean ejecutarlo para tipos de archivos 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 debe hacerlo en archivos que ya están limpios. "Cuando en Roma...". Esta es una buena etiqueta cuando se trabaja en bases de código donde los cambios falsos no son bienvenidos.
Esta función 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 (la secuencia más larga de comentarios de errores)
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
También usualmente tengo un:
match Todo //s/+$/
en mi archivo .vimrc
, de modo que los espacios en blanco al final de la línea estén marcados.
Todo es una sintaxis de hilighting group-name que se utiliza para cifrar palabras clave como TODO
, FIXME
o XXX
. Tiene un color de fondo amarillento molesto y feo, y creo que es lo mejor para guardar cosas que no quieres en tu código :-)
Una solución que simplemente elimina los espacios en blanco finales del archivo 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 directorio de trabajo. Si este conducto de comando es exitoso, dejamos el alijo.
Vi esta solución en un comentario en here
Realmente me gustó. Agrega a .
en los espacios en blanco no deseados.
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>