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

Eu estou recebendo erros ‘trailing whitespace‘ tentando cometer alguns arquivos no git.

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

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

Eu encontrei a resposta aqui .

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

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

Compilação acima e mais a posição do cursor de salvamento:

 fun! 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  :call StripTrailingWhitespaces() 

Se você quiser aplicar isso ao salvar em qualquer arquivo, deixe de fora o primeiro autocmd e use um curinga * :

 autocmd BufWritePre * :call StripTrailingWhitespaces() 

Eu também geralmente tenho:

 match Todo /\s\+$/ 

no meu arquivo .vimrc , para que os espaços em branco no final da linha fiquem em alta.

Todo é um nome de grupo de hilighting de syntax que é usado para hilighting palavras-chave como TODO , FIXME ou XXX . Tem uma cor de fundo amarelada irritantemente feia, e eu acho que é o melhor para coisas que você não quer no seu código 🙂

Eu realce o espaço em branco existente e também retiro o espaço em branco.

Eu configuro meu editor (vim) para mostrar o espaço 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\+\%#\@ 

e eu removo automaticamente dos 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() 

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

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

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

“Isso tem a vantagem de não destacar cada espaço que você digita no final da linha, apenas quando você abre um arquivo ou deixa o modo de inserção. Muito legal.”

 highlight ExtraWhitespace ctermbg=red guibg=red au ColorScheme * highlight ExtraWhitespace guibg=red au BufEnter * match ExtraWhitespace /\s\+$/ au InsertEnter * match ExtraWhitespace /\s\+\%#\@ 

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

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

Uma solução que simplesmente remove o espaço em branco 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 há tal espaço em branco que você não apenas se incluiu no seu próximo commit.

Suponha que você deseje simplesmente não adicionar novas ocorrências de espaços em branco à direita, sem afetar o espaço em branco existente em linhas que você não editou, para 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, nós ocultamos as alterações e, em seguida, filtramos todas as linhas + no diff para remover o espaço em branco à medida que reaplicamos a alteração ao diretório de trabalho. Se este pipe de comando for bem sucedido, descartamos o stash.

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

Eu realmente gostei. Adiciona um . nos espaços brancos 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() 

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

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

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

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

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

Ou com o vim7:

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

Se você cortar os espaços em branco, deverá fazê-lo apenas em arquivos que já estejam limpos. “Quando em Roma…”. Esta é uma boa etiqueta quando se trabalha em bases de código onde alterações espúrias não são bem-vindas.

Essa function detecta espaços em branco à direita e ativa o aparo apenas se já estava limpo.

O crédito para esta ideia vai para uma jóia de um comentário aqui: https://github.com/atom/whitespace/issues/10 (o maior stream de comentários de bilhetes de bug 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  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 
    Intereting Posts