Vim'de sondaki boşlukları otomatik olarak nasıl kaldırabilirsiniz


197

Git içinde bazı dosyaları işlemeye çalışırken 'boşluk' sondaki hataları alıyorum.

Python dosyalarını kaydetmeden hemen önce bu boşluk karakterlerini otomatik olarak kaldırmak istiyorum.

Vim'i bunu yapacak şekilde yapılandırabilir misiniz? Öyleyse nasıl?


3
bu sadece python ile ilgili değildir

2
DeleteTrailingWhitespace eklentimi kullan .
Ingo Karkat

Yanıtlar:


208

Cevabı burada buldum .

Aşağıdaki .vimrc dosyama eklemek hile yaptı.

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

1
İlginç! Beyaz boşluğu takip etmek işte bir savaştır. Bundan nefret ediyorum, diğerleri nedenini anlamıyor. Vim kadar vi kullanıyoruz (vim kullanıyorum; yüklemeleri gerektiği için kullanmıyorlar). Strip Trailing Blanks stb olarak adlandırdığım bir programım var ve bunu filtre olarak kullanıyorum; vi da çalışıyor. Bu daha iyi.
Jonathan Leffler

16
Bu, her kayıttaki imleç konumunu değiştirir. Bundan kaçınmak mümkün mü?
stepancheg

3
Bu, bu sorunun fiili yanıtı olduğundan, imleç konumunu korumak için belki güncellenmelidir.
Edu Felipe

2
Bu ayrıca, bazı durumlarda istenmeyebilecek çok satırlı dizelerde izleyen boşlukları da silecektir. Ama sanırım bundan kaçınmanın kolay bir yolu yok mu?
luator

3
Belki ede sonunda, kalıbı bulamazsak, vi yerine başka bir komutun başarısız olduğunu
düşünmediğini açıklayabilirsiniz

169

Yukarıdakilerin derlenmesi ve kaydedilen imleç konumu:

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

Bunu herhangi bir dosyaya kaydetme işlemine uygulamak istiyorsanız, ikincisini dışarıda bırakın autocmdve bir joker karakter kullanın *:

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()

9
Son aramayı kaydedip geri yükleyerek işlevinizi daha iyi hale getirebilirsiniz. let _s = @ / let @ / = _ s
xApple

3
autocmd FileType c,cpp,java,php,ruby,python Tüm dosyalara uygulanabilmesi için parçayı kaldırdım .
swt83

8
@xApple: İşlevlerin içinde, son aramayı kaydetmek ve geri yüklemek gerekli değildir - işlev bağlamından ayrılmak bununla ilgilenecektir.
Tobias

3
@ da değiştirmeniz gerekiyor swt83 <buffer>ile *tüm dosyalar üzerinde çalışmaya istiyorum eğer
cadlac

3
Yedek komutu w / ile ön keeppkeepp %s/\s\+$//e
eklerseniz

68

Ayrıca genellikle bir:

match Todo /\s\+$/

benim .vimrcdosyamda, böylece satır sonu boşluk hilighted edilir.

Bir sözdizimi hilighting olmanın Todo grup-adı gibi anahtar kelimeler hilighting kullanılır TODO, FIXMEya da XXX. Bu bir rahatsız edici çirkin sarımsı renkli olan ve bunu sen HiLight şeylerin en iyisi bulmak yok kodunuzda istiyorum :-)


7
Ya da liste ve listchars + = trail: ayarlayabilirsiniz.
Oli

Mükemmel - sondaki boşlukları otomatik olarak kaldırmak (bunun farkında olmasam bile veya aynı dosyada çalıştığım başka birinin kodu olduğu zamanlar) arasında, hiçbir şey yapmamak için mükemmel bir orta yol . Teşekkürler.
Daniel Hershcovich

2
ne yazık ki, benim en sevdiğim renk düzeni zenburn vurgulamak değil
Peter Long

@PeterLong, railscasts temasında da çalışmaz. İle kontrol edin :hi Todo. Bu yüzden inceledim :hi <Tab>ve :help hi. Düşündüm Cursorve Errorsanırım deneyeceğim match VisualNOS /\s\+$/ . Bunu, buradaki autocmddiğer cevaplardan bazılarıyla birleştirebilirim .
Brady Trainor

51

Hem mevcut sondaki boşlukları hem de sondaki boşlukları ayırıyorum.

Editörümü (vim) sonunda beyaz boşluk gösterecek şekilde yapılandırıyorum, örn.

resim açıklamasını buraya girin

