Jak mogę dodać dodatkowe reguły podświetlania składni w moim lokalnym vimrc?

12

Zainstalowałem gvim na Fedorze i Win7. Odkryłem, że zarówno vim, jak i gvim w Fedorze nie podświetliły nazwy funkcji w kodzie c, podczas gdy gvim na win7 ją podświetlił.

Odkryłem, że w win7 vim73/syntax/c.vimma dodatkowe linie na końcu:

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF

Jeśli dodam te linie do c.vimFedory, gvim może również podświetlić nazwę funkcji.

Aby zachować przenośność, chcę po prostu zmodyfikować, .vimrcaby podświetlić nazwę funkcji. Jednak po dodaniu tych wierszy do .vimrcnie działało.

Czy ktoś może mi pomóc? Przeprowadziłem wyszukiwanie i istnieje wiele rozwiązań, aby podświetlić nazwy funkcji w vimie. Ale jestem ciekawy, jak sprawić, by te linie działały .vimrc. Dziękuję bardzo!

tamlok
źródło
5
Spróbuj dodać go ~/.vim/after/syntax/c.vimzamiast tego.
muru
@muru Tak, działa. Ale co powiesz na dodanie .vimrc?
tamlok,
Prawdopodobnie będziesz musiał użyć czegoś takiego autocmd BufEnter *.c hl ..., ale powinieneś to zachować after/syntax/c.vim. Każda nowoczesna wersja Vima zrozumie .vim/after/katalog. W systemie Windows ścieżka byłaby vimfiles/after/..., więc przenośność nie powinna stanowić większego problemu (szczególnie jeśli używasz żadnych wtyczek).
muru

Odpowiedzi:

15

Jednak po dodaniu tych linii do .vimrc nie działało.

Powodem tego jest to, że Vim usuwa istniejące elementy składniowe podczas ustawiania 'syntax'opcji. Dzieje się tak, ponieważ zachowanie starych elementów składni prowadziłoby do dziwnych sytuacji; jeśli masz bufor, który ma syntax=fooi używa, set syntax=barto skończysz na buforze, który ma podświetlanie składni dla obu foo i bar.

Kiedy Vim się uruchamia, ładuje twój vimrcraz (przy uruchomieniu), ale ładuje pliki typu pliku i składni za każdym razem, gdy są ustawione opcje filetypelub syntax, co zresetuje wartości ustawione w twoim vimrc.

Nawet gdyby go nie zresetował, nie byłoby dobrym pomysłem dodanie go do vimrc, ponieważ dotyczyłoby wszystkich buforów, a nie tylko buforów z syntax=c.


Poniższy tekst zakłada Vima w systemie Unix-y, ale będzie on również działał dla użytkowników Neovim i Windows:

  • Neovim użytkownicy powinni wymienić ~/.vim/z ~/.config/nvim/.
  • Okna użytkownicy powinni wymienić ~/.vim/z %USERPROFILE%\vimfiles\.

Przesłanianie całego pliku

Najprostszym sposobem na zmianę czegoś jest po prostu zastąpienie go . Aby to zrobić, utwórz plik w ~/.vim/<file>.vim.

<file.vim>jest ścieżką względem $VIMRUNTIME(w tym podkatalogów). W twoim przykładzie powinno być syntax/c.vim. Zostanie załadowany zamiast pliku w $VIMRUNTIME.

Skutkiem tego jest łatwiejsze wprowadzanie zmian - zmiana wychodzących plików składniowych może być czasem nieco trudna. Minusem jest to, że nie otrzymasz żadnych przyszłych aktualizacji pliku systemowego.

Często używam tego jako punktu wyjścia do eksperymentowania z plikami składni, a następnie wypakowuję moje lokalne zmiany do lokalnego dodatku, używając jednej z metod opisanych poniżej.

Lokalne dodatki

Istnieją dwa sposoby dodawania lokalnych dodatków do plików składniowych, są one funkcjonalnie identyczne i można użyć preferowanej metody.

Syntax autocmd

Użyj Syntaxautocmd:

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end

Zauważ, że łączenie kilku poleceń |jest tutaj problematyczne, ponieważ mają one tendencję do interpretowania jako części :synpolecenia, dlatego autocmd Syntax ckilka razy powtórzyłem . Alternatywą byłoby użycie funkcji:

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end

Zaletą jest to, że wszystkie zmiany mogą być zawarte w jednym pliku. Wadą jest to, że jest trochę brzydka, szczególnie jeśli masz wiele zmian.

po katalogu

Użyj Directory po-: ~/.vim/after/<file>.vim.

Zostanie to załadowane po <file>.vimhas, gdzie <file.vim>jest ścieżka względem $VIMRUNTIME(łącznie z podkatalogami). W twoim przykładzie powinno być syntax/c.vim.

Zobacz także :help after-directory.

Zaletą jest to, że jest nieco bardziej czytelny niż autocmd, szczególnie jeśli masz wiele zmian. Wadą jest to, że musisz skopiować dodatkowy plik, jeśli chcesz wykonać kopię lustrzaną konfiguracji Vima na różnych komputerach (jest to ważny powód, dla którego wiele osób utrzymuje swoje pliki Vima w repozytorium GitHub, aby można je było łatwo skopiować na różne maszyny ).

Martin Tournoij
źródło