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

some_function_call(simple_value, keyword=value)


在此示例中为关键字。

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

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

根据答案编辑我自己的语法脚本蟒蛇。随时尝试。
在此处输入链接说明

评论

Github上有一个待解决的问题,关键字突出显示将包含在我知道的最新Python语法文件中:github.com/hdima/python-syntax/issues/44您可能希望稍后再检查。如果您知道该怎么做,请告知那里的人(或向我发送消息,以便我可以创建拉取请求),以便所有人都能使用此功能。

是的,我是打开它的人。

#1 楼

使用以下设置:

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


我得到:



这里:


我定义了一个语法区域,可以在其中找到关键字参数,这就是函数调用。 contains选项使我可以嵌套函数调用。
在该区域中,我匹配由有效标识符字符(\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 Mar 23 '16 at 10:35

@ user1685095内置函数在pythonBuiltin语法组的默认语法/python.vim中列出。但是,它无法区分函数和内置变量(pythonBuiltin中也包含True,False和None)。您可能会复制定义以供使用。

–大师
16 Mar 23 '16 at 13:06

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

–user1685095
16 Mar 23 '16 at 13:11



@ user1685095默认语法。vim确实使它们成为关键字。参见github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184

–muru
16-3-23在13:22



@ user1685095奇怪。我没有其他语法/python.vim文件(只有默认语法,并且我看不到您的行为:i.stack.imgur.com/LgF6F.png,并且我同意关键字定义-即最接近的匹配,我不认为关键字在诸如nonkeyword.keyword之类的情况下是匹配的。对于变量,请注意,这些内置变量是变量,它们是包含函数对象的变量,可以像分配任何其他变量一样进行赋值。阻止您执行sorted = filter,然后使用sorted like filter。

–大师
16 Mar 23 '16 at 14:08

#2 楼

您可以从以下位置开始:

/([^,]\+,\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 )


这需要改进,但可以为您提供帮助有关如何操作的概述。

#3 楼

除了@ Nobe4答案,您还可以执行以下操作:


创建文件~/.vim/after/syntax/python.vim


将这些行放入文件中:

syntax match PythonArg /(.*\,\s*\zs\w\+\ze\s*=.*)/
hi PythonArg guibg=blue


使用您喜欢的值来适应第二个。

这将创建一个语法文件,该文件将为您的参数添加一个语法匹配项,后跟一个=并设置要使用的样式。这个主题: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
16 Mar 4 '16 at 10:07

我正在通过vim搜索尝试此正则表达式,我认为它仅与函数调用中的一个关键字匹配。我需要它来匹配所有人

–user1685095
16 Mar 4 '16 at 10:16

@ user1685095:是的,您是对的,我的模式不好。我将尝试改善它并编辑我的答案。

–statox♦
16 Mar 4 '16 at 10:23

#4 楼

我发现@Wolfie的答案捕获了元组的展开作为关键字,并且捕获行中断的关键字参数也遇到了麻烦。

受他的正则表达式启发,我想到了以下内容来放入我的python.vim语法文件。 (请记住,我最初使用的是来自sheerun / vim-polyglot的python.vim语法文件)。

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


请注意,这不会为写为key = value的关键字参数加色。我认为这是一件好事,因为它与关键字参数的官方PEP-8空格建议背道而驰。

#5 楼

笔者接受的答案为我打破了函数自变量列表中字符串的突出显示(根据我不知道的炼金术),所以这是一个基于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-10-15在17:21

没关系;如果有人遇到了同样的问题,我也希望他们可以在这里偷看。

– Wolfie
16-10-15在17:25