Jak sprawić, by Vim podświetlał postacie spoza ASCII?


153

Próbuję zmusić Vima do podświetlania znaków spoza ASCII. Czy jest dostępne ustawienie, wzorzec wyszukiwania wyrażenia regularnego lub wtyczka do tego?

Odpowiedzi:


291

Używając zakresu w []klasie znaków w swoim wyszukiwaniu, powinieneś być w stanie wykluczyć zakres znaków szesnastkowych ASCII, dlatego podświetlając (zakładając, że hlsearchwłączyłeś) wszystkie inne znaki spoza zakresu ASCII:

/[^\x00-\x7F]

Spowoduje to dopasowanie negatywne (przez [^]) dla znaków między ASCII 0x00i ASCII 0x7F(0-127) i wydaje się działać w moim prostym teście. W przypadku rozszerzonego ASCII, oczywiście, rozszerz zakres do \xFFzamiast \x7Fużywać /[^\x00-\xFF].

Możesz również wyrazić to w postaci dziesiętnej za pomocą \d:

/[^\d0-\d127]

Jeśli potrzebujesz czegoś bardziej szczegółowego, na przykład wykluczenia niedrukowalnych znaków, będziesz musiał dodać te zakresy do klasy znaków [].


14
Dziesiętnie:/[^\d0-\d127]
Bohr

@Bohr To miły dodatek. Zmienię to powyżej.
Michael Berkowski

świetny! uratował dzień! jeden ze znaków wcięcia został wklejony do mojego kodu Pythona i błąd Unicode zaczął mnie zabijać. był trudny do wykrycia wśród tej samej postaci używanej przez wtyczkę vim!
kollery

36

Tak, istnieje natywna funkcja do podświetlania dowolnych dopasowanych ciągów. Wewnątrz Vima zrób:

:help highlight
:help syn-match

syn-matchdefiniuje ciąg, który pasuje do grupy. highlightokreśla kolor używany przez grupę. Pomyśl tylko o podświetlaniu składni w plikach vimrc.

Możesz więc użyć poniższych poleceń w swoim pliku .vimrc:

syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2

nie musisz umieszczać :przed komendami w swoim vimrc.
FDinoff,

termbgnie wydaje się być legalnym poleceniem w VIM 7.3 zainstalowanym na Ubuntu Server 12.10.
dotancohen

4
W takim razie termbgnie wydaje się być legalnym parametrem w VIM 7.3 zainstalowanym na Ubuntu Server 12.10.
dotancohen

Rzeczywiście, zwykły terminal termnie może mieć koloru tła, podczas gdy terminal kolorowy ctermmoże.
Dima Tisnek

usunięto termbg, ale można dodać ctermfg, guifg itp., aby sterować również pierwszym planem.
fatal_error

16

Dla innych (od teraz mniej pechowych) ludzi, którzy trafiają tutaj przez wyszukiwarkę i nie mogą wykonać podświetlania znaków spoza ASCII, spróbuj tego (umieść to w swoim .vimrc):

highlight nonascii guibg=Red ctermbg=1 term=standout
au BufReadPost * syntax match nonascii "[^\u0000-\u007F]"

Ma to tę dodatkową zaletę, że nie koliduje ze zwykłymi (opartymi na typie pliku [rozszerzenie pliku]) definicjami składni.


Otrzymuję E319: Sorry, the command is not available in this version: au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" Press ENTER or type command to continueLinux mint 17.3
Nasser

3
Chociaż celem jest nie kolidowanie z już zdefiniowanymi definicjami składni, jeśli chcesz , możesz dodać containedin=ALLna koniec ostatniej linii, tworząc ją au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL. Uważam, że warto go rozproszenia (gdy Unicode jest dozwolone), oryginalna odpowiedź tutaj nie nie złapać rzeczy, takich jak kod spoza ASCII wewnętrznej w ifoświadczeniu ...
svenevs

1
Zawsze bezpieczniej jest zamknąć swoją autocmd BufRead ....grupę w autogrupie w vimie, chyba że masz bardzo dobry powód, aby nie ...
Cbhihe

6

To wyrażenie regularne również działa. To był pierwszy hit Google dotyczący „vim remove non-ascii characters” z briceolion.com i wyróżni:set hlsearch :

/[^[:alnum:][:punct:][:space:]]/

1
Pytanie dotyczy podkreślenia znaków spoza zestawu ASCII, a nie ich usuwania .
chutsu

