dev codelite code blocks c++ c open-source editor

c++ - codelite - Editando un búfer de texto



code c++ (11)

¿Has verificado el código fuente de Scintilla ?

Ok, esta es una pregunta un poco descarada. Quiero construir un editor de texto simple (usando mi propio manejo de pantalla de modo de texto). Solo quiero un buen ejemplo de las estructuras de datos que se pueden usar para representar el búfer de texto y algunos ejemplos simples de inserción / eliminación de caracteres / texto. Puedo manejar todo el resto del código yo mismo (archivo de E / S, consola de E / S, etc.). Un enlace a una buena fuente de editor simple sería genial (C o C ++).


El libro "Gang of Four" ( Design Patterns ) tiene un editor de texto basado en GUI ya que es la principal fuente de ejemplos y es un libro que vale la pena.

El editor general de "texto puro" probablemente usa cuerdas, que STL de SGI tiene una implementación de. Básicamente, son una lista vinculada de búferes de caracteres. De esta forma, insertar / eliminar caracteres implica cambiar buffers más pequeños y algunos indicadores, en lugar de almacenar todo el documento en un solo buffer y tener que cambiar todo.


Esto es 2008. No escriba un editor de texto; estás reinventando el fuego

¿Aún aquí? No estoy seguro de si esto se aplica o qué plataformas planea admitir, pero la serie de tutoriales de Neatpad es un gran lugar para comenzar a pensar en escribir un editor de texto. Se enfocan en Win32 como la plataforma básica, pero muchas de las lecciones aprendidas se aplicarán en cualquier lugar.


Esto realmente depende de tu diseño. Hace un par de años, escribí un pequeño editor usando maldiciones. Utilicé una lista doblemente enlazada donde cada nodo era un personaje (un diseño bastante derrochador ... pero hace que las rutinas de formateo y actualización de pantalla sean realmente fáciles).

Otras estructuras de datos utilizadas por mis amigos fueron (este era un proyecto de tareas): 1) lista de matrices vinculadas con cada matriz que representa una línea. 2) una lista enlazada en 2D (acaba de crear ese nombre) ... era una lista de personajes vinculada, pero cada personaje estaba vinculado al personaje arriba y abajo. 3) Matriz de lista enlazada

Sin embargo, sugiero que revises el código fuente de algunos editores simples como pico para ver qué ds están usando.


Mi solución favorita es el buffer de brecha , porque es bastante fácil de implementar y tiene una buena eficiencia amortizada . Solo use una única matriz de caracteres, con una región designada como brecha. Una vez que entiendes el concepto, el código sigue casi naturalmente.

También necesita una matriz auxiliar [vector <int>] para rastrear el índice del comienzo de cada línea, para que pueda extraer fácilmente una línea de texto determinada. La matriz auxiliar solo necesita actualizarse cuando se mueve la brecha, o cuando se inserta / elimina una nueva línea.


Solía ​​trabajar para una empresa cuyo principal producto era un editor de texto. Si bien trabajé principalmente en el lenguaje de scripting para ello, el diseño interno del editor fue, naturalmente, un tema importante de discusión.

Pareció que se dividió en dos líneas generales de pensamiento. Una fue que usted almacenaba cada línea por sí mismo y luego las unía en una lista vinculada u otra estructura de datos general con la que estaba satisfecho. La ventaja era que cualquier acción de edición orientada a la línea (como eliminar una línea completa o mover un bloque de línea dentro de un archivo) era más que trivial de implementar y, por lo tanto, muy rápida. El inconveniente fue que cargar y guardar el archivo tomó un poco más de trabajo, porque tendrías que atravesar todo el archivo y construir estas estructuras de datos.

La otra línea de pensamiento en ese momento era tratar de mantener trozos de texto juntos, independientemente de los saltos de línea cuando no se habían cambiado, separándolos solo según lo requerido por la edición. La ventaja era que un trozo no editado del archivo podría ser enviado a un archivo muy fácilmente. Así que las ediciones simples en las que carga un archivo, cambia una línea y guarda el archivo, eran muy rápidas. La desventaja era que las operaciones orientadas a la línea o al bloque de columna llevaban mucho tiempo en ejecutarse porque tendrías que analizar a fondo estos trozos de texto y mover una gran cantidad de datos.

