Jak sprawić, by Vim podświetlił znaki inne niż ascii?

Próbuję nakłonić Vima do podświetlania znaków innych niż ASCII. Czy istnieje dostępne ustawienie, wzorzec wyszukiwania regex lub wtyczka, aby to zrobić?

 116
Author: Michael Berkowski, 2013-06-07

8 answers

Używając zakresu w klasie znaków [] podczas wyszukiwania, powinieneś być w stanie wykluczyć szesnastkowy zakres znaków ASCII, dlatego podświetlając (zakładając, że masz włączone hlsearch) wszystkie inne znaki leżące poza zakres ASCII:

/[^\x00-\x7F]

To zrobi negative match (via [^]) dla znaków pomiędzy ASCII 0x00 i ASCII 0x7F (0-127), i wydaje się działać w moim prostym teście. Dla rozszerzonego ASCII, oczywiście rozszerzyć zakres do {[7] } zamiast \x7F używając /[^\x00-\xFF].

Można również wyrazić go w dziesiętnym poprzez \d:

/[^\d0-\d127]

Jeśli potrzebujesz czegoś bardziej szczegółowego, jak wykluczenie niedrukowalnych znaków, musisz dodać te zakresy do klasy znaków [].

 223
Author: Michael Berkowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-15 12:53:34

Tak, istnieje funkcja natywna do podświetlania dowolnych dopasowanych ciągów. Inside Vim, do:

:help highlight
:help syn-match

syn-match definiuje łańcuch, który pasuje do grupy. highlight definiuje kolor używany przez grupę. Wystarczy pomyśleć o podświetlaniu składni dla plików vimrc.

Więc możesz użyć poniższych poleceń w swoim .plik vimrc:

syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2
 30
Author: Steven Ding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-15 00:25:11

Dla innych (od teraz mniej pechowych) ludzi kończących się tutaj przez wyszukiwarkę i nie może osiągnąć podświetlanie znaków nie-ASCII, spróbuj tego (włóż to do swojego ."vimrc"): {]}

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

Ma to dodatkową zaletę, że nie koliduje z definicjami składni zwykłej (opartej na typie pliku [rozszerzenie pliku]).

 14
Author: PAStheLoD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-06 03:31:32

Jeśli interesują Cię również znaki non printable 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
 4
Author: Reman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 13:04:06

Ten regex działa również. To był pierwszy hit google dla "vim Usuń znaki nie-ascii" z briceolion.com i z :set hlsearch podświetli:

:/[^[:alnum:][:punct:][:space:]]/g
 3
Author: Grant Bowman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-30 16:37:26

Bazując na innych odpowiedziach na ten temat i odpowiedzi, które otrzymałem tutaj dodałem to do mojego .vimrc, aby móc kontrolować podświetlanie bez ascii, wpisując <C-w>1. Wyświetla również wewnątrz komentarzy, chociaż będziesz musiał dodać grupę komentarzy dla każdej składni pliku, której użyjesz. Oznacza to, że jeśli edytujesz plik zsh, musisz dodać zshComment do linii

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

W Przeciwnym Razie nie wyświetli znaku spoza ascii. Aby sprawdzić, jak komentarz jest wywoływany na innym typie pliku, otwórz plik żądanego typu i wprowadź :sy w Vimie, a następnie wyszukaj w elementach składni komentarz.

function HighlightNonAsciiOff()
  echom "Setting non-ascii highlight off"
  highlight nonascii none
  let g:is_non_ascii_on=0
endfunction

function HighlightNonAsciiOn()
  au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment
  echom "Setting non-ascii highlight on"
  highlight nonascii cterm=underline ctermfg=red ctermbg=none term=underline 
  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
Author: Werner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:26

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

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

Zachowuje większość postaci, które mnie interesują.

 0
Author: user2250246,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 17:44:18

Ktoś już odpowiedział na pytanie. Jednak dla innych, którzy nadal mają problemy, oto inne rozwiązanie, aby wyróżnić znaki nie-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

To ma mieszankę części z innych rozwiązań. Możesz usunąć contained, ale z dokumentacji może być potencjalny problem samego rekursowania (jak rozumiem). Aby wyświetlić inne zdefiniowane wzorce, syn-contains sekcja by go zawierała.

:help syn-containedin
:help syn-contains 

Replikowany problem z: Ustaw element na wyższy priorytet podświetlenia w vim

 0
Author: nate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:24