Como você pode remover automaticamente os espaços em branco no vim

197

Estou recebendo erros de 'espaço em branco à direita' tentando confirmar alguns arquivos no git.

Quero remover esses caracteres de espaço em branco à direita automaticamente antes de salvar os arquivos python.

Você pode configurar o vim para fazer isso? Se sim, como?

Paul D. Eden
fonte
3
esta não diz respeito python sozinho
2
Use meu plug- in DeleteTrailingWhitespace .
Ingo Karkat

Respostas:

208

Eu encontrei a resposta aqui .

Adicionar o seguinte ao meu arquivo .vimrc fez o truque.

autocmd BufWritePre *.py :%s/\s\+$//e
Paul D. Eden
fonte
1
Interessante! Trailing espaço em branco é uma batalha no trabalho. Eu detesto isso, outros não entendem o porquê. Usamos tanto o vi quanto o vim (eu uso o vim; eles não usam porque precisariam instalá-lo). Eu tenho um programa que chamo de stb para Strip Trailing Blanks e o uso como filtro; funciona no vi também. Isto é melhor.
11136 Jonathan Leffler
16
Isso muda a posição do cursor em cada salvamento. É possível evitá-lo?
31420 stepancheg
3
Como essa é a resposta de fato para essa pergunta, talvez ela deva ser atualizada para manter a posição do cursor.
Edu Felipe
2
Isso também excluirá espaços à direita em cadeias de linhas múltiplas, o que pode não ser desejado em alguns casos. Mas acho que não há maneira fácil de evitar isso?
luator 11/08/2015
3
Talvez você poderia explícita que a edos meios finais, se não encontrar o padrão, vi não considera o comando de substituição como falha
LLenain
169

Compilação acima, além de salvar a posição do cursor:

fun! <SID>StripTrailingWhitespaces()
    let l = line(".")
    let c = col(".")
    keepp %s/\s\+$//e
    call cursor(l, c)
endfun

autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()

Se você deseja aplicar isso ao salvar em qualquer arquivo, deixe de fora o segundo autocmde use um curinga *:

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()
stepancheg
fonte
9
Você pode melhorar sua função também salvando a última pesquisa e restaurando-a. deixe _s = @ / deixe @ / = _ s
xApple
3
Eu removi a autocmd FileType c,cpp,java,php,ruby,python peça para aplicá-la a todos os arquivos.
swt83
8
@xApple: Dentro das funções, não é necessário salvar e restaurar a última pesquisa - sair do contexto da função cuidará disso.
Tobias
3
@ swt83 você também precisa substituir <buffer>com *se você quer que ele funcione em todos os arquivos
cadlac
3
Se você prefixar o comando de substituição w / keepp, não irá alterar seu histórico de pesquisa, ou sejakeepp %s/\s\+$//e
jeberle
68

Eu também normalmente tenho um:

match Todo /\s\+$/

no meu .vimrc arquivo, para que o espaço em branco do final da linha fique oculto.

Todo sendo um nome de grupo de hilighting de sintaxe usado para palavras-chave de hilighting como TODO, FIXMEou XXX. Ele tem uma cor de fundo amarelamente irritante e feia, e eu acho que é o melhor para esconder coisas que você não quer no seu código :-)

esteira
fonte
7
Ou você pode definir list e definir listchars + = trail :.
Oli
Excelente - é o meio termo perfeito entre remover automaticamente o espaço em branco à direita (mesmo quando eu não estou ciente disso ou quando é o código de outra pessoa com quem estou trabalhando no mesmo arquivo), e não fazer nada a respeito . Obrigado.
Daniel Hershcovich
2
infelizmente, meu esquema de cores favorito zenburn não destaca
Peter Long
@ PeterLong, também não funciona no tema Railscasts. Verifique com :hi Todo. Então eu examinei :hi <Tab>e :help hi. Eu considerei Cursore Error, mas acho que vou tentar match VisualNOS /\s\+$/ . Eu posso combinar isso com alguns dos autocmds de outras respostas aqui.
Brady Trainor
51

Destaco o espaço em branco à direita existente e também removo o espaço em branco à direita.

Eu configurei meu editor (vim) para mostrar espaços em branco no final, por exemplo

