Podczas próby zatwierdzenia niektórych plików w git dostaję błędy „końcowe białe znaki”.
Chcę automatycznie usunąć końcowe znaki białych znaków przed zapisaniem plików Pythona.
Czy możesz skonfigurować vima, aby to robił? Jeśli tak to jak?
Podczas próby zatwierdzenia niektórych plików w git dostaję błędy „końcowe białe znaki”.
Chcę automatycznie usunąć końcowe znaki białych znaków przed zapisaniem plików Pythona.
Czy możesz skonfigurować vima, aby to robił? Jeśli tak to jak?
Odpowiedzi:
Tutaj znalazłem odpowiedź .
Dodanie następującego do mojego pliku .vimrc załatwiło sprawę.
autocmd BufWritePre *.py :%s/\s\+$//e
e
na końcu oznacza, że jeśli nie znaleźliśmy wzorca, vi nie uważa polecenia zastępczego za nieudane
Kompilacja powyższego plus zapisywanie pozycji kursora:
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()
Jeśli chcesz zastosować to do zapisu do dowolnego pliku, pomiń drugi autocmd
i użyj symbolu wieloznacznego *
:
autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()
autocmd FileType c,cpp,java,php,ruby,python
część, aby dotyczyła wszystkich plików.
<buffer>
ze *
jeśli chcesz go do pracy na wszystkich plików
keepp
, nie zmieni on historii wyszukiwania, tj.keepp %s/\s\+$//e
Zwykle mam również:
match Todo /\s\+$/
w moim .vimrc
pliku, aby białe znaki końca linii były podświetlone.
Todo bycia składnia hilighting nazwa-grupy , która jest używana do hilighting słowa kluczowe jak TODO
, FIXME
lub XXX
. Ma denerwująco brzydki żółtawy kolor tła i uważam, że najlepiej jest ukryć w kodzie to, czego nie chcesz :-)
:hi Todo
. Więc przestudiowałem :hi <Tab>
i :help hi
. Zastanawiałem się Cursor
i Error
, ale myślę, że spróbuję match VisualNOS /\s\+$/
. Mógłbym połączyć to z niektórymi autocmd
z innych odpowiedzi tutaj.
Zarówno podkreślam istniejące końcowe białe znaki, jak i usuwam końcowe białe znaki.
Konfiguruję mój edytor (vim), aby wyświetlać białe znaki na końcu, np
z tym na dole mojego .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()
i „automatycznie usuwam” je z plików podczas ich zapisywania, w moim przypadku * .rb dla plików ruby, ponownie w moim ~ / .vimrc
function! TrimWhiteSpace()
%s/\s\+$//e
endfunction
autocmd BufWritePre *.rb :call TrimWhiteSpace()
Skopiowano i wklejono z http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html (link już nie działa, ale potrzebna część jest poniżej)
„Ma to tę zaletę, że nie wyróżnia każdego wpisanego miejsca na końcu wiersza, tylko po otwarciu pliku lub wyjściu z trybu wstawiania. Bardzo porządnie”.
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\+$/
Widziałem to rozwiązanie w komentarzu na VIM Wikia - Usuń niechciane spacje
Naprawdę mi się podobało. Dodaje .
niechciane białe spacje.
.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()
Tak to robię. Nie pamiętam, skąd go ukradłem.
autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
%s/[ \t]\+$//ge
%s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
%s
flaga globalna (g) jest tak bezużyteczna jak spacja na EOL :-)
Rozwiązanie, które po prostu usuwa końcowe spacje z pliku, nie jest akceptowane we wszystkich okolicznościach. Będzie działał w projekcie, który od początku obowiązywał tę zasadę, więc nie ma takich białych znaków, że nie dodałeś się tylko do nadchodzącego zatwierdzenia.
Załóżmy, że nie chcesz dodawać nowych instancji końcowych białych znaków bez wpływu na istniejące białe znaki w liniach, których nie edytowałeś, aby zachować zatwierdzenie bez zmian, które nie mają znaczenia dla twojej pracy.
W takim przypadku za pomocą git możesz użyć takiego skryptu:
#!/bin/sh
set -e # bail on errors
git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop
Innymi słowy, przechowujemy zmiany, a następnie filtrujemy wszystkie +
linie w diff, aby usunąć końcowe białe znaki, gdy ponownie zastosujemy zmianę do katalogu roboczego. Jeśli ta komenda zakończy się powodzeniem, upuszczamy skrytkę.
Inne podejścia tutaj jakoś nie działały dla mnie w MacVimie, gdy zostały użyte w .vimrc
pliku. Oto jeden, który robi i wyróżnia końcowe spacje:
set encoding=utf-8
set listchars=trail:·
set list
set listchars=trail:·
mówiąc: E474: Invalid argument: listchars=trail:·
. Czy możesz potwierdzić swój przykład?
Jeśli przycinasz białe znaki, powinieneś to robić tylko dla plików, które są już czyste. "Kiedy w Rzymie...". Jest to dobra etykieta podczas pracy z bazami kodowymi, w których niepożądane zmiany są niepożądane.
Ta funkcja wykrywa końcowe białe znaki i włącza przycinanie tylko wtedy, gdy było już czyste.
Zaletą tego pomysłu jest klejnot komentarza tutaj: https://github.com/atom/whitespace/issues/10 (najdłuższy strumień komentarzy do zgłoszeń błędów)
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
let _s=@/
i przywrócić go na końcu `let @ / = _ s`. W tym przypadku korzystamy z rejestru czarnej dziury