Destacando los paréntesis inigualables en vim

Me estoy quemando repetidamente con paréntesis incomparables mientras escribo el código de Python en vim. Me gusta cómo se manejan para el código C: vim resalta en rojo todas las llaves que siguen a la paren incomparable. Miré el archivo de syntax c.vim brevemente para tratar de entenderlo, pero la sección que maneja los errores de corchetes es muy compleja. ¿Alguien puede explicar cómo funciona ese código y sugerirme cómo podría escribir algo similar para el código de Python?

Ejemplo de código C con parentes inigualables:

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

Dado que el código de Python no tiene llaves para resaltar, tendremos que elegir otra cosa (quizás otros paréntesis).

Por cierto, probé este plugin vim pero no estaba contento con el comportamiento.

Editar:

Estoy usando python para generar código C ++ (un lenguaje al que le gustan los paréntesis y los puntos y coma). Tengo la mala costumbre de dejar el paréntesis final de una llamada al método file.write() . Sería bueno si pudiera hacer que vim hiciera ese error más obvio visualmente.

Actualizar:

Ok, esto es lo que he intentado hasta ahora.

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

Desafortunadamente, todo esto es resaltar como un error el paréntesis correcto de todos los paréntesis equilibrados , lo opuesto a lo que quiero hacer. Realmente no entiendo lo que estoy haciendo aquí (solo copiado del archivo de syntax C existente). Si alguien pudiera explicar lo que hice (mal), lo agradecería.

Si lo comprendo correctamente y está intentando ver paréntesis no coincidentes en el código C (generado en Python), le recomendaría que instale rainbow.vim desde el sitio del Dr. Chip . Esto resaltará los frenos en diferentes colores según los niveles de sangría y resaltará los frenos no coincidentes en rojo según lo haya solicitado. Una captura de pantalla http://img294.imageshack.us/img294/8586/rainbow.jpg http://img294.imageshack.us/img294/8586/rainbow.jpg

Para instalar, descargue rainbow.vim y colóquelo en vimfiles/after/syntax/c/ (cree este directorio si no está presente).

En Linux, esto será ~/.vim/after/syntax/c/rainbow.vim

En Windows, puede ser c:\vim\vimfiles\after\syntax\c\rainbow.vim o posiblemente en otro lugar, consulte :help runtimepath .

Tenga en cuenta que hay algunos complementos que entran en conflicto con rainbow.vim , pero no es demasiado difícil hacer que cooperen.

Si está tratando de resaltar paréntesis no coincidentes en el código de Python, puede modificar rainbow.vim para usar los grupos de syntax de Python en lugar de los C, pero esto es un poco más complicado, pero podría usar algo en la línea de (Versión modificada del código del arco iris del Dr. 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 

EDITAR:

Como prueba, descargué gvim70.zip y vim70rt.zip desde ftp://ftp.vim.org/pub/vim/pc/ (estas son las versiones de Windows de Vim 7.0). Descomprimí los dos archivos en un nuevo directorio y ejecuté gvim.exe desde vim/vim70/gvim.exe . No tengo ninguna configuración de vim almacenada en “C: \ Documents and Settings”, por lo que ejecutar este vim es lo mismo que ejecutar una configuración “vainilla”. Luego descargué pyprint.py de amk.ca/python/simple/pyprint.html como una pieza de código de muestra y copié el código anterior en un archivo llamado code.vim. En gVim, entré :e pyprint.py . Se abrió en la ventana de fondo blanco, sin resaltado de syntax. Luego ingresé :syntax on activada, que activó el resaltado de syntax predeterminado. :source code.vim un segundo carácter en la línea 8. Finalmente, :source code.vim , lo que hizo que el segundo carácter se destacara en rojo.

También he realizado esta prueba en Linux (con Vim 7.2), ingresando la siguiente secuencia de comandos:

 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 

De nuevo, el segundo corchete se resalta y todo lo demás parece normal.

Puedes conseguir que vim haga lo contrario: haz una

: establecer showmatch

y se destacará parens coincidentes. Sabrás cuándo estás desequilibrado cuando no resalta algo.

También asumo que estás familiarizado con el comando ‘%’, que te devuelve al elemento correspondiente.

Solución de la brecha de parada

 :imap ( ()i 

Esto lo hará así que cada vez que escribas un paren izquierdo se colocará automáticamente en la derecha y te pondrá en la posición de escribir entre.

No estoy seguro de si será más o menos confuso para ti, pero puedes mirar el archivo de syntax lisp.vim (especialmente la parte donde se maneja g:lisp_rainbow ) para ver cómo puedes resaltar los parens coincidentes.

Si logra resaltar todos los parens coincidentes, puede hacer que los parens sobrantes (es decir, parens no coincidentes) tengan un resaltado de error predeterminado. Esto es lo que parece estar haciendo el archivo lisp.

EDIT: ¿Qué tal esto:

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

Si usted :syn clear y ejecuta esos, parece funcionar. Tenga en cuenta que el orden en que se ejecutan los comandos de syn es importante. Por :h :syn-priority , la regla que coincide con la última es la que surte efecto, y puede ser la razón por la que sus reglas resaltaron todos los paréntesis finales del archivo.

EDITAR # 2:

Lo que realmente está haciendo c.vim es resaltar cualquier {} dentro de () , ya sea que todo esté bien cerrado o no. Intente escribir ({}) en modo C, aún resalta {} como un error.

No creo que este enfoque pueda usarse para probar directamente ( con un incomparable ) , porque a la :syn region no le importa si el patrón final está ahí o no.

Así que tienes que encontrar algo específico de Python que nunca debe pertenecer a () . Luego empareja contra "(\_[^)]*the_forbidden_something" . No sé lo suficiente de Python para saber qué podría ser eso.

Si nada más, puedes hacer:

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

que coincide con un parén abierto sin paréntes de cierre antes del final del archivo. Esto falla si encuentra algún paren de cierre, lo que significa que ni siquiera capturará (() .

¿Has intentado usar matchit.vim ? Es compatible con todo tipo de coincidencias, y debería funcionar en Python.

Como solución alternativa, encontré esta secuencia de comandos de sangría en el sitio web de vim que supuestamente hace un mejor trabajo de sangrar el código de Python. Cuando finaliza una línea con paréntes desbalanceados, sangra la siguiente línea para alinearse con el parén abierto.

El plugin vim-matchopen hace lo que buscas


Los cambios de color de relieve en función de su esquema de color