bu benim .vimrc altındaki:

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

ve onları kaydederken dosyaları otomatik olarak çıkarıyorum, benim durumumda * .rb ruby ​​dosyaları için, yine ~ / .vimrc içinde

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

13

Birden fazla FileType'a göre filtrelemenin bir yolu.

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

Her Dosya: autocmd FileType * autocmd BufWritePre <tampon>:% s / \ s \ + $ // e
JREAM

7

Http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html adresinden kopyalandı ve yapıştırıldı (bağlantı artık çalışmıyor, ancak ihtiyacınız olan bit aşağıda)

"Bu, satırın sonuna yazdığınız her alanı vurgulamama avantajına sahiptir, yalnızca bir dosyayı açtığınızda veya ekleme modundan çıktığınızda. Çok temiz."

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

1
Blog bağlantısı kesilmiş gibi görünüyor.
Tobias

Aynı çözüm, "Eşleşme komutunu kullanma" altındaki bu bağlantıda bulunur .
ryanjdillon

6

Bu çözümü bir yorumda gördüm VIM Wikia'daki - İstenmeyen alanları kaldırın

Gerçekten beğendim. .İstenmeyen boşluklara a ekler .

resim açıklamasını buraya girin

Bunu içine koy .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()

5

Ben böyle yapıyorum. Onu nereden çaldığımı hatırlayamıyorum.

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

2
Hum, sonunda "*" üzerinde yapmak oldukça tehlikelidir.
mat

Evet muhtemelen en zeki değil, o zaman yine bir hex editörü için vim kullanmıyorum. Siz kaydetmedikçe bu işlem gerçekleşmez.
gregf

Bence bu, üzerinde çalışabileceğiniz her dosya türünü listeleme alternatifini yener, değil mi? Ben rb, php, cs, html, sass, css, js, kahve, xml, xslt, pl, vb, vb üzerinde çalışıyorum ... Mutlu bir ortam var mı?
Derek Prior

4
Vim'de ikili dosyalara yazmadığınız sürece bu muhtemelen bir sorun olmayacaktır.
Haziran'da gregf

İlk %sküresel (g) bayrağı EOL'deki bir boşluk kadar işe yaramaz gibi görünüyor :-)
Jens

3

Sondaki boşlukları dosyadan ayıran bir çözüm her durumda kabul edilemez. Başından beri bu politikayı taşıyan bir projede çalışacak ve böylece yaklaşan taahhüdünüze kendinizi eklemediğiniz bir boşluk yok.

Varlığınızı, çalışmanızla alakasız değişikliklerden uzak tutmak için, düzenlemediğiniz satırlardaki mevcut boşlukları etkilemeden yalnızca sondaki boşluk örneklerini eklemek istemediğinizi varsayalım.

Bu durumda, git ile aşağıdaki gibi bir komut dosyası kullanabilirsiniz:

#!/bin/sh

set -e # bail on errors

git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop

Yani, değişiklikleri saklıyoruz ve sonra +değişikliği çalışma dizinine yeniden uygularken, farktaki boşluklarını kaldırmak için diff'deki tüm satırları filtreliyoruz . Bu komut borusu başarılı olursa, zulayı düşürürüz.


1

Buradaki diğer yaklaşımlar, .vimrcdosyada kullanıldığında MacVim'de bir şekilde işe yaramadı . İşte takip eden alanları vurgulayan ve vurgulayan:

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

Yürütülmesi set listchars=trail:·söyleyerek: E474: Invalid argument: listchars=trail:·. Örneğinizi doğrulayabilir misiniz?
kenorb



0

Belirli dosya türleri için çalıştırmak isteyen kişiler için (FileTypes her zaman güvenilir değildir):

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

Veya vim7 ile:

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

0

Boşluğu keserseniz, bunu yalnızca temiz olan dosyalarda yapmalısınız. "Roma'dayken ...". Sahte değişikliklerin hoş karşılanmadığı kod tabanları üzerinde çalışırken bu iyi bir görgü kurallarıdır.

Bu işlev sondaki boşlukları algılar ve yalnızca temizse kırpmayı açar.

Bu fikrin kredisi, bir yorumun cevabına gider: https://github.com/atom/whitespace/issues/10 (şimdiye kadarki en uzun hata bilet yorum akışı)

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

Ayrıca arama kaydını tutabilir let _s=@/ve `` let @ / = _ s` sonunda geri yükleyebilirsiniz.Bu durumda kara delik kaydı kullanıyoruz
SergioAraujo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.