Python 在vim中突出显示不匹配的括号
在vim中编写python代码时,我反复被不匹配的括号所困扰。我喜欢C代码的处理方式——vim用红色突出显示了无可匹敌的paren后面的所有花括号。我简要地查看了Python 在vim中突出显示不匹配的括号,python,vim,syntax-highlighting,Python,Vim,Syntax Highlighting,在vim中编写python代码时,我反复被不匹配的括号所困扰。我喜欢C代码的处理方式——vim用红色突出显示了无可匹敌的paren后面的所有花括号。我简要地查看了c.vim语法文件,试图理解它,但是处理括号错误的部分非常复杂。有人能解释一下代码是如何工作的,并建议我如何为python代码编写类似的东西吗 具有不匹配参数的示例C代码: int main(void { /* brace highlighted in red */ } /* brace highlighted in red */
c.vim
语法文件,试图理解它,但是处理括号错误的部分非常复杂。有人能解释一下代码是如何工作的,并建议我如何为python代码编写类似的东西吗
具有不匹配参数的示例C代码:
int main(void
{ /* brace highlighted in red */
} /* brace highlighted in red */
因为python代码没有大括号来突出显示,所以我们必须选择其他内容(可能是其他括号)
顺便说一句,我试过了,但我对自己的行为不满意
编辑:
我使用Python生成C++代码(一个喜欢圆括号和分号的语言)。我有一个讨厌的习惯,就是把后面的paren留在
file.write()
方法调用中。如果我能让vim在视觉上更明显地犯下这个错误,那就太好了
更新:
好的,这是我到目前为止试过的
:syn region pParen transparent start="(" end=")" contains=ALL
:syn match pError display ")"
:hi def link pError Error
不幸的是,所有这些都只是将所有平衡的括号中的右括号作为错误突出显示,这与我想做的相反。我真的不明白我在这里做什么(只是复制了现有的C语法文件)。如果有人能解释我做错了什么,我将不胜感激。权宜之计:
:imap ( ()<C-[>i
:imap(()i
这样,每次您键入左括号时,它都会自动将您置于右侧,并将您置于中间键入的位置。您可以让vim执行相反的操作:执行 :设置showmatch 它会突出显示匹配的参数。当它没有突出显示某个内容时,你就会知道你是不平衡的
我还假设您熟悉“%”命令,它会将您跳转到匹配的元素。不确定它是否会让您或多或少感到困惑,但您可以查看
lisp.vim
语法文件(特别是处理g:lisp\u rainbow
的部分),看看如何突出显示匹配的参数
如果您设法高亮显示所有匹配的参数,则可能会使剩余的参数(即不匹配的参数)具有默认错误高亮显示。这就是lisp文件似乎正在执行的操作
编辑:这个怎么样:
如果您清除:syn
并运行这些命令,它似乎会起作用。请注意执行syn
命令的顺序很重要。根据:h:syn priority
,最后匹配的规则将生效,这可能是您的规则突出显示文件中所有结束参数的原因
编辑#2:
c.vim实际上所做的是突出显示()
内部的任何{}
,无论所有内容是否正确关闭。尝试在c模式下键入({})
,它仍然突出显示{}
作为错误
我不认为这种方法可以直接用于测试(
具有不匹配的)
,因为:syn region
不关心结束模式是否存在
因此,你必须找到一些Python特有的东西,这些东西永远不应该属于()
。然后与“(\\\\\[^)]*相匹配。我对Python的了解还不够,不知道那可能是什么
如果没有其他方法,您可以执行以下操作:
syn match openParen "(\_[^)]*\%$"
它匹配一个在文件结尾之前没有关闭参数的打开参数。如果它找到任何关闭参数,它将失败,这意味着它甚至不会捕获()
作为一种解决方法,我在vim网站上发现,它应该在缩进Python代码方面做得更好。当你用不平衡的paren结束一行时,它会缩进下一行,使之与打开的paren对齐。如果我理解正确,并且你试图查看C代码中不匹配的括号(这是在Python中生成的),我建议您从安装rainbow.vim。这将根据缩进级别以不同颜色突出显示括号,并根据您的要求以红色突出显示不匹配的括号。屏幕截图
要安装,请下载rainbow.vim
并将其放入vimfiles/after/syntax/c/
(如果不存在此目录,请创建此目录)
在Linux上,这将是~/.vim/after/syntax/c/rainbow.vim
在Windows上,它可能是c:\vim\vimfiles\after\syntax\c\rainbow.vim
或其他地方,请参阅:help runtimepath
请注意,有些插件与rainbow.vim
冲突,但要让它们合作并不难
如果您试图在python代码中突出显示不匹配的括号,您可以修改rainbow.vim以使用python语法集群而不是C语法集群,但这涉及的内容稍微多一些,但您可以使用(Dr Chip彩虹代码的修改版本):
编辑:
作为测试,我从(这些是Vim 7.0的Windows版本)下载了gvim70.zip和vim70rt.zip。我将这两个文件解压缩到一个新目录中,并从Vim/vim70/gvim.exe
运行gvim.exe
。我没有任何Vim配置存储在“C:\Documents and Settings”中,因此运行这个vim与运行“香草”配置是一样的。然后我从下载了pyprint.py
作为一段示例代码,并将上面的代码复制到一个名为code.vim的文件中。在gVim中,我输入了:e pyprint.py
。它在白色背景窗口中打开,没有突出显示语法。然后输入了:syntax on
,它打开了默认语法高亮显示。我在第8行添加了第二个)
字符。最后,我输入了:source code.vim
,这使得第二个)
字符以红色高亮显示
我也在Linux上执行了这个测试(使用Vim 7)。
syn match openParen "(\_[^)]*\%$"
syn cluster pyParenGroup contains=pythonString,pythonRawString,pythonEscape,pythonNumber,pythonBuiltin,pythonException
syn match pyParenError display ')'
syn region pyParen transparent matchgroup=hlLevel0 start='(' end=')' contains=@pyParenGroup,pyParen1
syn region pyParen1 transparent matchgroup=hlLevel1 start='(' end=')' contains=@pyParenGroup,pyParen2
syn region pyParen2 transparent matchgroup=hlLevel2 start='(' end=')' contains=@pyParenGroup,pyParen3
syn region pyParen3 transparent matchgroup=hlLevel3 start='(' end=')' contains=@pyParenGroup,pyParen4
syn region pyParen4 transparent matchgroup=hlLevel4 start='(' end=')' contains=@pyParenGroup,pyParen5
syn region pyParen5 transparent matchgroup=hlLevel5 start='(' end=')' contains=@pyParenGroup,pyParen6
syn region pyParen6 transparent matchgroup=hlLevel6 start='(' end=')' contains=@pyParenGroup,pyParen7
syn region pyParen7 transparent matchgroup=hlLevel7 start='(' end=')' contains=@pyParenGroup,pyParen8
syn region pyParen8 transparent matchgroup=hlLevel8 start='(' end=')' contains=@pyParenGroup,pyParen9
syn region pyParen9 transparent matchgroup=hlLevel9 start='(' end=')' contains=@pyParenGroup,pyParen
hi link pyParenError Error
if &bg == "dark"
hi default hlLevel0 ctermfg=red guifg=red1
hi default hlLevel1 ctermfg=yellow guifg=orange1
hi default hlLevel2 ctermfg=green guifg=yellow1
hi default hlLevel3 ctermfg=cyan guifg=greenyellow
hi default hlLevel4 ctermfg=magenta guifg=green1
hi default hlLevel5 ctermfg=red guifg=springgreen1
hi default hlLevel6 ctermfg=yellow guifg=cyan1
hi default hlLevel7 ctermfg=green guifg=slateblue1
hi default hlLevel8 ctermfg=cyan guifg=magenta1
hi default hlLevel9 ctermfg=magenta guifg=purple1
else
hi default hlLevel0 ctermfg=red guifg=red3
hi default hlLevel1 ctermfg=darkyellow guifg=orangered3
hi default hlLevel2 ctermfg=darkgreen guifg=orange2
hi default hlLevel3 ctermfg=blue guifg=yellow3
hi default hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
hi default hlLevel5 ctermfg=red guifg=green4
hi default hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
hi default hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
hi default hlLevel8 ctermfg=blue guifg=darkslateblue
hi default hlLevel9 ctermfg=darkmagenta guifg=darkviolet
endif
cd ~
mv .vimrc old_dot_vimrc
mv .gvimrc old_dot_gvimrc
mv .vim old_dot_vim
vim pyprint.py
:e pyprint.py
" Add extra bracket here!
:syntax on
:source code.vim