Pergunta

Estou ficando 'espaços em branco' erros tentando cometer alguns arquivos no git.

Eu quero remover estes espaços em branco caracteres à direita automaticamente logo antes de eu salvar arquivos python.

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

Foi útil?

Solução

Eu encontrei a resposta aqui .

Ao adicionar o seguinte para o meu arquivo .vimrc fez o truque.

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

Outras dicas

Compilação dos itens acima, mais economia de posição do 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()

Se você deseja aplicar isso em salvar para qualquer arquivo, deixar de fora o segundo autocmd e usar um * curinga:

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()

Eu também costumam ter um:

match Todo /\s\+$/

no meu arquivo .vimrc, de modo que o fim da linha de espaço em branco são hilighted.

Todo ser um sintaxe hilighting grupo-nome que é usado para hilighting palavras-chave como TODO, FIXME ou XXX. Tem uma cor de fundo amarelado irritantemente feio, e eu acho que é o melhor para as coisas HiLight você não quer em seu código: -)

I tanto destaque existente espaços em branco e também tira espaços em branco.

Eu configurar meu editor (vim) para mostrar o espaço em branco no final, por exemplo.

enter descrição da imagem aqui

com este 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 eu 'auto-strip' que a partir de 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 filtro por mais de um tipo de arquivo.

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

copiado e colado de http: // blogue .kamil.dworakowski.name / 2009/09 / discreto, destacando-de-trailing.html (o link trabalhos já não, mas o pouco que você precisa é abaixo)

"Isto tem a vantagem de não destacando cada espaço que você digita no final da linha, somente quando você abrir um arquivo ou licença modo de inserção. Muito limpo."

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\+$/

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

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

 enter 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()

Isto é como eu estou fazendo isso. Não me lembro onde eu roubei de tbh.

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

Uma solução que simplesmente tiras de espaços em branco a partir do ficheiro não é aceitável em todas as circunstâncias. Ele vai trabalhar em um projeto que tem tido esta política desde o início, e para que não haja tais espaços em branco que você não apenas adicionar a si mesmo no seu próximo cometeu.

Suponha que você simplesmente não deseja adicionar novas instâncias de espaços em branco, sem afetar os espaços em branco existentes em linhas que você não fez editar, a fim de manter o seu cometer livre de mudanças que são irrelevantes para o seu trabalho.

Nesse caso, com git, você pode 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 esconder as alterações, e depois filtrar todas as linhas + no diff para remover o espaço em branco à direita como nós re-aplicar a alteração para o diretório de trabalho. Se este tubo de comando for bem sucedido, nós deixamos cair o esconderijo.

As outras abordagens aqui de alguma forma não funcionou para mim em MacVim quando usado no arquivo .vimrc. Então aqui está um que faz e destaques espaços à direita:

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

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

Para as pessoas que querem executá-lo por tipos de arquivo específico (FileTypes 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

Se você aparar espaço em branco, você deve única fazê-lo em arquivos que já estão limpos. "Quando em Roma...". Este é boa etiqueta quando se trabalha em bases de código onde as mudanças espúrias são bem-vindos.

Esta função detecta espaços em branco e voltas em aparar somente se ele já estava limpo.

O crédito para esta idéia vai para uma jóia de um comentário aqui: https: // github. com / atom / espaço em branco / questões / 10 (mais longo bug comentário bilhete de fluxo de sempre)

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top