Wyświetl końcowe spacje w vimie

11

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

Zaznacz końcowe białe spacje

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:◦

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Plusy:

  • Łatwy w użyciu
  • Szybki

Cons:

  • Problem, jeśli :set cursorlinewłączony
  • Koloru dedykowanego dla list/trailnie 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

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

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
nowox
źródło
Jeśli nie lubisz czerwonego, wybierz inny kolor. Jeśli chcesz, aby kolor był zgodny z różnymi schematami kolorów, połącz z nazwą grupy kolorów zamiast używać określonego koloru, np :hi link ExtraWhitespace CursorLine. Zobaczyć :help hi-link.
garyjohn

Odpowiedzi:

4

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 linkdo istniejącej grupy; zwykle tak by było Error. 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.

Rozwiązanie 1: Ręcznie zaznacz końcowe spacje

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.

Rozwiązanie 2: Korzystanie z funkcji listy

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.

Rozwiązanie 3: Korzystanie z funkcji ukrywania

Z pewnością wpłynie to na niektóre składnie i wtyczki korzystające z tej funkcji. Kiepski pomysł.

Ingo Karkat
źródło
Tak więc z twojej odpowiedzi rozumiem, że istnieje takie rozwiązanie, które pozwala używać niestandardowego znaku Unicode do oznaczania dodatkowych spacji. To pytanie jest rzeczywiście trudniejsze, niż początkowo myślałem.
nowox
Tak, niestandardowe znaki działają tylko z 'listchars'. Dla mnie podświetlenie jest więcej niż wystarczające (szczególnie w agresywnych kolorach).
Ingo Karkat