Як я можу виправити "відсутні" підсвічування синтаксису для ключових слів Python, таких як "self"?


12

Я намагаюся виправити підсвічування синтаксису для python; мої кольори відрізняються від кольорів на скріншотах тим, як він повинен "виглядати" в різних кольорових схемах vim. І ви можете побачити різницю в порівнянні .rb (який відображається правильно) з .py, який виглядає як вимкнено:

введіть тут опис зображення

Наприклад, зауважте, як selfце не виділено. (Це в базі16, але порівняння було б подібним в інших кольорових схемах). Як правило, схоже, що підсвічування синтаксису об'єкта неправильне.

Деякі речі, які я спробував:

  1. Переглядаючи скрипти синтаксису vim завантаження; Єдина відмінність .py та .rb у наведеному нижче прикладі полягає в тому, що, звичайно, ruby ​​отримує відступ / ruby.vim та синтаксис / ruby.vim, тоді як python отримує відступ / python.vim та синтаксис / python.vim. Це файли, які постачаються з vim homebrew.
  2. Завантаження тих же файлів у macvim, а не термінал (iterm2) vim; та ж проблема, файли виглядають точно так само, як на малюнку.
  3. Додавання нового файлу python.vim . Не вирішує проблему, навіть якщо вона використовується як .vim/afterсценарій.

Будь-які пропозиції вітаються; Я годинами про це стукав головою, і не можу зрозуміти, чому виділення працює не так, як очікувалося.


Зауважте, що в Python немає символів, і я настійно рекомендую вам використовувати синтаксис Python 3 для нового коду.
Мартін Турноїй

Відповіді:


12

Як коротко працює підсвічування синтаксису:

  • У syntax/<filetype>.vimсинтаксисі правила визначаються за допомогою :syntaxкоманди. Ця команда визначає синтаксис. У ній написано, "якщо текст відповідає цьому регулярному виразу, це рядок" тощо. Для цього він призначає групу виділень . Це НЕ що - або про квіти як такі говорить.

  • :highlightговорить "виділіть цю групу цими кольорами". Це робиться в кольоровій гамі , а не в синтаксичному файлі. Є купа груп по замовчуванням Highlight ( String, Function, Specialі так далі) , які повинні визначити всі колірні схеми.

    Ти жодним чином не обмежується цими групами за замовчуванням, і ти можеш створити стільки груп, скільки хочеш (але синтаксичні файли за замовчуванням зазвичай не роблять).

  • indent/<filetype>.vimФайл управляє автоматичним відступів. Наприклад, для Ruby написано, що "рядок після defмає збільшити рівень відступу" і "рядок після endмає зменшити відступ на один рівень". Це не робить нічого з виділенням кольорів або синтаксису.


Чому різні мови програмування виділяються різними? Частково через особисту естетику та думку тих, хто її написав. Наприклад, у Ruby Typeгрупа виділення використовується для назв класів. Але це також могло бути Functionчи щось інше. Чому саме так Type? Можливо, тому, що автор подумав, що це краще виглядає у його колірній гамі.

Але ще важливіше, що мови мають різну семантику та чуттєвість. У Ruby self- це спеціальне ключове слово. Ви не можете зробити self = "foo"або def self(). Це помилки. Але це не так у Python. Це просто ще одна змінна без особливих властивостей. Виконуємо:

x = Object()
x.foo()

насправді "перекладено" Python на:

Object.foo(x)

Назва selfє лише умовою (майже загальновизнаною), але ви можете назвати її все, що завгодно; def x(this):або def x(xxx):однаково справедливі. Ви також можете використовувати ім’я selfде завгодно; self = 'foo'і def self():ідеально чудові.

Я заперечую, що цього selfне слід виділяти, оскільки це не є ні спеціальним ключовим словом, ні заздалегідь визначеною змінною (наприклад str). У selfсинтаксичному файлі немає жодного сліду , тому схоже, що його автор міркував так само :-)


Якщо ви хочете selfвиділити, вам доведеться створити для нього правило синтаксису:

:syn keyword pythonBuiltin self

Назва pythonBuiltinгрупи вже визначена у файлі синтаксису за замовчуванням та пов’язана з Functionгрупою виділення. Щоб використовувати нову групу виділень, використовуйте щось на кшталт:

:syn keyword pythonSelf self
:highlight def link pythonSelf Special

Щоб внести ці зміни, ви не можете просто вставити їх у свій файл vimrc. Синтаксичний файл замінить його. Замість цього вам потрібно буде запустити його після завантаження синтаксичного файлу, що можна зробити двома способами:

  1. Використовуйте FileTypeautocmd:

    augroup python
        autocmd!
        autocmd FileType python
                    \   syn keyword pythonSelf self
                    \ | highlight def link pythonSelf Special
    augroup end
    
  2. Використовуйте after-directory, ~/.vim/after/syntax/python.vim:

    syn keyword pythonSelf self
    highlight def link pythonSelf Special
    

Обидва способи фактично однакові. Використовуйте те, що вам зручніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.