Mejor respuesta
No puedo creer que nadie haya dicho Vim todavía. ¡Vim!
Una vez que supere la curva de aprendizaje inicial, es una herramienta asombrosa para automatizar tareas de programación mundanas. Le daré un ejemplo que utilicé hoy.
Estaba creando una clase de lector XML (heredada de una clase XML base) para un componente de nuestro código base. El .xml se parecía a esto.
...
El problema Fue (debido a la arquitectura existente) que todos estos valores de campo debían ser miembros de datos privados de Some\_XML\_Class en el código. Lo que significaba que estaba a punto de hacer un montón de trabajo sin sentido al convertir campo uno en std :: string m\_field\_one , para cada uno de estos campos.
Ahí es donde entra en juego Vim. En lugar de matar 20 minutos haciéndolo de la manera difícil. Pegué la sección de código anterior y grabé una macro.
^xistd::string m\_
Esta serie de comandos vim hace lo siguiente. Va al primer carácter de la línea y lo elimina (» se elimina). Entra en modo de inserción y antepone std :: string m\_ a campo . Luego, busca la primera aparición de «-» y la reemplaza por «\_». Luego salta al final de la palabra field\_N , entra en modo de agregar y agrega un punto y coma y mueve el cursor uno hacia la derecha. Así que ahora tenemos
std::string m\_field\_one;value="value1" />
Pero no hemos terminado. Luego pasamos al modo de comando, borramos el resto de la línea y saltamos a la siguiente. De modo que tenemos:
std::string m\_field\_one;
Tenga en cuenta que la línea uno está perfectamente formateada y el cursor está actualmente en la línea dos.
La siguiente parte es donde entra la magia. Antes de ejecutar ese comando, comenzamos a grabar una macro para registrar a . Usando el comando q seguido de a . Por lo tanto, hacer el comando completo de la siguiente manera (donde el q final se usa para indicar la terminación de la macro).
qa^xistd::string m\_
Ahora, si llamamos a esa macro usando el comando Vim:
@a
Vuelve a ejecutar la macro y formatea automáticamente la siguiente línea:
std::string m\_field\_one;
std::string m\_field\_two;
¡Pero espera, todavía tenemos N-2 líneas con estructura similar! Supongamos que en este caso N es igual a 100. No hay problema. Simplemente escribimos el comando:
98@a
Esto ejecuta la macro anterior 98 veces más, formateando automáticamente el resto de su código. Ahora tenemos:
std::string m\_field\_one;
std::string m\_field\_two;
std::string m\_field\_three;
...
std::string m\_field\_ninetynine
std::string m\_field\_onehundered;
Estupendo .
* PD: Al principio, estos comandos pueden parecerle extraños y atemorizantes, pero una vez que ha pasado algún tiempo con Vim como su editor principal, se convierten en algo natural. La macro de ejemplo me tomó 10 segundos para escribir y me ahorró una gran cantidad de tiempo.
* PPS: Sé que el código de ejemplo es bastante tonto, pero lo usé solo para ilustrar un punto. Sin embargo, en el mundo real te encontrarás con casos similares.
Respuesta
Gracias por preguntar.
Vine aquí inicialmente para advertir contra tal objetivo, basado solo en el título … Básicamente, hoy escribirías un editor de texto porque:
- Tienes una necesidad muy específica (pero en este caso, es mejor comenzar desde una base existente, en lugar de ir desde cero, a menos que tenga ideas muy novedosas);
- O lo considere un ejercicio interesante de programación; que es de hecho tu objetivo.
Porque, francamente, si no puedes encontrar el editor de tus sueños entre los cientos, si no miles de los existentes, ¡eres muy quisquilloso!; -)
También tuve la tentación de decir que escribir un editor de texto desde cero puede ser un poco abrumador para un principiante; digamos que es una tarea de nivel intermedio: un poco difícil para un principiante absoluto, factible una vez obtienes algo de experiencia.
Dicho esto, escribí mi propio editor de texto cuando todavía era un principiante: recién salido de la universidad, codificado solo un poco en C, sin ningún proyecto real. Pero estaba en una PC con SCO Unix que solo tenía vi como editor. Y no me gusta por sus dos modos (navegación vs. edición) que siempre me confunden (empezar a escribir, ver mi texto solo después de la primera i …).
Así que empecé a codificar mi editor en C, usando Curses como interfaz, creando mis propias estructuras de datos (probablemente ineficaces, pero manejamos archivos pequeños en ese momento), etc.
Me divertí mucho, aprendí mucho, y cuando otros usuarios empezaron a usarlo también, descubrí que siempre hacen cosas inesperadas, como mezclar pestañas y espacios … 🙂
Nuevamente, si es un principiante total, debe comenzar con proyectos más pequeños, para aprender sobre las bases del lenguaje (bucles, matrices, etc.), sobre estructuras de datos, cómo leer y escribir archivos de texto, etc.
Es difícil recomendar un idioma … Para un proyecto basado en JVM, usaría Ceylon, quizás con JavaFX o SWT. Para un proyecto «cercano al metal», usaría Rust (hay un proyecto inicial sobre cómo escribir un editor de texto en Rust, parece prometedor), mientras que otros recomendarían usar C ++ (¡que puede ser abrumador para un principiante!). Para un lenguaje más fácil, quizás Lua sería una buena opción (otros recomendarían usar Python, pero no tengo experiencia con él). O quizás JavaScript, con Node.js y la plataforma Electron, una opción de tendencia … (Atom, Visual Studio Code y Brackets se han escrito con eso. Pero eso es «apenas» desde cero «ya que usan editores de código JS existentes. )
Consejo general: primero diseñe su estructura de datos (la estrategia de dos partes utilizada por el proyecto Scintilla es buena; las cuerdas, tal como las utiliza el proyecto Rust, son un poco más / demasiado avanzadas), cómo manipula datos: cómo agregar o quitar un carácter, una línea, una selección, etc.
Luego, piense en la interfaz de usuario. Lo ideal es separar los dos (manejo de datos y visualización de datos). De esta manera, algún día puede cambiar el objetivo de la interfaz de usuario (de Swing a JavaFX, de GTK + a Qt, lo que sea) con pocos o ningún cambio en su lógica base. Bueno para la portabilidad.