Siempre nos quedamos con el diseño orientado a la línea, por lo que sea que valga la pena, y nuestro producto fue considerado uno de los editores más rápidos en ese momento.


Su estructura de datos primaria es una para contener el texto. En lugar de utilizar un búfer largo para contener el texto, es probable que desee una matriz de líneas porque es más rápido insertar un carácter en el medio de una línea y luego insertar un carácter en el medio de un gran búfer.

Tendrá que decidir si su editor de texto debe ser compatible con el formato incrustado. Si, por ejemplo, necesita utilizar fuentes, negrita, subrayado, etc., entonces su estructura de datos deberá incluir formas de incrustar códigos de formato dentro de su texto. En los viejos tiempos de los personajes de 8 bits, podíamos usar los 8 bits superiores de un entero para almacenar los indicadores de formato y los 8 bits inferiores para almacenar el carácter en sí.

El código real dependerá del idioma que estés usando. En C # o C ++ probablemente use una matriz de cadenas para las líneas. En C tendrás una matriz de matrices de caracteres basadas en el montón.

Separe el código de visualización del código de manejo de texto tanto como sea posible. El centro de tu código será un ciclo cerrado algo así como:

while (editing) { GetCharacter(); ProcessCharacter(); UpdateDisplay(); }

Un editor más sofisticado usará hilos separados para la obtención / procesamiento de caracteres y la actualización de la pantalla.


Un enfoque simple estaría orientado a la línea: represente el archivo como una matriz / vector de matrices / vectores char / wchar_t, uno por línea. Las inserciones y eliminaciones funcionan de la manera esperada, aunque el final de la línea es un caso especial.

Comenzaría con eso y posiblemente reemplazaría la estructura de datos de línea con algo más eficiente que admite insertos / eliminaciones en líneas largas después de tener todo lo demás funcionando.


Puede usar casi cualquier estructura de datos para escribir un editor de texto. Dos millones de caracteres es una novela bastante gruesa de mecanografía y puede moverlos fácilmente hacia arriba / abajo (para insertar / eliminar en una matriz simple) en menos de una décima de segundo. No escuche a nadie que le diga que no construya uno, obtendrá algo que funciona exactamente en todos los pequeños detalles.

Escribí el mío, después de haber hecho demasiada navegación web y me había acostumbrado a subir / bajar de página siendo lo mismo que hacer clic arriba / debajo de la barra de desplazamiento. El salto atrás antes de que comenzaras a navegar la barra de desplazamiento cuando escribiste un caracter en un editor normal, simplemente se volvió demasiado molesto para mí, así que escribí el mío.

Si fuera a hacer una reescritura (solo usé delphi ansistrings para cada buffer de texto en la versión actual, con caracteres de nueva línea incrustados), usaría enteros o int64s para cada carácter y codificaría el inicio / detención del bloque, la posición del cursor y la línea marcadores en los bits altos, de esa manera no tiene que ajustar los punteros cuando inserta o elimina cosas.


Estos dos documentos en línea presentan una cornucopia pequeña pero útil de estructuras / técnicas de datos "bien conocidas" para editores de texto.

  1. Data Structures for Text Sequences describe y analiza experimentalmente algunas estructuras de datos, inclinándose hacia las tablas de elementos como la estructura de datos de elección. Sin embargo, Net.wisdom parece inclinarse hacia los búferes de brecha por ser más que adecuado para la edición de texto, y más simple de implementar / depurar.
  2. "El oficio de la edición de texto" (www.finseth.com/craft/) es un trabajo anterior, y aborda más que solo estructuras de datos, y está orientado a editores de estilo Emacs; pero los conceptos son generalmente útiles.

Echa un vistazo a vim, es de código abierto. Dale un vistazo para ver cómo maneja lo que quieres.