Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在vim中突出显示不匹配的括号_Python_Vim_Syntax Highlighting - Fatal编程技术网

Python 在vim中突出显示不匹配的括号

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 */

在vim中编写python代码时,我反复被不匹配的括号所困扰。我喜欢C代码的处理方式——vim用红色突出显示了无可匹敌的paren后面的所有花括号。我简要地查看了
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.zipvim70rt.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