2010-07-02 10 views
43

Como siempre estoy insatisfecho con los editores existentes, un proyecto que siempre quise iniciar es mi propio editor de texto. Sin embargo, la edición de texto es un asunto serio.Teoría del editor de texto

Además de analizar el código fuente de los editores de texto existentes, ¿hay algún libro u otro recurso (como trabajo académico) sobre este tema? Estoy interesado especialmente en algo que enseña cómo manejar la memoria y cómo administrar la inserción de texto (si tiene un archivo de 100 MB y desea agregar un carácter en x posición, no puede simplemente memmove el enorme bloque de texto. ..).

+0

¿Un editor de texto para qué? Escritorio, web, .... consola? –

+3

No estoy seguro acerca de la pregunta general, pero para la pregunta específica de inserción, muchos editores manejan el texto como cuerdas: http://en.wikipedia.org/wiki/Rope_%28computer_science%29 –

+0

@Bart: un editor de texto sin formato simple, sin embargo, supongo que las reglas básicas de los editores de texto son buenas incluso para los procesadores de textos de texto enriquecido. Me estoy dirigiendo a un editor no basado en web, sin embargo, una vez más, creo que la misma teoría central es válida incluso para editores basados ​​en web y para cualquier idioma (aunque yo lo codificaría en C++). – Wizard79

Respuesta

1

cómo administrar la inserción de texto (si tiene un archivo de 100 MB y desea agregar un carácter en la posición x, no puede memorizar el bloque de texto enorme ...).

Haga que el archivo de texto sea una lista vinculada, donde cada línea es una entrada.

+1

Eso es bueno hasta que tenga líneas realmente largas: P – Earlz

+0

@Earlz: A continuación, divida esas líneas y convierta cada una de ellas en su propia lista vinculada, árbol u otra colección apropiada. –

+0

No, eso no es bueno si tiene líneas de texto de 2 MB ... o incluso un solo gran texto de línea sin líneas finales ... – Wizard79

14

A lo largo de los años he escrito un buen número de editores de texto diferentes. Ciertamente, la forma más simple es administrar una larga secuencia de caracteres, donde se copia todo para insertar cualquier carácter. Otras técnicas que he usado incluyen:

  • Representan el archivo de texto como una lista de líneas de texto doblemente vinculadas.
  • Construya una estructura de datos similar a un árbol (a veces llamada "rope") que comienza como una cadena sólida de caracteres, pero tiene la capacidad de dividir, insertar y eliminar bloques de texto sin tener que mover todo el resto del texto alrededor.

Muchos de los antiguos libros de ejemplo de Borland usaron un editor de texto como ejemplo de tutorial. Ocasionalmente puede encontrar copias de estos en librerías usadas casi gratis.

1

Bueno, si usted sabe que en general la gente tendrán relativamente pocos puntos de inserción, que podría contener una matriz de punteros en su búfer de texto original y cuando el usuario intenta insertar en su interior, que "dividir" el buffer por el desove otra puntero al resto de la memoria intermedia, por lo que la longitud de la primera puntero de modo que se detenga en el punto de inserción y la adición de una tercera puntero para el texto que se inserta entre medio, un poco como:

long original text la la la 
^    *^ 
|     2nd part 
1st part 

y la estrella de puntos en un nuevo búfer de texto donde comienza a agregar el texto que se va a insertar.

Cuando renderiza (o analiza en general) su archivo de texto, recorre la matriz de punteros y luego realiza su trabajo en cada búfer. Por supuesto, si el búfer es lo suficientemente pequeño, omita agregar una nueva parte del búfer, pero eso es solo heurística, pruebe cada uno y obtenga una idea de cuál funciona mejor.

También podría considerar dividir el archivo de texto en carga en varios búferes, digamos cada 1MB más o menos, porque si carga el archivo en un solo búfer necesitará crear un nuevo búfer para el texto insertado debido al tamaño. De nuevo, esta es una optimización heurística.

+0

Dividir texto en fragmentos fue en realidad mi primera idea. Pensé en usar trozos de tamaño de página de memoria para evitar la fragmentación de memoria. Sin embargo, esto parece demasiado trivial. ¿No hay enfoques más potentes disponibles para manejar situaciones como grandes movimientos de texto? – Wizard79

+0

Si lo hace así, no necesita mover nada. Eso es lo que intenta evitar, mover cosas en la memoria (a menos, por supuesto, que el usuario arrastre el texto en otra posición, pero eso es raro). Para la inserción normal, solo agrega texto al final de un búfer. – Blindy

15

Eche un vistazo a la descripción de Rob Pike de su Sam text editor. Asegúrese de navegar más allá de la vista general de alto nivel y el lenguaje de comandos. Describe el análisis sintáctico, la administración de la memoria y las estructuras de datos más adelante en el documento.

