Шаблон синтаксиса Vim для выделения аргумента ключевого слова python

17

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

some_function_call(simple_value, keyword=value)

Ключевое слово в этом примере.

Таким образом, оно должно соответствовать слову, если оно внутри паренов и после него должно быть знак равенства.

Следующая проблема - как определить файлы синтаксиса в vim. Я был бы признателен за помощь в этом, но это не должно быть так сложно учиться, поэтому я могу сделать это самостоятельно, вероятно.

РЕДАКТИРОВАТЬ, основываясь на ответе. Я разработал собственный синтаксический скрипт для python. Не стесняйтесь попробовать это. введите описание ссылки здесь

user1685095
источник
На Github есть открытая проблема для подсветки ключевых слов, которая будет включена в самый современный файл синтаксиса Python, о котором я знаю: github.com/hdima/python-syntax/issues/44. Возможно, вы захотите проверить это позже. Если вы выясните, как это сделать, сообщите об этом людям (или напишите мне, чтобы я мог создать запрос на извлечение), чтобы эта функция была доступна всем.
cbaumhardt
1
Да, я тот, кто открыл это.
user1685095

Ответы:

12

С этими настройками:

syn region FCall start='[[:alpha:]_]\i*\s*(' end=')' contains=FCall,FCallKeyword
syn match FCallKeyword /\i*\ze\s*=[^=]/ contained
hi FCallKeyword ctermfg=yellow

Я получил:

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

Вот:

  1. Я определяю синтаксическую область, в которой можно найти аргументы ключевого слова, что будет вызовом функции. containsОпция позволяет вызовы функций мне гнездо.
  2. В этом регионе я сопоставляю любую строку, состоящую из допустимых идентификаторов символов ( \i*), за которыми следуют =, но ==не совпадают, так что проверки на равенство не совпадают.

Используя регионы, я вкладываю совпадения столько раз, сколько мне нужно, что было бы очень сложно (невозможно?), Если бы я просто использовал matchрегулярные выражения.

Я считаю, что регулярные выражения, используемые для сопоставления вызова функции и ключевого слова, могут быть уточнены, но, учитывая то, что допустимо в Python 3 , я не хочу выполнять эту задачу.

Необязательно, я думаю, вы можете использовать это, чтобы выделить вызовы функций, используя matchgroup:

syn region FCall matchgroup=FName start='[[:alpha:]_]\i*\s*(' end=')' contains=FCall,FCallKeyword
syn match FCallKeyword /\i*\ze\s*=[^=]/ contained
hi FCallKeyword ctermfg=yellow
hi FName ctermfg=blue

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

