Я пытаюсь исправить подсветку синтаксиса для Python; мои цвета отличаются от тех, что на скриншотах, как это должно выглядеть в разных цветовых схемах vim. И вы можете увидеть разницу в сравнении .rb (который отображается правильно) в .py, который выглядит, как он выключен:
Например, обратите внимание , как self
не подсвечивается. (Это в base16, но сравнение будет аналогичным в других цветовых схемах). Как правило, похоже, что подсветка синтаксиса объекта неверна.
Некоторые вещи, которые я пробовал:
- Глядя на синтаксис скриптов vim загружается; единственное различие между .py и .rb в приведенном ниже примере заключается в том, что, конечно, ruby получает indent / ruby.vim и syntax / ruby.vim, тогда как python получает indent / python.vim и syntax / python.vim. Это файлы, которые поставляются с доморощенным vim.
- Загрузка тех же файлов в macvim, а не в терминал (iterm2) vim; та же проблема, файлы выглядят точно так же, как на картинке.
- Добавление нового файла python.vim . Не решает проблему, даже если используется в качестве
.vim/after
сценария.
Любые предложения приветствуются; Я часами бился об этом и не могу понять, почему подсветка работает не так, как ожидалось.
Ответы:
Как работает подсветка синтаксиса вкратце:
В
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. Это просто другая переменная без каких-либо специальных свойств. Выполнение:действительно "переведено" Python на:
Название
self
- это просто соглашение (почти повсеместно принятое), но вы можете назвать его как угодно;def x(this):
илиdef x(xxx):
одинаково действительны. Вы также можете использовать имяself
где угодно;self = 'foo'
иdef self():
прекрасно в порядке.Я бы сказал, что
self
не следует выделять, поскольку это не специальное ключевое слово и не предопределенная переменная (напримерstr
). Вself
файле синтаксиса нет никаких следов слова , поэтому, похоже, автор этого рассуждал так же :-)Если вы хотите
self
выделить, вам нужно создать синтаксическое правило для него:Имя
pythonBuiltin
группы уже определено в файле синтаксиса по умолчанию и связано сFunction
группой выделения. Чтобы использовать новую группу подсветки, используйте что-то вроде:Чтобы внести эти изменения, вы не можете просто вставить их в файл vimrc. Файл синтаксиса переопределит его. Вместо этого вам нужно будет запустить его после загрузки файла синтаксиса, что можно сделать двумя способами:
Используйте
FileType
autocmd:Используйте
after-directory
,~/.vim/after/syntax/python.vim
:Оба метода практически одинаковы. Используйте то, что вы предпочитаете.
источник