我正在努力学习vim正则表达式(我也不太了解其他正则表达式),所以主要问题是定义匹配的正则表达式
some_function_call(simple_value, keyword=value)
此示例中的关键字。
因此,如果它在括号内并且后跟等号,则应该匹配一个单词。
下一个问题是如何在vim中定义语法文件。我很乐意为此提供帮助,但是学习起来应该不难,所以我可以自己做。
根据答案进行编辑我已经为python编写了自己的语法脚本。随时尝试。 在此处输入链接说明
我正在努力学习vim正则表达式(我也不太了解其他正则表达式),所以主要问题是定义匹配的正则表达式
some_function_call(simple_value, keyword=value)
此示例中的关键字。
因此,如果它在括号内并且后跟等号,则应该匹配一个单词。
下一个问题是如何在vim中定义语法文件。我很乐意为此提供帮助,但是学习起来应该不难,所以我可以自己做。
根据答案进行编辑我已经为python编写了自己的语法脚本。随时尝试。 在此处输入链接说明
Answers:
使用以下设置:
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
pythonBuiltin
在默认语法组中列出syntax/python.vim
。然而,它并没有功能和内置变量区分(True
,False
并且None
也在pythonBuiltin
)。您可能会复制定义以供使用。
query(...).***filter***()
filter突出显示时,它与内置的filter函数无关。
syntax.vim
确实使它们成为关键字。见github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
syntax/python.vim
文件(只有默认文件,并且看不到您的行为:i.stack.imgur.com/LgF6F.png,我同意关键字定义-这是最接近的定义,我不要以为关键字在情况下,像匹配的nonkeyword.keyword
。至于变量,注意这些建宏是包含函数对象的变量,它们是变量,并且可以被分配到就像任何其他变量。没有什么能阻止你做sorted = filter
,然后使用sorted
类似filter
。
除了@ 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
我发现@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空白建议相反。
将如此的书写接受的答案打破了高亮内部函数参数列表字符串,我(通过炼金术什么我不知道),所以这里是一个希望更安全的版本,基于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
最后的检查将停止对有条件的着色。您可以根据需要删除它。