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