Además, eche un vistazo a simple regular expression implementation de Russ Cox. Es fácil de seguir y puede abrir algunas puertas fuera de las bibliotecas de expresiones regulares existentes.

8

ascendido a responder por la petición:

El antiguo "Software Tools in Pascal" de Kernighan y Plaugher implementa el editor ed en un idioma ni series reales ni los punteros. Contiene una gran visión general de las consideraciones de diseño que subyacen a cualquier editor de texto.

+1

Tal vez ha habido algunas mejoras en la teoría mientras tanto, ¡pero vale la pena leerlo con seguridad! – Wizard79

7

Un método antiguo que todavía funciona se llama búfer de huecos. La idea básica es que coloque el texto en un búfer, pero en lugar de ponerlo todo en un bloque, crea un "espacio" en el cursor, coloca todo el texto antes del cursor al principio del búfer, y todo texto después del cursor al final del búfer. La mayoría de las inserciones tienen lugar en el cursor, lo que puede hacer sin mover nada (hasta que salga del buffer o a menos que lo haga). Cuando el usuario mueve el cursor, mueve el texto apropiado de un lado a otro de la división.

controles típicos dado (cursor hacia la izquierda, derecha, arriba, abajo, página arriba, página abajo), el mayor movimiento que suele tratar es una página a la vez, lo que es normalmente fácil de manejar un poco más rápido que un teclado se repite Por supuesto, puede ralentizar un poco si tiene un archivo realmente grande y un comando "ir a la línea", o algo en ese orden. Si va a hacer mucho de eso, sin duda hay mejores estructuras para usar ...

+0

En realidad se llama "buffer de brecha". No se puede encontrar ninguna referencia al "búfer dividido" después de una búsqueda rápida. – brianmearns

+0

@ sh1ftst0rm: Vaya, una vez más, me entero de que no debería confiar en mi memoria. Ahora si mi memoria funcionara lo suficiente como para recordarla ... :-) –

3

El componente Scintilla utiliza un búfer dividido, según la teoría explicada en un texto vinculado en su página Scintilla and SciTE Related Sites.
La página vinculada es Data Structures in a Bit-Mapped Text Editor.
El búfer dividido demostró que funciona bien incluso con archivos de megabytes. Usar estructuras secundarias (por ejemplo, una lista de inicios de línea) también puede ser útil.

6

The Craft of Text Editing de Craig Finseth, basado en su tesis de maestría, cubre estos temas. Es gratis en la web. OTOH es bastante viejo y no menciona algunas ideas como cuerdas que eran menos prácticas en las pequeñas computadoras de antaño.

9

Hay un excelente tutorial disponible aquí que abarca una gran cantidad de temas relevantes en un contexto más moderno:

Las otras respuestas a esta pregunta búfer brecha de cubierta.

Otra cobertura moderna es la descripción de AvalonEdit

y detalles adicionales de:

y hay una enorme cantidad de detalles/contenidos (sobre SharpDevelop) en el libro:

+2

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

+2

Si bien aprecio que los enlaces se vuelvan obsoletos, la pregunta requiere información que requiere muchas páginas de explicación, mucho más que se puede incluir razonablemente en una respuesta de desbordamiento de pila. Parte de la razón por la que di varias opciones fue para cubrir el escenario donde algunos se desvanecen. Sin embargo, la Wayback Machine a menudo también puede ayudar (http://archive.org/web/) – StephenD

5

This paper compara muchas estructuras de datos que pueden ser utilizados para los editores de texto , incluyendo algunos ya mencionados aquí (p. ej., buffers de brecha) así como varios otros (por ejemplo, tablas de piezas). El artículo es antiguo, pero creo que sigue cubriendo todas las opciones principales, y lo compara muy bien en términos de rendimiento, complejidad y gastos generales.

Sé que las respuestas de Stack Overflow no son simplemente enlaces, pero esta sigue siendo la mejor fuente de información que he encontrado para la información solicitada, y es demasiado tiempo para resumir en una respuesta aquí. En caso de que el enlace quede obsoleto, busque "Data Structures for Text Sequences" por Charles Crowley de la Universidad de Nuevo México.

2

Así es como los "pros" en Microsoft lo hacen:

MS Word utiliza la estructura de datos pieza tabla. Una matriz ascendente de posiciones de caracteres se mantiene en paralelo con una matriz de estructuras más grandes que contienen punteros en el archivo original (texto cargado en la carga de archivos) o en un búfer de solo agregación de caracteres recién agregados.

El control EDIT utilizado en todas partes en Windows no utiliza ninguna estructura de datos. Notepad simplemente usa un control EDIT de varias líneas. Compruébalo con un visor de montón. El control EDIT mantiene solo un buffer de saltos de línea y tab-stops.

Si va a crear un editor de texto sencillo sin formato en Windows, puede fácilmente subclasificar el control EDIT para agregar características.

Cuestiones relacionadas