Vim语法模式突出显示python关键字参数


17

我正在努力学习vim正则表达式(我也不太了解其他正则表达式),所以主要问题是定义匹配的正则表达式

some_function_call(simple_value, keyword=value)

此示例中的关键字。

因此,如果它在括号内并且后跟等号,则应该匹配一个单词。

下一个问题是如何在vim中定义语法文件。我很乐意为此提供帮助,但是学习起来应该不难,所以我可以自己做。

根据答案进行编辑我已经为python编写了自己的语法脚本。随时尝试。 在此处输入链接说明


Github上有一个开放的问题,关键字突出显示将包含在我知道的最新Python语法文件中:github.com/hdima/python-syntax/issues/44您可能以后要检查一下。如果您知道如何执行此操作,请告诉那里的人(或向我发送消息,以便我创建拉取请求),以便所有人都能使用此功能。
cbaumhardt'3

1
是的,我是打开它的人。
user1685095 '16

Answers:


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 '16

@ user1685095内置函数pythonBuiltin在默认语法组中列出syntax/python.vim。然而,它并没有功能和内置变量区分(TrueFalse并且None也在pythonBuiltin)。您可能会复制定义以供使用。
muru

好吧,我使用了更完善的语法,然后使用诸如hdima / python和vim-polyglot之类的vim default。它们都定义了内置函数(例如关键字),这些函数具有重要的意义。不仅突出显示了内置函数,而且还突出显示了具有相同名称的变量以及其他具有相同名称的模块中的函数。就像query(...).***filter***()filter突出显示时,它与内置的filter函数无关。
user1685095'3

@ 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 )

这需要改进,但可以概述如何实现。


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

感谢您的帮助。我不知道可以在不修改现有规则的情况下添加自定义语法。如果模式是函数中的第一个参数,则它与关键字参数不匹配。我将尝试自己修复该问题(我现在正在学习正则表达式来做到这一点)。我一旦学会如何做,就会发表评论。
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用于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

最后的检查将停止对有条件的着色。您可以根据需要删除它。


对不起,你来晚了。我为自己准备了女仆语法文件。
user1685095 '16

没关系; 如果其他人遇到了同样的问题,我也希望他们可以在这里偷看。
Wolfie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.