Chciałbym mieć ładny i słodki pokaz końcowych białych znaków w moim terminalowym vimie. Pozwoliłoby mi to je usunąć przed zamknięciem pliku.
Wiem, że to pytanie jest dość popularne i już znalazłem dziesiątki odpowiedzi na SO. Niestety nie znalazłem jeszcze satysfakcjonującego ...
Spróbuję więc podsumować zebrane informacje i znalezione rozwiązania.
Rozwiązanie 1: Ręcznie zaznacz końcowe spacje
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()
Plusy:
- Łatwy w użyciu
- Szybki
- Kompatybilny z
cursorline
Cons:
- Wybrany kolor nie jest zgodny z innymi schematami kolorów, ponieważ kolor jest ustawiany ręcznie na
red
- Duże czerwone bloki tła nie są zbyt estetyczne
Rozwiązanie 2: Korzystanie z funkcji listy
set list
set listchars+=trail:◦
Plusy:
- Łatwy w użyciu
- Szybki
Cons:
- Problem, jeśli
:set cursorline
włączony - Koloru dedykowanego dla
list/trail
nie można konfigurować. Musi być taki sam jak inne listy
Rozwiązanie 3: Korzystanie z funkcji ukrywania
syn match WhiteSpace "\s\+$" containedin=ALL conceal cchar=◦
set conceallevel=2
set concealcursor=nv
highlight Conceal ctermfg=red
Plusy:
- Ładniejsze niż pierwsze rozwiązanie
Cons:
- Tło nie jest takie samo jak tło kursora
- Może kolidować z innymi zasadami ukrywania
- Wybrany kolor nie zawsze jest zgodny ze schematem kolorów
- Nie jest kompatybilny ze starszą wersją Vima
Moje pytanie
Które z wymienionych rozwiązań jest najbardziej odpowiednie pod względem wydajności i kompatybilności oraz w jaki sposób mogę uzyskać wszystkie zalety i wady?
Innymi słowy, chciałbym znaleźć rozwiązanie, w którym:
- Końcowy kolor podświetlenia jest zgodny z wybranym schematem kolorów
- Ten kolor jest wyraźnie widoczny, ale nie jest zbyt agresywny dla oczu
- Kompatybilny z
cursorline
(tło i pierwszy plan) `- Kompatybilny z innymi wtyczkami, które mogą używać funkcji ukrywania
- Znak końcowy można ustawić na dowolny znak Unicode
:hi link ExtraWhitespace CursorLine
. Zobaczyć:help hi-link
.Odpowiedzi:
Pod względem wydajności żaden z nich nie powinien mieć znaczenia. Vim najczęściej grzęźnie w skomplikowanych wzorcach składniowych; wzór tutaj jest dość prosty.
Aby kolor podświetlenia był zgodny z wybranym schematem kolorów, użyj
:hi link
do istniejącej grupy; zwykle tak by byłoError
. Oczywiście, wszystko to ma znaczenie tylko wtedy, gdy często zmieniasz (całkiem różne) kolory; w przeciwnym razie użycie odpowiednich kolorów bezpośrednio (jak w rozwiązaniu 1) również byłoby w porządku.Poszedłbym na to, ale
matchadd()
zamiast tego użyłem:match
; pozostawia to drugie do niestandardowego wyróżnienia. Ponadto,clearmatches()
jest zbyt gruba; usuwa wszystkie dopasowania, a zatem może wpływać na wtyczki. Możesz użyć / spojrzeć na moją wtyczkę ShowTrailingWhitespace, aby uzyskać czystą i wydajną implementację (która obejmuje także wyjątki dla niektórych typów plików). Tak, to znacznie większe rozwiązanie, ale nie zauważyłem jeszcze żadnego wpływu.Jest to przydatna funkcja sama w sobie, a jej stałe włączenie ma wpływ na położenie kursora na znakach Tab, więc nie poleciłbym tego.
Z pewnością wpłynie to na niektóre składnie i wtyczki korzystające z tej funkcji. Kiepski pomysł.
źródło
'listchars'
. Dla mnie podświetlenie jest więcej niż wystarczające (szczególnie w agresywnych kolorach).