Как я могу исправить «отсутствующую» подсветку синтаксиса для ключевых слов Python, таких как «self»?


12

Я пытаюсь исправить подсветку синтаксиса для Python; мои цвета отличаются от тех, что на скриншотах, как это должно выглядеть в разных цветовых схемах vim. И вы можете увидеть разницу в сравнении .rb (который отображается правильно) в .py, который выглядит, как он выключен:

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

Например, обратите внимание , как selfне подсвечивается. (Это в base16, но сравнение будет аналогичным в других цветовых схемах). Как правило, похоже, что подсветка синтаксиса объекта неверна.

Некоторые вещи, которые я пробовал:

  1. Глядя на синтаксис скриптов vim загружается; единственное различие между .py и .rb в приведенном ниже примере заключается в том, что, конечно, ruby ​​получает indent / ruby.vim и syntax / ruby.vim, тогда как python получает indent / python.vim и syntax / python.vim. Это файлы, которые поставляются с доморощенным vim.
  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.