insira a descrição da imagem aqui

com isso na parte inferior do meu .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()

e removo automaticamente os arquivos ao salvá-los, no meu caso * .rb para arquivos ruby, novamente no meu ~ / .vimrc

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

Aqui está uma maneira de filtrar por mais de um FileType.

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
syvex
fonte
Todo arquivo: autocmd FileType * autocmd BufWritePre <buffer>:% s / \ s \ + $ // e
JREAM
7

Copiado e colado de http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html (o link não funciona mais, mas o que você precisa está abaixo)

"Isso tem a vantagem de não destacar cada espaço digitado no final da linha, apenas quando você abre um arquivo ou sai do modo de inserção. Muito elegante."

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\+$/
lazysoundsystem
fonte
1
O link do blog parece ter morrido.
Tobias
A mesma solução é encontrada neste link em "Usando o comando match".
Ryanjdillon
6

Eu vi essa solução em um comentário no VIM Wikia - Remova espaços indesejados

Eu realmente gostei. Adiciona um .a espaços em branco indesejados.

insira a descrição da imagem aqui

Coloque isso no seu .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()
Diego Juliao
fonte
5

É assim que estou fazendo. Não me lembro de onde o roubei.

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
gregf
fonte
2
Hum, é muito perigoso fazer isso em "*" se você finalmente abrir arquivos binários, eles podem acabar em uma forma muito ruim.
mat
Sim, provavelmente não é o mais inteligente, mas também não uso o vim para um editor hexadecimal. Isso não será executado a menos que você salve.
gregf
Eu acho que isso supera a alternativa de listar todos os tipos de arquivos nos quais você pode trabalhar, não? Eu trabalho em rb, php, cs, html, sass, css, js, café, xml, xslt, pl, etc, etc, etc ... Existe um meio feliz?
Derek Antes
4
A menos que você esteja gravando em arquivos binários no vim, isso provavelmente nunca será um problema.
gregf
Afigura-se no primeiro %sa global (g) bandeira é inútil como um espaço no fim de linha :-)
Jens
3

Uma solução que simplesmente retira o espaço em branco à direita do arquivo não é aceitável em todas as circunstâncias. Ele funcionará em um projeto que teve essa política desde o início e, portanto, não existe espaço em branco que você não tenha apenas se adicionado ao seu próximo commit.

Suponha que você deseje apenas não adicionar novas instâncias do espaço em branco à direita, sem afetar o espaço em branco existente nas linhas que você não editou, a fim de manter seu commit livre de alterações irrelevantes para o seu trabalho.

Nesse caso, com o git, você pode usar um 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

Ou seja, escondemos as alterações e filtramos todas as +linhas no diff para remover seus espaços em branco à medida que reaplicamos a alteração no diretório de trabalho. Se este canal de comando for bem-sucedido, descartamos o esconderijo.

Kaz
fonte
1

As outras abordagens aqui de alguma forma não funcionaram para mim no MacVim quando usadas no .vimrcarquivo. Então, aqui está um que destaca e destaca os espaços finais:

set encoding=utf-8
set listchars=trail:·
set list
mb21
fonte
Executando set listchars=trail:·dizendo: E474: Invalid argument: listchars=trail:·. Você pode validar seu exemplo?
Kenorb
0

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

aemonge
fonte
0

Para pessoas que desejam executá-lo para tipos de arquivos específicos (os tipos de arquivo nem sempre são confiáveis):

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

Ou com vim7:

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

Se você aparar espaços em branco, deverá fazê-lo apenas em arquivos que já estejam limpos. "Quando em Roma...". Essa é uma boa etiqueta ao trabalhar em bases de código onde mudanças espúrias não são bem-vindas.

Essa função detecta o espaço em branco à direita e ativa o corte apenas se já estiver limpo.

O crédito para essa ideia vai para uma jóia de um comentário aqui: https://github.com/atom/whitespace/issues/10 (o maior fluxo de comentários de tíquetes de bugs de todos os tempos)

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
Karl Pickett
fonte
Você também pode manter o registo pesquisar let _s=@/e restaurá-lo no final `deixe @ / = _ s` .Neste caso, estamos usando registo buraco negro
SergioAraujo