Afeitando Yaks: septiembre 22, 2009
Este yak está quedando bonito.
Para mi segunda pila de pelo de yak: convertir QPlainTextEdit en un widget de edición aceptable para programadores. A medida que el trabajo avanzaba en mi editor de rst2pdf (de paso: necesito un nombre!), se volvió evidente que la parte de la interface en la que el usuario pasa más tiempo es un simple par de editores de texto.
Qt viene con un widget para eso, por supuesto, llamado QPlainTextEdit. Sin embargo, es muy, muy malo para prpgramadores.
Éstos son mis requerimientos mínimos:
Resaltado de sintaxis para dos lenguajes: restructured text y javascript. Este yak ya está afeitado.
Números de línea.
Resaltar la línea actual.
Resaltar errores cuando tiene sentido (por ejemplo, en el stylesheet)
Una forma de lograr esto sería descartar QPlainTextEdit y usar QSciScintilla que es la base para el editor de código en eric y (en otra versión) para scite.
Sin embargo, sufro un bug en QSciScintilla, donde no puedo escribir ¡caracteres con acento!. Sin eso el castellano es imposible, y el bug parece tener como dos años, así que ... no va.
¿Entonces, logré esos features? ¡Sí!
Acá está el video (sí, me volví adicto a hacer estos, ya que qt-reordmydesktop lo hace demasiado fácil ;-):
La base para esto es el ejemplo Code Editor que viene con Qt mismo, más un poquito de trabajo.
Primero, porté Code Editor de C++ a Python, que fué fácil y llevó solo unos minutos. Eso se encargó de los puntos 2 y 3.
Entonces enchufé el resaltado de sintaxis, que era el punto 1.
¿Y que pasó con la validación de javascript en tiempo real? Fácil usando simplejson. Hay que correr esto cada vez que se quiere validar (yo lo corro en cada tecla que se presiona).
Hay que reemplazar self.ui.style.toPlainText por el nombre de tu widget, por supuesto:
def validateStyle(self): style=unicode(self.ui.style.toPlainText()) #no point in validating an empty string if not style.strip(): return pos=None try: json.loads(style) except ValueError, e: s=str(e) print s if s == 'No JSON object could be decoded': pos=0 elif s.startswith('Expecting '): pos=int(s.split(' ')[-1][:-1]) else: print 'UNKNOWN ERROR' # This makes a red bar appear in the line # containing position pos self.ui.style.highlightError(pos)
highlightError(pos)
almacena pos en el Code Editor, qie dibuja una barra roja en esa linea, de la misma forma que resalta la linea actual.
Y eso es todo. Éste es el código para codeeditor.py
Se me ocurrió un nombre muymuymuy feo:
FaltaYRst2 (se leería: falta y restu)
Tenes razón es muy feo! :-D
Yo te avise =)
Hi,
I had made a Text Editor with Qt a long time ago. It has line numbers, snippets, custom syntax highlighting rules, and some more things.
I don't use Python anymore, but you may check the sources here :
http://kib2.free.fr/PyK/
Unfortunatly I had to stop it and there was a compatibilty issue with a new Qt versions. So the code won't run, but the editor sources are good.
Also, I noticed speed problems with big files.
Hope it helps.
@kib2 that's **very** impressive!
Hi Roberto,
thanks! Just do whatever you want with it.
See you:
Kib².