Мур
источник
Я, вероятно, должен создать еще один вопрос, но есть ли у вас идеи о том, как выделить только встроенные функции?
user1685095
@ user1685095 Встроенные функции перечислены в группе pythonBuiltinсинтаксиса по умолчанию syntax/python.vim. Тем не менее, он не различает между функциями и встроенными переменными ( True, Falseа Noneтакже в pythonBuiltin). Возможно, вы могли бы скопировать определения для вашего использования.
Муру
Ну, я использовал более тонкий синтаксис, чем vim default, как hdima / python и vim-polyglot. Все они определяют встроенные функции как ключевое слово, которое имеет важное значение. Подсвечиваются не только встроенные функции, но и переменные с такими же именами и функции в других модулях с таким же именем. Как query(...).***filter***()фильтр выделен, хотя он не имеет ничего общего со встроенными функциями фильтра.
user1685095
@ user1685095 по умолчанию syntax.vimделает их ключевыми словами. См github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
Мура
1
@ user1685095 Странно. У меня нет дополнительных syntax/python.vimфайлов (только по умолчанию, и я не вижу поведения, которое вы делаете: i.stack.imgur.com/LgF6F.png , и я согласен с определением ключевого слова - это наиболее близкое соответствие, и я Не думайте, что ключевые слова совпадают в таких случаях, как nonkeyword.keyword. Что касается переменных, обратите внимание, что эти встроенные функции являются переменными, они являются переменными, содержащими объекты функций, и могут быть назначены так же, как и любые другие переменные. Ничто не мешает вам делать, sorted = filterа затем использовать sortedкак filter.
Мура
8

Здесь вы можете начать с:

/([^,]\+,\s\(\w\+\)=.*)

Разбивая:

/(       start matching a (
[^,]\+   match multiple characters that are not ,
,\s      match a , and a space
\(       start a matching group
\w\+     match word characters
\)       end the matching group
=.*)      match an = and anything until the closing )

Это требует улучшений, но дает вам представление о том, как вы можете это сделать.

nobe4
источник
6

В дополнение к ответу @ Nobe4 вы можете сделать следующее:

  • Создать файл ~/.vim/after/syntax/python.vim
  • Поместите строку с тезисами в файл:

    syntax match PythonArg /(.*\,\s*\zs\w\+\ze\s*=.*)/
    hi PythonArg guibg=blue
    
  • Адаптируйте второй со своими предпочтительными значениями.

Это создаст файл синтаксиса, который добавит синтаксическое совпадение для ваших аргументов, за которым следует a, =и установит используемый стиль. Эта тема :h mysyntaxfile-addдолжна быть интересной для вас.

Кроме того, я использовал другое регулярное выражение, чем другой ответ, вот подробности (я не знаю, какой из них работает лучше, поэтому вам, вероятно, придется попробовать):

(      Begin the pattern with a bracket
.*,    Look for any number of any character before a ,
\s*    Zero or more white spaces after the ,
\zs    Start the matching group (what will be highlighted)
\w\+   Match one or more word characters
\ze    End the matching group
\s*    Zero or more white spaces between your argument and the = sign
=      A literal = sign after your argument
.*)    Any number of any characters between your = sign and the closing bracket
statox
источник
Спасибо за помощь. Я не знал, что могу добавить свой собственный синтаксис без изменения существующих правил. Ваш шаблон не соответствует аргументу ключевого слова, если это первый аргумент в функции. Я постараюсь исправить это сам (сейчас я изучаю регулярные выражения, чтобы сделать это). Как только я научусь это делать, я оставлю комментарий.
user1685095
Я пробую это регулярное выражение с помощью поиска vim, и я думаю, что оно соответствует только одному ключевому слову в вызове функции. Мне нужно, чтобы они совпадали со всеми »
user1685095
@ user1685095: Да, ты прав, моя модель не очень хорошая. Я постараюсь улучшить его и отредактировать свой ответ.
statox
3

Я обнаружил, что ответ @ Wolfie фиксирует развертывание кортежа как ключевого слова, и у него также были проблемы с захватом аргументов ключевых слов с разбитыми строками.

Вдохновленный его регулярным выражением, я придумал следующее, чтобы добавить в мой python.vimфайл синтаксиса. (Имейте в виду, что я изначально использую python.vimфайл синтаксиса из sheerun / vim-polyglot )

syn match pythonFunctionKeyword "\v\s{-}\zs\w+\ze\=(\=)@!(\_s)@!" display
syn cluster pythonExpression add=pythonFunctionKeyword
syn region pythonFunctionKwargs start=+(+ end=+)+ contains=@pythonExpression

И разбивка регулярных выражений очень похожа на ответ @ Wolfie :

\v      set to very magic mode
\s{-}   capture whitespace, nongreedy
\zs     start of the match (what to actually highlight)
\w+     one or more alphanumeric character, underscore included
\ze     stop matching; anything after this is delimiting only
\=      one single equal sign
(\=)@!  ...not followed by another equal sign
(\_s)@! ...not followed by any whitespace or newline character

Обратите внимание , что это не цвет ключевого слова аргумент записывается в виде: key = value. Что я считаю хорошей вещью, поскольку это идет вразрез с официальной рекомендацией PEP-8 в отношении пробелов для аргументов ключевых слов .

лудо
источник
2

Принятый на момент написания принятый ответ прервал подсвечивание строк внутри списков аргументов функции для меня (по тому, какую алхимию я не знаю), так что, надеюсь, более безопасная версия, основанная на Statox'е .

syntax match PythonArg "\v[\(\,]\s{-}\zs\w+\ze\s{-}\=(\=)@!"
hi PythonArg ctermfg = 214 guifg = #ffaf00

ctermfgдля консольного терминала, guifgдля графического интерфейса. Конечно, вы можете изменить цвет на любой, который вы считаете модным. Вот удобный список .

Как всегда, вам лучше положить это внутрь ~/.vim/after/syntax/python.vim

Для разбивки регулярных выражений, здесь вы идете:

\v      set to very magic mode
[\(\,]  capture either a ( or a ,
\s{-}   capture whitespace, nongreedy
\zs     start of the match (what to actually highlight)
\w+     one or more alphanumeric character, underscore included
\ze     stop matching; anything after this is delimiting only
\s{-}   once again, capture whitespace.
\=      one single equal sign
(\=)@!  ...not followed by another equal sign

Финальная проверка останавливает выделение из условных раскрасок. Вы можете удалить, если хотите.

Wolfie
источник
Извините, вы опоздали. У меня есть файл синтаксиса горничной для себя.
user1685095
Все в порядке; если кто-то столкнется с той же проблемой, что и я, они могут заглянуть сюда с надеждой.
Вольф