2009-07-31 7 views
12

W VIM, muszę wykonać proste zadanie - zaznacz "(" i ")". Można zrobić to łatwo przez wydającego dwa polecenia:Jak przesłonić domyślne podświetlanie składni w vim?

:syn match really_unique_name display "[()]" 
:hi really_unique_name guifg=#FF0000 

Ale jeśli dodać te same polecenia (bez „:” oczywiście) aby opróżnić .vimrc i uruchom ponownie VIM - „(” i „)” nie są już zaznaczone w plikach .cpp. Wygląda na to, że jeśli utworzę/załaduję plik .cpp, VIM załaduje plik składni, który zastąpi moje niestandardowe podświetlenia. Jak mogę skonfigurować podświetlenia w moim pliku .vimrc, aby był on dostępny po standardowych definicjach składni lub nie będzie miał wpływu na standardową definicję składni?

Odpowiedz

24

Są cztery opcje (z których dwa zostały zaproponowane przez innych):

  1. użyć struktury after w vimfiles (~/.vim/after/syntax/cpp.vim):

    :help after-directory 
    
  2. Zastosowanie mecz dla bieżącego okna:

    :match really_unique_name "[()]" 
    
  3. Zastosowanie matchadd(), ponownie dla bieżącego okna, ale to pozwala usunąć poszczególne mecze, jeśli później trzeba:

    :call matchadd('really_unique_name', "[()]") 
    " Or 
    :let MyMatchID = matchadd('really_unique_name', "[()]") 
    " and then if you want to switch it off 
    :call matchdelete(MyMatchID) 
    
  4. Install rainbow.vim wtyczki dr Chipa dostać klamra podkreślając w różny kolory w zależności od poziomu wcięcia.

W tej sytuacji polecam opcję 1, ponieważ wygląda na to, że jest częścią ogólnej składni. Jeśli chcesz użyć mecze i chcesz je mieć bufor specyficzny (zamiast konkretnego okna), musisz coś takiego:

function! CreateBracketMatcher() 
    call clearmatches() 
    call matchadd('really_unique_name', "[()]") 
endfunc 
au BufEnter <buffer> call CreateBracketMatcher() 

Aby uzyskać więcej informacji, patrz:

:help after-directory 
:help :match 
:help matchadd() 
:help matchdelete() 
:help clearmatches() 
:help function! 
:help autocmd 
:help autocmd-buffer-local 
:help BufEnter 

Użytkownik może także interesuje mnie moja odpowiedź na this question, która dotyczy bardziej ogólnego wyróżnienia operatora.

+0

Dzięki za "au BufEnter", działa idealnie zarówno na Windows i Macos box (hi nie działają na MacOSie - jest wyczyszczone po przetworzeniu .vimrc). – grigoryvp

+0

Lokalne autokryki bufora powinny być tworzone dopiero po otwarciu bufora. Żadna z sugerowanych przeze mnie sugestii nie powinna znajdować się w .vimrc: użyj vimfiles/after/syntax/cpp.vim lub jednej z podobnych opcji. Ewentualnie można je kroić za pomocą "au BufEnter, BufNew, BufReadPost * .cpp call CreateBracketMatcher()", ale to trochę krówka. – DrAl

+0

@DrAl Właśnie napisałem fragment http://vimrcfu.com na podstawie Twojej odpowiedzi: http://vimrcfu.com/snippet/197 Dzięki! –

4

Zamiast używać synchronizacji, po prostu użyj dopasowania. np:

hi really_unique_name guifg=#FF0000 
match really_unique_name "[()]" 

match ma wyższy priorytet niż syn-meczu (tzn: jego podświetlanie zastąpi podświetlanie generowane przez syn-meczu) i (grzeczne) plików składni nie powinny bałagan z nim.

Jedynym zastrzeżeniem z dopasowaniem jest to, że jest to okienko, a nie bufor.

Jeśli potrzebujesz dodatkowych dopasowań, możesz użyć opcji 2match i 3match.

Zobacz :help :match w Vim, aby uzyskać więcej informacji.

+0

Dzięki. Działa poprawnie na moim oknie Windows. Ale na MacOS BOX nie działa "hi really_unique_name guifg = # FF0000". Nawet jeśli jest to jedyna linia w .vimrc, po uruchomieniu vima i wykonaniu "hi really_unique_name" widzę "really_unique_name xxx cleared". Dlaczego jest "wyczyszczony"? – grigoryvp

9

Put ustawień w ~/.vim/after/syntax/cpp.vim

+0

Hmmm, wydaje się dobrym rozwiązaniem. Ale nie działa dla mnie ... http://stackoverflow.com/questions/2464593/custumizing-syntax-highlighting-in-vim – sixtyfootersdude

2

zwykle zrobić to tak:

:hi really_unique_name guifg=#FF0000 
:au BufNewFile,BufRead * :syn match really_unique_name display "[()]" 

au oznacza autocmd. Pomoc powie więcej.

+0

Przepraszam, w dwóch liniach ... dla niektórych reasone usunięto moje hasło ... – Peter