在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语法文件)。如果有人能解释我的所作所为(错误),我将不胜感激。
答案 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}},匹配最后的规则是生效的规则,这可能是您的规则突出显示文件中所有最终结果的原因。
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