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


17

Я борюся з навчанням vim regexps (я теж не знаю жодного іншого regexp), тому головна проблема полягає у визначенні regexp, який би відповідав

some_function_call(simple_value, keyword=value)

ключового слова в цьому прикладі.

Тож воно має відповідати слову, якщо воно знаходиться всередині паронів і має рівний знак після нього.

Наступна проблема - як визначити файли синтаксису у vim. Я би вдячний допомогти у цьому, але це не повинно бути таким важким для навчання, тому я, мабуть, можу зробити це самостійно.

EDIT на основі відповіді, я наклав власний синтаксичний скрипт для python. Сміливо спробуйте. введіть опис посилання тут


У Github існує відкрите питання щодо виділення ключових слів, яке має бути включено до найновішого синтаксичного файлу Python, про який я знаю: github.com/hdima/python-syntax/isissue/44 Ви можете там перевірити пізніше. Якщо ви вирішите, як це зробити, повідомте людей, які там знають (або повідомте мені, щоб я могла створити запит на тягу), щоб ця функція була доступною для всіх.
cbaumhardt

1
Так, я це відкрив.
користувач1685095

Відповіді:


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

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


Я, мабуть, повинен створити ще одне питання, але чи є у вас ідеї, як виділити лише вбудовані функції?
користувач1685095

@ user1685095 Вбудовані функції pythonBuiltinза замовчуванням вказані у групі синтаксису syntax/python.vim. Тим НЕ менше, він не розрізняє між функціями і вбудованими змінними ( True, Falseа Noneтакож в pythonBuiltin). Можливо, ви могли скопіювати визначення для свого використання.
муру

Добре, я використав більш вдосконалений синтаксис, ніж vim за замовчуванням, як hdima / python та vim-polyglot. Всі вони визначають вбудовані функції, як ключове слово, яке має важливий наслідок. Виділяються не тільки вбудовані функції, але й проста змінна з однаковими іменами та функції в інших модулях з тим самим іменем. Як query(...).***filter***()фільтр виділяється, хоча він не має нічого спільного з вбудованими функціями фільтра.
користувач1685095

@ user1685095 за замовчуванням syntax.vimробить їх ключовими словами. Дивіться github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
muru

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 )

Це потребує вдосконалень, але дає вам огляд того, як ви можете це зробити.


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

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

Я намагаюсь це regexp за допомогою пошуку vim, і я думаю, що він відповідає лише одному ключовому слову у виклику функції. Мені потрібно, щоб він відповідав усім їм »
користувач1685095

@ 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призначений для gui. Звичайно, ви вільні змінити кольори на те, що вам здається фантазійним. Ось зручний список .

Як завжди, вам краще всього це вкласти всередину ~/.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

Остаточна перевірка зупиняє виділення від умовних забарвлень. Ви можете видалити, якщо захочете.


Вибачте, ти запізнився. Я синтаксичний файл покоївки для себе.
користувач1685095

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