1
Dzięki za zwrócenie uwagi, zredagowałem odpowiedź. Nie było zbytniego naciągania zobaczyć, że to wyrażenie regularne odpowiada również na pytanie w sposób inny niż inne odpowiedzi. Moja pierwotna odpowiedź brzmiała, :%s/[^[:alnum:][:punct:][:space:]]//gcktóra najpierw podkreśla, a potem zastępuje.
Grant Bowman

4

Jeśli interesują Cię również znaki niedrukowalne, użyj tego:/[^\x00-\xff]/

Używam go w funkcji:

 function! NonPrintable()
   setlocal enc=utf8
   if search('[^\x00-\xff]') != 0
     call matchadd('Error', '[^\x00-\xff]')
     echo 'Non printable characters in text'
   else
     setlocal enc=latin1
     echo 'All characters are printable'
   endif
 endfunction

Twoja funkcja nie działa tutaj, nie podświetla, a także psuje kodowanie. Dlaczego zmieniasz lokalne kodowanie?
Werner

Spróbuj zmienić encna fenc. Zmieniłem kodowanie, ponieważ moje domyślne kodowanie to (było w 2013) latin1. Funkcja nie wyróżnia znaków niedrukowalnych, jeśli zestaw znaków to latin1. Aby zobaczyć wyróżnienie, musisz mieć klucz ERRORw pliku składni kolorów. To jest moje:hi Error guifg=Black guibg=Orange
Reman

2

Na podstawie innych odpowiedzi na ten temat i odpowiedzi, którą tutaj otrzymałem , dodałem to do mojego .vimrc, aby móc sterować podświetlaniem innym niż ASCII, wpisując <C-w>1. Pokazuje również komentarze wewnątrz, chociaż będziesz musiał dodać grupę komentarzy dla każdej składni pliku, której będziesz używać. Oznacza to, że jeśli będziesz edytować plik zsh, będziesz musiał dodać zshCommentdo linii

au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment

w przeciwnym razie nie pokaże znaku spoza ASCII (możesz również ustawić wartość includedin = ALL, jeśli chcesz mieć pewność, że we wszystkich grupach są wyświetlane znaki spoza zestawu ASCII). Aby sprawdzić, jak wywoływany jest komentarz w innym typie pliku, otwórz plik żądanego typu i wejdź :sydo vim, a następnie wyszukaj komentarz w elementach składni.

function HighlightNonAsciiOff()
  echom "Setting non-ascii highlight off"
  syn clear nonascii
  let g:is_non_ascii_on=0
  augroup HighlightUnicode
  autocmd!
  augroup end
endfunction

function HighlightNonAsciiOn()
  echom "Setting non-ascii highlight on"
  augroup HighlightUnicode
  autocmd!
  autocmd ColorScheme *
        \ syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment |
        \ highlight nonascii cterm=underline ctermfg=red ctermbg=none term=underline
  augroup end
  silent doautocmd HighlightUnicode ColorScheme
  let g:is_non_ascii_on=1
endfunction

function ToggleHighlightNonascii()
  if g:is_non_ascii_on == 1
    call HighlightNonAsciiOff()
  else
    call HighlightNonAsciiOn()
  endif
endfunction

silent! call HighlightNonAsciiOn()
nnoremap <C-w>1 :call ToggleHighlightNonascii()<CR>

1

Jakoś żadna z powyższych odpowiedzi nie zadziałała dla mnie.

Więc użyłem :1,$ s/[^0-9a-zA-Z,-_\.]//g

Utrzymuje większość interesujących mnie postaci.


1
Spowoduje to usunięcie znaków, w przypadku których operacja poprosiła o wyróżnienie .
Bernhard Wagner

nie masz na myśli [^ 0-9a-zA-Z, \ -_ \.], czyli \ -?
ben26941

0

Ktoś już odpowiedział na pytanie. Jednak dla innych, którzy nadal mają problemy, oto inne rozwiązanie, aby wyróżnić znaki spoza ASCII w komentarzach (lub dowolnej grupie składni w tej sprawie). To nie jest najlepsze, ale to tymczasowe rozwiązanie.

Można spróbować:

:syntax match nonascii "[^\u0000-\u007F]" containedin=ALL contained |
            \ highlight nonascii ctermfg=yellow guifg=yellow

Ma to połączenie części z innych rozwiązań. Możesz usunąć contained, ale z dokumentacji może wystąpić potencjalny problem z ponownym wyświetlaniem się (jak rozumiem). Aby wyświetlić inne zdefiniowane wzorce, syn-containssekcja powinna go zawierać.

:help syn-containedin
:help syn-contains 

Powielony problem z: Ustaw przedmiot na wyższy priorytet podświetlenia na vimie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.