2008-12-10 17 views
173

Estoy recibiendo errores de 'espacio en blanco al final' tratando de confirmar algunos archivos en git.¿Cómo se puede eliminar automáticamente el espacio en blanco al final en vim

Quiero eliminar estos caracteres de espacios en blanco al final justo antes de guardar los archivos de Python.

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

+3

Esto no se refiere solo pitón – hop

+2

Usar mi [DeleteTrailingWhitespace] (http://www.vim.org/scripts/script.php? script_id = 3967) plugin. –

+0

Relacionado: [¿Cuál es la forma más sencilla de quitar el espacio en blanco final de todas las líneas de un archivo?] (Http://vi.stackexchange.com/q/454/467) en Vim SE – kenorb

Respuesta

187

Encontré la respuesta here.

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

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

¡Interesante! El espacio blanco que se arrastra es una batalla en el trabajo. Lo aborrezco, otros no entienden por qué. Usamos tanto vi como vim (utilizo vim; no lo hacen porque tendrían que instalarlo).Tengo un programa que llamo stb para Strip Trailing Blanks y lo uso como filtro; funciona en vi también. Esta es mejor. –

+11

Esto cambia la posición del cursor en cada guardado. ¿Es posible evitarlo? – stepancheg

+0

OK, he encontrado, la respuesta está debajo. – stepancheg

61

También suele haber un número:

match Todo /\s\+$/ 

en mi archivo .vimrc, por lo que al final de la línea de espacio en blanco se hilighted.

Todo ser un resaltado de sintaxis group-name que se utiliza para palabras clave hilighting como TODO, FIXME o XXX. Tiene un color de fondo amarillento molesto feo, y me parece que es el mejor para ocultar cosas que no quiere en su código :-)

+0

¡Muy útil! Me gusta. :) – Jonathan

+5

O puede establecer la lista y establecer listchars + = trail :. – Oli

+0

Al igual que mi tocayo, me gusta esto. Gracias. –

5

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 
+1

Hum, eso es bastante peligroso hacerlo en "*" si eventualmente abre archivos binarios, pueden terminar en una forma bastante mala. – mat

+0

Sí, probablemente no sea el más inteligente, entonces tampoco uso vim para un editor hexadecimal. Eso no se ejecutará a menos que guardes. – gregf

+0

Creo que esto supera la alternativa de listar cada tipo de archivo en el que pueda trabajar, ¿no? Trabajo en rb, php, cs, html, sass, css, js, café, xml, xslt, pl, etc., etc., etc ... ¿Hay un medio feliz? –

155

Compilación de lo anterior más el ahorro de posición del cursor:

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 esta en guardar a cualquier archivo, omiten el primer autocmd y utilizar un comodín *:

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces() 
+7

Puede mejorar su función guardando también la última búsqueda y restaurándola. dejar _s = @/ dejar @/= _ s – xApple

+0

ver también la opción de guardar los saltos – SergioAraujo

+0

Gracias ... esto es increíble. – bejonbee

7

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á abajo)

"Esto tiene la ventaja de no resaltar cada espacio que escriba al final de la línea, solo cuando abra un archivo o salga del modo de inserción. Es 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\+$/ 
+0

Parece que el enlace del blog ha muerto. – Tobias

13

Aquí está una manera de filtrar por más de un tipo de archivo.

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

Cada archivo: autocmd Tipo de archivo * autocmd BufWritePre :% s/\ s \ + $ // e – JREAM

49

yo resalte existente espacios en blanco, y también tira espacios en blanco finales.

puedo configurar mi editor (vim) para mostrar espacios en blanco al final, p. ej.

enter image description here

con esta 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-tira' que a partir de archivos al guardar ellos, en mi caso * .rb para los archivos de rubí, de nuevo en mi ~ /.vimrc

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

Gracias, esta es una gran solución – daniel

+1

Agregar la función va un paso más allá para hacer que esta sea una respuesta increíble. –

3

Una solución que simplemente elimina los espacios en blanco 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.

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

En ese caso, con git, se puede se puede utilizar un script como el siguiente:

#!/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, que STASH los cambios, y luego filtrar todos los + líneas en el diff para eliminar su trazando un espacio en blanco a medida que volvemos a aplicar el cambio al directorio de trabajo. Si este conducto de comando es exitoso, dejamos el alijo.

1

Los otros enfoques aquí de alguna manera no funcionaron para mí en MacVim cuando se usan en el archivo .vimrc. Así que aquí hay uno que hace y destaca los espacios finales:

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

Ejecutando 'set listchars = trail: ·' diciendo: 'E474: argumento inválido: listchars = trail: ·'. ¿Puedes validar tu ejemplo? – kenorb

+1

@kenorb ver http://stackoverflow.com/questions/18321538/vim-error-e474-invalid-argument-listchars-tab-trail – mb21

0

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

0

Para las personas que quieren ejecutarlo para tipos de archivo específicos (FileTypes no siempre son fiables):

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 
0

Si recorta los espacios en blanco, usted debe solo hágalo 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 va a una joya de un comentario aquí: https://github.com/atom/whitespace/issues/10 (bug comentario billete de flujo más larga)

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 
+0

También puede mantener el registro de búsqueda 'let _s = @ /' y restaurarlo en el end 'let @/= _ s'. En este caso estamos usando el registro de agujero negro – SergioAraujo

2

vi esta solución en un comentario en VIM Wikia - Remove unwanted spaces

Realmente le gustó. Agrega un . en los espacios en blanco no deseados.

enter image description here

poner esto en su .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() 
+1

Esta es una respuesta correcta, verificada – ospider

Cuestiones relacionadas