14

在 vim 中编写 python 代码时,我被不匹配的括号反复烧伤。我喜欢它们在 C 代码中的处理方式——vim 以红色突出显示不匹配括号后面的所有花括号。我c.vim简要地查看了语法文件以试图理解它,但处理括号错误的部分非常复杂。谁能解释该代码的工作原理并建议我如何为 python 代码编写类似的东西?

带有不匹配括号的示例 C 代码:

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

由于 python 代码没有要突出显示的花括号,因此我们必须选择其他内容(可能是其他括号)。

顺便说一句,我尝试了这个 vim 插件,但我对这种行为不满意。

编辑:

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

更新:

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

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

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

4

7 回答 7

8

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

:set showmatch

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

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

于 2009-02-12T21:55:23.577 回答
6

如果我理解正确并且您正在尝试查看 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 语法集群,但这有点复杂,但您可以使用类似的东西(奇普博士彩虹代码的修改版):

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.zipvim70rt.zip(这些是 Vim 7.0 的 Windows 版本)。我将这两个文件解压缩到一个新目录并从. 我没有存储在“C:\Documents and Settings”中的任何 vim 配置,所以运行这个 vim 与运行“vanilla”配置相同。然后,我从amk.ca/python/simple/pyprint.html下载了一段示例代码,并将上述代码复制到名为 code.vim 的文件中。在 gVim 中,我输入了. 它在白色背景窗口中打开,没有语法突出显示。然后我进入gvim.exevim/vim70/gvim.exepyprint.py: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

再次,第二个括号突出显示,其他一切似乎正常。

于 2009-03-02T14:07:48.780 回答
4

止损解决方案:

:imap ( ()<C-[>i

这将使得每次您键入左括号时,它都会自动放入右侧并让您处于键入之间的位置。

于 2009-02-12T21:52:21.647 回答
3

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

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

编辑:这个怎么样:

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

如果你:syn clear运行这些,它似乎工作。请注意,syn命令的执行顺序很重要。Per ,最后:h :syn-priority匹配的规则是生效的规则,这可能是您的规则突出显示文件中所有结尾括号的原因。

编辑#2:

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

我认为这种方法不能用于直接测试 a(与 unmatched ),因为:syn region不关心结束模式是否存在。

因此,您必须找到不应该属于 Python 的特定内容()。然后与"(\_[^)]*the_forbidden_something". 我对 Python 的了解还不够,无法知道那可能是什么。

如果不出意外,你可以这样做:

syn match openParen "(\_[^)]*\%$"

它与文件结尾之前没有闭合括号的开放括号匹配。如果它根本找不到任何关闭的括号,这将失败,这意味着它甚至不会 catch (()<EOF>

于 2009-02-12T22:54:55.633 回答
1

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

于 2009-03-02T14:51:30.610 回答
0

作为一种解决方法,我在 vim 网站上发现了这个缩进脚本,据说它在缩进 Python 代码方面做得更好。当您以不平衡的括号结束一行时,它会缩进下一行以与开放的括号对齐。

于 2009-02-19T16:33:47.077 回答
0

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


突出显示颜色会根据您的配色方案而变化

于 2016-06-17T16:15:19.867 回答