Jak mogę naprawić „brakujące” podświetlanie składni dla słów kluczowych w Pythonie, takich jak „self”?

12

Próbuję naprawić podświetlanie składni dla Pythona; moje kolory różnią się od tych na zrzutach ekranu, jak to „powinno” wyglądać w różnych schematach kolorów vim. Możesz zobaczyć różnicę w porównaniu .rb (który wyświetla się poprawnie) do .py, który wygląda na wyłączony:

wprowadź opis zdjęcia tutaj

Na przykład zauważ, że selfnie jest podświetlone. (To jest w bazie16, ale porównanie byłoby podobne w innych schematach kolorów). Zasadniczo wygląda na to, że podświetlanie składni obiektu jest nieprawidłowe.

Niektóre rzeczy próbowałem:

  1. Patrząc na skrypty składniowe vim ładuje; jedyną różnicą między .py i .rb w poniższym przykładzie jest to, że Ruby oczywiście pobiera wcięcia / ruby.vim i składnię / ruby.vim, podczas gdy python dostaje wcięcia / python.vim i składnię / python.vim. Są to pliki, które pochodzą z homebrew vim.
  2. Ładowanie tych samych plików w macvimie zamiast vim terminalu (iterm2); ten sam problem, pliki wyglądają dokładnie tak samo jak na zdjęciu.
  3. Dodanie nowego pliku python.vim . Nie rozwiązuje problemu, nawet jeśli jest używany jako .vim/afterskrypt.

Wszelkie sugestie są mile widziane; Waliłam się w to od wielu godzin i nie mogę zrozumieć, dlaczego podświetlenie nie działa zgodnie z oczekiwaniami.

sl8r000
źródło
Zauważ, że Python nie ma symboli i zdecydowanie polecam użycie składni Python 3 dla nowego kodu.
Martin Tournoij

Odpowiedzi:

12

Jak w skrócie działa podświetlanie składni:

  • W syntax/<filetype>.vimskładni reguły są definiowane za pomocą :syntaxpolecenia. To polecenie definiuje składnię. Mówi „jeśli tekst pasuje do tego wyrażenia regularnego, jest łańcuchem” i tak dalej. W tym celu przypisuje grupę wyróżnień . To nie nie mówią nic na temat kolorów jako takich.

  • :highlightmówi „podkreśl tę grupę za pomocą tych kolorów”. Odbywa się to w schemacie kolorów , a nie w pliku składni. Istnieje kilka standardowych grup świecące ( String, Function, Special, i tak dalej), które wszystkie systemy kolor powinien zdefiniować.

    W żadnym wypadku nie jesteś ograniczony do tych grup domyślnych i możesz utworzyć tyle grup, ile chcesz (ale domyślnie pliki składni zwykle nie).

  • indent/<filetype>.vimPlik kontroluje automatyczne wcięcia. Na przykład dla Ruby jest napisane: „linia po defpowinna zwiększyć poziom wcięcia” i „linia po endpowinna zmniejszyć wcięcie o jeden poziom”. Nie robi nic z kolorami ani podświetlaniem składni.


Dlaczego różne języki programowania są wyróżniane? Częściowo z powodu osobistej estetyki i opinii tego, kto to napisał. Na przykład w Ruby Typegrupa wyróżnień jest używana do nazw klas. Ale mogło to być Functionlub coś innego. Dlaczego jest to Type? Prawdopodobnie dlatego, że autor pomyślał, że lepiej wygląda w swojej kolorystyce.

Co ważniejsze, języki mają różną semantykę i wrażliwość. W Ruby selfjest specjalnym słowem kluczowym. Nie możesz zrobić self = "foo"lub def self(). To są błędy. Ale to nie przypadek w Pythonie. To po prostu inna zmienna bez żadnych specjalnych właściwości. Robić:

x = Object()
x.foo()

jest naprawdę „przetłumaczony” przez Python na:

Object.foo(x)

Nazwa selfjest tylko konwencją (prawie powszechnie przyjętą), ale możesz nazwać ją jak tylko chcesz; def x(this):lub def x(xxx):są równie ważne. Możesz także użyć nazwy w selfdowolnym miejscu; self = 'foo'i def self():są całkowicie w porządku.

Twierdziłbym, że selfnie należy go wyróżniać, ponieważ nie jest to ani specjalne słowo kluczowe, ani predefiniowana zmienna (jak str). W selfpliku składni nie ma śladu tego słowa , więc wygląda na to, że autor tego rozumował tak samo :-)


Jeśli chcesz selfwyróżnić, musisz utworzyć dla niego regułę składni:

:syn keyword pythonBuiltin self

Nazwa pythonBuiltingrupy jest już zdefiniowana w domyślnym pliku składni i połączona z Functiongrupą wyróżnień. Aby użyć nowej grupy wyróżnień, użyj czegoś takiego:

:syn keyword pythonSelf self
:highlight def link pythonSelf Special

Aby wprowadzić te zmiany, nie możesz ich po prostu włożyć do pliku vimrc. Plik składni zastąpi go. Zamiast tego musisz uruchomić go po załadowaniu pliku składni, co możesz zrobić na dwa sposoby:

  1. Użyj FileTypeautocmd:

    augroup python
        autocmd!
        autocmd FileType python
                    \   syn keyword pythonSelf self
                    \ | highlight def link pythonSelf Special
    augroup end
    
  2. Użyj after-directory, ~/.vim/after/syntax/python.vim:

    syn keyword pythonSelf self
    highlight def link pythonSelf Special
    

Obie metody są faktycznie takie same. Użyj tego, co wolisz.

Martin Tournoij
źródło