在vim中突出显示无与伦比的括号

时间:2009-02-12 19:47:24

标签: python vim syntax-highlighting

在vim中编写python代码时,我被无法比拟的括号反复烧毁。我喜欢他们为C代码处理它们的方式 - 在无与伦比的paren之后的所有花括号中的红色vim亮点。我简要地查看了c.vim语法文件以尝试理解它,但处理括号错误的部分非常复杂。任何人都可以解释该代码是如何工作的,并建议我如何为python代码编写类似的内容?

具有不匹配的parens的示例C代码:

int main(void
{  /* brace highlighted in red */
}  /* brace highlighted in red */

由于python代码没有花括号可以突出显示,我们必须选择其他东西(也许是其他括号)。

BTW,我试了this vim plugin,但我对这种行为不满意。

编辑:

我正在使用python生成C ++代码(一种喜欢括号和分号的语言)。我有一个令人讨厌的习惯,即在file.write()方法调用中离开尾随的paren。如果我能让vim更明显地犯这个错误,那就太好了。

更新

好的,这是我到目前为止所尝试过的。

:syn region pParen transparent start="(" end=")" contains=ALL
:syn match pError display ")"
:hi def link pError Error

不幸的是,所有这一切都是突出显示所有平衡括号的正确错误,与我想做的相反。我真的不明白我在这里做什么(只是复制了现有的C语法文件)。如果有人能解释我的所作所为(错误),我将不胜感激。

7 个答案:

答案 0 :(得分:8)

你可以让vim做相反的事情:做一个

  

:设置showmatch

它将突出显示匹配的parens。当你没有突出显示某些东西时,你会知道你什么时候不平衡。

我也假设您熟悉'%'命令,它会将您弹回匹配元素。

答案 1 :(得分:4)

停止差距解决方案:

:imap ( ()<C-[>i

这样每次你输入一个左边的按钮时它会自动放入右边并让你处于两者之间的输入位置。

答案 2 :(得分:4)

如果我理解正确并且您正在尝试查看C代码中的不匹配括号(在python中生成),我建议您从Dr Chip's Site安装rainbow.vim。这将根据缩进的高度突出显示不同颜色的大括号,并根据您的要求以红色突出显示不匹配的大括号。屏幕截图http://img294.imageshack.us/img294/8586/rainbow.jpg http://img294.imageshack.us/img294/8586/rainbow.jpg

要安装,请下载 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语言集群,但这有点复杂,但你可以使用(Chip Chip的彩虹代码的修改版本):

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

编辑:

作为测试,我从ftp://ftp.vim.org/pub/vim/pc/下载了 gvim70.zip vim70rt.zip (这些是Vim 7.0的Windows版本)。我将这两个文件解压缩到一个新目录,然后从gvim.exe运行vim/vim70/gvim.exe。我将任何vim配置存储在“C:\ Documents and Settings”中,因此运行此vim与运行“vanilla”配置相同。然后我从amk.ca/python/simple/pyprint.html下载pyprint.py作为示例代码,并将上述代码复制到名为code.vim的文件中。在gVim中,我输入了:e pyprint.py。它在白色背景窗口中打开,没有语法突出显示。然后我输入:syntax on,它会切换默认语法高亮显示。我在第8行添加了第二个)字符。最后,我输入了:source code.vim,这使得第二个)字符以红色突出显示。

我还在Linux(使用Vim 7.2)上执行了此测试,输入以下命令序列:

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

同样,第二个括号突出显示,其他一切看似正常。

答案 3 :(得分:2)

不确定它是否会或多或少让您感到困惑,但您可以查看lisp.vim语法文件(尤其是处理g:lisp_rainbow的部分)以了解如何突出显示匹配括号。

如果你设法突出显示所有匹配的parens,你可以让剩余的parens(即不匹配的parens)具有默认的Error突出显示。这就是lisp文件似乎正在做的事情。

编辑:这个怎么样:

syn match parenError ")"
syn region matchingParens transparent start="(" end=")" contains=matchingParens
hi parenError guifg=red

如果你:syn clear并运行它们,它似乎有效。请注意,执行syn命令的顺序很重要。根据{{​​1}},匹配最后的规则是生效的规则,这可能是您的规则突出显示文件中所有最终结果的原因。

编辑#2:

c.vim实际上正在做的是突出显示:h :syn-priority内的任何 {},无论一切是否正确关闭。尝试在C模式下键入(),它仍然会将({})突出显示为错误。

我认为这种方法不能用于直接测试{}(无法匹配的问题,因为)并不关心最终模式是否存在或不

所以你必须找到一些特定于Python的东西,它们永远不属于:syn region。然后匹配()。我不太了解Python,不知道那可能是什么。

如果没有别的,你可以这样做:

"(\_[^)]*the_forbidden_something"

匹配一个打开的paren,在文件结束之前没有关闭的parens。如果它找到任何关闭窗口,则会失败,这意味着它甚至不会捕获syn match openParen "(\_[^)]*\%$"

答案 4 :(得分:1)

您是否尝试过使用matchit.vim?它支持各种匹配,应该在Python中工作。

答案 5 :(得分:0)

作为一种解决方法,我在vim网站上找到this indent script,据说可以更好地缩进Python代码。当你用不平衡的parens结束一条线时,它会缩进下一行以与开放的paren对齐。

答案 6 :(得分:0)

插件vim-matchopen可以满足您的需求


高光颜色根据您的colorscheme

而变化