miércoles, 23 de agosto de 2017

Mini-mapas en ZinjaI

En los últimos tiempos he visto cómo se ha popularizado una funcionalidad entre los editores de texto modernos: el mini-mapa, una vista en miniatura del código fuente. Se supone que sirve para ir rápidamente a alguna parte del archivo. Hasta ahora pensaba que agregar eso en ZinjaI iba a ser muy complicado, pero hace unos días encontré una idea muy simple en un foro.

Primero hablemos de la funcionalidad en sí. Siempre pensé que era puro "eye candy" (no me gusta abusar del inglés, ¿alguien conoce una buena forma de decir eso en castellano para la próxima?), pero ahora empiezo a dudarlo. En principio creo que no es mucho lo que se puede distinguir en una miniatura semejante. En el mejor de los casos, con el coloreado de sintaxis activado, puedo decir cosas como "esa mancha verde del principio es la zona de los includes", pero no sé si mucho más. Algunos amigos y colegas que lo usan me cuentan que es de esas cosas que uno no sabe que quiere, pero que cuando se acostumbran las usan y luego las extrañan si no están.

Resultados de una búsqueda rápida de imágenes en google: Eplipse, Sublime, Atom, Evince, KWrite... todos con su minimap.

Por otro lado, pensé que personalmente me iba a ser imposible agregarlo en ZinjaI, porque en ZinjaI dependo 100% de una biblioteca que se llama scintilla para el coloreado y renderizado del fuente. Más aún, no la uso directamente sino a través de un wrapper de wxWidgets, y encima, por el problema ansi/unicode que ya mencioné mil veces, momentáneamente de una versión muy vieja de ambos. Y para implementar algo así de forma razonablemente eficiente, hay que meterse ahí adentro. No es que sea imposible... la biblioteca tiene un diseño muy coherente y un código bastante accesible. Pero requiere tiempo. Y además, ni se justifica hacerlo contra una versión vieja.

Sin embargo, en una búsqueda muy rápida para ver si las actualizaciones de scintilla ya incluían algo de esto, me encuentro con alguien en un foro sugiriendo que duplique el control que renderiza el código y le aplique un zoom ridículamente chico al segundo. Duplicarlo es posible, scintilla está preparado para eso, y de hecho lo uso en la funcionalidad "duplicar vista" del menú contextual de la ventana de código. Así que de ahí a tunear un poco la apariencia del duplicado para que parezca una miniatura, en principio, hay poca cosa.

Esta no es una buena solución, ya que scintilla no está optimizado para esto. No es el caso de uso esperado el de mostrar cientos de lineas en un solo pantallazo, o el de renderizar con fuentes de 1 punto. Entonces surgen problemas.

Primero el de eficiencia... Es más lento de lo que debería tratar a la miniatura como otra vista "estándar" del código. Sería mejor considerarla una imagen, renderizar puntos y lineas de colores en lugar de glifos complicados, bajar la frecuencia de actualización, etc. Todo esto scintilla no lo hace, así que por ahora el soporte en ZinjaI es sub-óptimo. Yo lo empiezo a notar un poco pesado cuando abro el fuente más grande y feo del propio ZinjaI, que tiene unas 5000 lineas. Pero es una notebook bastante viejita, no creo que sea un problema en una PC moderna, ni que sea frecuente tener fuentes tan grandes. Igual detesto mucho que un "simple" editor de texto consuma tanta CPU, pero por ahora es lo que hay para salir del paso.

Primera implementación del mini-mapa en ZinjaI funcionando. De pasó probé en mi código una idea interesante para aprovecharlo mejor.

Luego está el tema de que no puedo tunear al 100% la apariencia. Por ejemplo, no puedo reducir el tamaño de la fuente a menos de 2 puntos. Al menos en la versión que uso, en ese caso scintilla a veces se cuelga. Leí un poco el fuente de scintilla y encontré esto en un comentario, y lo comprobé. Y con un tamaño de 2 puntos, el mapa realmente no muestra mucho; en códigos largos necesita muchos scroll y pierde su sentido. Hice algún parche en scintilla para reducirlo un poco más, a 1 punto, y se pone algo más usable, pero mientas no actualice wx no podré ir mucho más allá.

Por todos estos "peros" que mencioné es que la nueva funcionalidad vendrá desactivado por defecto y marcada como "experimental". Pero al menos podrán empezar a probarla y creo que en la mayoría de los casos se comportará lo suficientemente bien como para utilizarla regularmente. Yo mientras, la voy a probar también, y veré si de verdad cuando me acostumbre se torna imprescindible.

2 comentarios:

  1. Es cierto que muchas personas ven como indispensable el Mini-Mapa.
    Para mis gustos prefiero no usarlo, con la barra de desplazamiento tengo suficiente.
    Si busco una parte en especial del código creo que hay mejores opciones que ocupar parte de tu pantalla en una copia de la vista del código con un tamaño reducido.
    Por ejemplo encuentro mas útil un explorador de esquema del código, "Outline", aunque también lo mantendría oculto je.
    Para mi, una mejor opción es simplemente añadir un resaltado en la barra de desplazamiento al buscar una palabra. Por ejemplo Chrome hace esto.

    También comparto tu idea que es innecesario usar Ingles para todo.
    Es bueno aprenderlo, pero también es bueno aprender a expresarse completamente Español, Right? Btw, la palabra que buscas es 'Floritura' seguramente je.

    ResponderEliminar
  2. El minimapa me parece espectacular, pero también adhiero a que el resaltado en la barra de desplazamiento, de las ocurrencias de la palabra seleccionada, es más útil. Incluso para las búsquedas, también sería bueno. Saludos Pablo y felicidades por el maravilloso IDE! viva zinjai! jaja

    ResponderEliminar