vimrc indent python vim syntax-highlighting

python - indent - Destacando soportes sin igual en vim



vim python-mode (7)

Puedes hacer que vim haga lo contrario: haz un

: establecer showmatch

y resaltará los paréntesis correspondientes. Sabrá cuándo está desequilibrado cuando no resalta algo.

También estoy asumiendo que está familiarizado con el comando ''%'', que lo lleva al elemento correspondiente.

Me quemo repetidamente por paréntesis sin igual mientras escribo el código python en vim. Me gusta cómo se manejan para el código C - resalta vim en rojo todas las llaves después del paréntesis sin igual. Miré brevemente el archivo de sintaxis c.vim para tratar de comprenderlo, pero la sección que maneja los errores del corchete es muy compleja. ¿Alguien puede explicar cómo funciona ese código y sugerir cómo podría escribir algo similar para el código python?

Código de ejemplo C con parens sin parentesco:

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

Como el código 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 que le gusta paréntesis y punto y coma). Tengo la desagradable costumbre de dejar la paren posterior fuera de una llamada al método file.write() . Sería bueno si pudiera hacer que vim hiciera más evidente visualmente ese error.

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 lo que hace es resaltar como un error la paren derecha de todos los paréntesis equilibrados , lo contrario de lo que quiero hacer. Realmente no entiendo lo que estoy haciendo aquí (simplemente copiado del archivo de sintaxis C existente). Si alguien pudiera explicar lo que hice (mal), lo agradecería.


Solución de detención de brecha:

:imap ( ()<C-[>i

Esto hará que cada vez que escribas un paréntesis izquierdo, se coloque automáticamente en el derecho y te coloque en la posición de escribir entre ellos.


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


No estoy seguro de si será más o menos confuso para usted, pero podría consultar el archivo de sintaxis lisp.vim (especialmente la parte donde se maneja g:lisp_rainbow ) para ver cómo puede resaltar los paréntesis correspondientes.

Si logra resaltar todos los parens coincidentes, podría tener los paréntesis restantes (es decir, paréntesis no coincidentes) con resaltado de error predeterminado. Esto es lo que el archivo lisp parece estar haciendo.

EDITAR: ¿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 que funciona. Tenga en cuenta que el orden en que se ejecutan los comandos syn es importante. Per :h :syn-priority , la regla que coincide con last es la que tiene efecto, que puede ser la razón por la cual las reglas resaltaron todas las pares finales en el archivo.

EDIT # 2:

Lo que c.vim realmente está haciendo es resaltar cualquier {} dentro de () , si todo está bien cerrado o no. Intente escribir ({}) en el modo C, todavía resalta {} como un error.

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

Entonces debes encontrar algo específico de Python que nunca debería pertenecer dentro () . Luego "(/_[^)]*the_forbidden_something" coincidir contra "(/_[^)]*the_forbidden_something" . No conozco a Python lo suficiente como para saber qué podría ser eso.

Si nada más, puedes hacer:

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

que coincide con un paréntesis abierto sin paréntesis de cierre antes del final del archivo. Esto falla si encuentra alguna paren de cierre, lo que significa que ni siquiera capturará (()<EOF> .


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


Si lo entiendo correctamente y está tratando de ver paréntesis que no coinciden en el código C (que se generó en python), le recomendaría instalar rainbow.vim desde el sitio de Dr Chip . Esto resaltará las llaves en diferentes colores dependiendo de los niveles de sangría y resaltará las llaves que no coinciden en rojo como lo solicitó. 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 hacerlos cooperar.

Si intenta resaltar paréntesis que no coinciden en el código python, puede modificar rainbow.vim para usar los clústeres de sintaxis python en lugar de los C, pero esto es un poco más complicado, pero podría usar algo similar a (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 de 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 vim almacenada en "C: / Documents and Settings", por lo que ejecutar este vim es lo mismo que ejecutar una configuración ''vanilla''. Luego descargué pyprint.py de amk.ca/python/simple/pyprint.html como un fragmento de código de muestra y copié el código anterior en un archivo llamado code.vim. En gVim, ingresé :e pyprint.py . Se abrió en la ventana de fondo blanco, sin resaltado de sintaxis. Luego ingresé :syntax on activada, que cambió el resaltado de sintaxis predeterminado. :source code.vim un segundo ) carácter en la línea 8. Finalmente, :source code.vim , que hizo que el segundo carácter se resalte en rojo.

También realicé esta prueba en Linux (con Vim 7.2), ingresando la siguiente secuencia de comando:

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 paréntesis se resalta y todo lo demás parece normal.


El plugin vim-matchopen hace lo que estás buscando


Los cambios de color de resaltado se basan en su esquema de colores