Revista Tecnología

Creando una configuración personalizada para Emacs. Mi .emacs.d con explicaciones detalladas (II – Edición de código)

Publicado el 30 diciembre 2017 por Gaspar Fernández Moreno @gaspar_fm

Creando configuración personalizada para Emacs. .emacs.d explicaciones detalladas Edición código)Creando una configuración personalizada para Emacs. Mi .emacs.d con explicaciones detalladas (II – Edición de código)
Suelo utilizar Emacs para editar código fuente para todos mis programas, tanto proyectos grandes como pequeños. Y, para crear muchos de los ejemplos que pongo en el blog (Aunque a veces la indentación no se copia bien). Por eso, es muy importante, tener herramientas para poder utilizar sin problemas y cómodamente el código en nuestro editor.

En este post, como ya empecé hace unos días (ver aquí Mi configuración personalizada para Emacs, primera parte) seguiré comentando punto por punto mi configuración actual de Emacs, con las utilidades a mi gusto. Aunque la configuración actualizada la tengo en GitHub, vamos a ver con detalle las partes dedicadas a ayuda de edición de código, orientado sobre todo a hacer más llevadera la programación con utilidades que mejoran nuestra experiencia de usuario y sesiones.

La configuración que muestro aquí está dividida en varios archivos está dividida en múltiples archivos divididos por categorías. En el post anterior vemos más detalles sobre el árbol de directorios y el contenido de init.el así como la forma en la que tenemos que incluir los archivos que presento aquí.

De todas formas, este código puede ser evaluado con M-x eval-expression / M-x eval-region (dependiendo de dónde lo escribamos). Incluso es recomendable abrir un buffer nuevo (o *scratch*) para practicar y probar cosas.

Gestión de sesiones - init-sessions.el

En este archivo:

  • Establecemos configuración de las sesiones y bloqueos. En mi caso, dependiendo del directorio desde el que se abra Emacs. Así como el auto-salvado de la sesión, a los 10 minutos (600 segundos)
  • Sobreescribo funciones de lectura del desktop para mostrar el tiempo invertido en restaurar el desktop.
  • Hacemos que se restauren más aspectos de la sesión de Emacs con el session-mode.
  • Se establecen valores por defecto del tamaño de los historiales que guardará Emacs. No los pongo ilimitados para que se optimice un poco el uso de la memoria y las búsquedas sean más rápidas.
  • Configuramos las copias de seguridad. Éstas utilizarán el modo backup-by-copying, aunque es el más lento, de otro modo, la copia de seguridad se hace renombrando y en algunos sistemas de archivos puede dar problemas. Por otro lado, se mantendrán varias versiones de los archivos y todas las copias de seguridad se harán en el directorio ./.__backups__ dentro del directorio actual. Muchos prefieren guardar las copias de seguridad en otro sitio, podemos darle una ruta absoluta si queremos guardar todas las copias de seguridad juntas.
  • También me gusta la forma en la que Emacs ofrece salvado automático de archivos aunque podremos establecer el directorio que deseemos.

init-cedet.el

Creando configuración personalizada para Emacs. .emacs.d explicaciones detalladas Edición código)
Creando una configuración personalizada para Emacs. Mi .emacs.d con explicaciones detalladas (II – Edición de código)

CEDET (Collection of Emacs Development Environment Tools o Colección de Herramientas de Entorno de Desarrollo de Emacs) es una de las joyas de Emacs que permiten aumentar la funcionalidad de este editor a otro nivel. En CEDET tenemos muchas utilidades que harán que programemos mucho más rápido. Algunos de los módulos que encontramos en CEDET son:

  • Semantic: Analiza nuestro código para ofrecernos autocompletado inteligente, resaltar declaraciones de funciones, buscar implementaciones, navegar dentro de nuestro código, buscar errores, etc.
  • EDE: Emacs Development Environment (Entorno de Desarrollo de Emacs), nos proporciona un entorno de gestión de proyectos.
  • SRE: Gestor de plantillas
  • ECB: Emacs Code Browser (Navegador de Código de Emacs). Nos presentará una configuración de ventanas en la que incluirá un navegador de archivos y directorios, un navegador de objetos dentro de nuestro código y un historial además de la ventana de nuestro código. Es más o menos lo que se ve en la imagen de este apartado.
  • Otros: Podemos instalar una barra de acceso rápido a elementos (Speedbar), tenemos un módulo para crear diagramas (COGRE), y muchas funciones Lisp que pueden utilizar otros módulos para Emacs.

Nuestro archivo init-cedet.el será el siguiente:

Lo primero que hacemos es cargar el módulo cedet que viene con Emacs. Aunque podemos descargarlo de Internet, con muchos módulos y más completo, el que viene con Emacs suele ser más nuevo y compatible con nuestra versión de Emacs. Puede que si lo descargamos, aunque sea desde la página oficial, tengamos ciertos problemas para echarlo a andar.

Luego cargamos en el load-path de Emacs el contenido de site-lisp/cedet-contrib. Dentro de este directorio (que podemos ver en el GitHub de mi configuración) he incluido algunos archivos que vienen con la instalación original de CEDET y no vienen en el core, pero que son interesantes.

Además, incluyo un archivo hideif.el que suele venir con Emacs y, tiene un bug en versiones inferiores a Emacs 25 (creo que en la 24.5 ya lo arreglaron, pero no llegué a probarlo). CEDET utiliza este módulo internamente y puede provocar algunos avisos, incluso hacer que no inicie Emacs correctamente.

Una vez cargado el módulo, vemos qué partes vamos a configurar. En mi caso, me quedo con Semantic, EDE, SREcode, ECB y EAssist (parte de los módulos de contrib que usan CEDET por debajo).

Semantic, que parsea el contenido de mis archivos de código leyendo variables, funciones, clases, espacios de nombres y demás lo suelo usar para asistirme mientras codifico. Esta asistencia suele ser el autocompletado inteligente, que me da opciones relativas a lo que estoy escribiendo. Puede darme opciones tanto del propio lenguaje como de bibliotecas que esté incluyendo y sean accesibles. Está pensado para C y C++, aunque para otros lenguajes también funciona bien y me permite trabajar rápidamente. Aunque está hecho en un lenguaje interpretado funciona muy rápido, e incluso hay formas de hacer que funcione más rápido aún, ayudándonos de aplicaciones externas, yo prefiero que mi configuración de Emacs sea lo más portable posible, y llevándome el directorio .emacs.d o incluso clonándolo de GitHub sea suficiente. También se usa para que ECB muestre información sobre los elementos que se encuentran en el código y pueda ir directamente a funciones, variables o estructuras determinadas o, por ejemplo, para que cuando programo en C o C++ pueda saltar directamente de un archivo de cabecera a uno de código sin tener que hacerlo a mano, dirigiéndome directamente al número de línea concreto donde está una función, una llamada, etc.

Aunque Semantic tiene muchas posibles configuraciones, en mi configuración personal incluiré:

  • semanticdb-minor-mode. Como parsear archivos de código fuente es una tarea pesada que puede dejar a Emacs colgado durante varios segundos o minutos. Haremos que Semantic sólo lea los archivos cuando haya cosas nuevas, almacenando en caché los elementos que ya ha leído y optimizando así su funcionamiento.
  • global-semantic-idle-scheduler-mode. Analiza archivos cuando no estoy directamente trabajando con Emacs. Porque es muy incómodo que, mientras estás trabajando, el editor se pare y no te deje hacer nada, aunque sea durante unos segundos. Por eso, aunque a veces, cuando utilizamos el autocompletado puede forzarse un parseo de los archivos, es interesante que, mientras no estemos trabajando se vayan completando ciertas partes del mismo. Personalmente, lo suelo configurar con semantic-idle-scheduler-idle-time indicando que se considere que no hago nada cuando lleve 5 segundos sin utilizar Emacs, y semantic-idle-scheduler-verbose-flag para que me indique en pantalla cuándo está trabajando Semantic.
  • global-semantic-stickyfunc-mode coloca en la parte superior del buffer el prototipo de la función dentro de la que estamos. Es muy útil cuando las funciones son muy grandes, o nuestra pantalla muy pequeña, para tener siempre presente el nombre de la función y los argumentos de entrada.
  • global-semantic-highlight-func-mode. Resalta llamadas o declaraciones de funciones mientras tenemos el cursor encima. Así sabemos dónde se llama, y dónde se declara una función.
  • global-semantic-idle-summary-mode. Nos muestra la cabecera de las funciones en el minibuffer ayudándonos a ver los argumentos de una función, método o llamada de un vistazo.
  • srecode-minor-mode. Activa el sistema de plantillas SREcode.
  • global-show-parser-state-mode. Cuando esté realizando un parseo de archivos fuente, decirnos el progreso del parseo en el minibuffer. Siempre es algo más lento decir cuánto lleva completado de una tarea e ir actualizando ese progreso, pero desespera menos al que pacientemente está mirando pasmado la pantalla esperando que se realice la tarea.
  • global-semantic-decoration-mode. Aplica una decoración a cada palabra clave del código.
  • global-semantic-show-unmatched-syntax-mode. Nos avisa cuando hay errores de sintaxis según el parseador. Puede que algo no sea un error de sintaxis propiamente dicho, en códigos muy complejos, tal vez el parser no llegue a lo que nosotros queremos, pero generalmente funciona bien.
  • global-semantic-mru-bookmark-mode. Nos permite saltar entre etiquetas (variables, funciones, etc) para dirigirnos a la parte del código donde se declaran/definen/llaman con M-n, M-p
  • También establecemos algunas teclas rápidas para llamar algunos métodos de semantic. Podemos verlo al final del post, en teclas rápidas y se añaden a un hook de determinados lenguajes.

Tras esto, se añaden algunas características para mejorar el parseo de las bibliotecas de C y C++.

Utilidades de edición (init-editing-utils.el)

Ahora vamos a ver algunas utilidades que nos ayudarán a utilizar nuestro entorno de programación, o configurarlo de manera fina, a nuestro gusto. Nota: El gusto de cada uno puede variar, aunque aquí tenéis un punto de partida.

Ahora unas cuantas explicaciones sobre lo que se ha hecho en este archivo:

  • Se activa el modo diminish, que nos ayuda a mantener limpia la modeline. Como vemos, en la modeline se muestran los modos que hay activados, y cada vez tenemos más minor-modes activados, que añaden pequeñas funcionalidades a Emacs. En este caso, hay muchos modos, que si no aparecen, no pasa nada. Así ocultamos algunos, como undo-tree que estará siempre activado.
  • Unfill, combina párrafos o regiones enteras (texto seleccionado) a una sola línea. Al contrario que fill mode que viene con Emacs. Podemos usarlo llamando M-x unfill-paragraph / unfill-region / unfill-toggle
  • Focus mode resalta el párrafo actual. Nos ayuda a centrarnos en una parte del código a medida que nos vamos moviendo. También disponemos entre otras utilidades de M-x focus-pin / focus-unpin que resaltan una región del código de forma permanente.
  • Activa electric-indent-mode para anidar código automáticamente al pulsar enter.
  • Activa auto-revert-mode que recarga automáticamente archivos modificados fuera de Emacs. Es muy útil para ver logs (como auto-revert-tail-mode) entre muchos otros casos.
  • Activa transient-mark-mode para poder seleccionar texto con C-SPC
  • Subword mode no está activado por defecto. Nos ayudará a saltar entre sub-palabras dentro de una frase. Por ejemplo, si creamos FuncionConUnNombreMuyLargo o funcion_con_un_nombre_muy_largo nos permitirá dirigirnos a cada una de las palabras con Control+Flechas.
  • Activa rainbow-delimiters que coloreará llaves, corchetes, paréntesis y demás de diferente color mientras programamos y los casará con sus correspondientes, para que no nos liemos mucho.
  • Prettify-symbols-mode permite cambiar el estilo o la representación de ciertos símbolos. Por ejemplo, cuando escribimos lambda() pone λ, sin cambiar el código, sólo cambia la visualización.
  • ¡Undo-tree es de mis preferidos! Si estás harto o harta de cómo Emacs gestiona el deshacer/rehacer, ¡este es tu modo! Nos muestra un árbol de modificaciones de nuestro código en el que podremos regresar a un estado anterior o, incluso si hemos deshecho cambios y hecho modificaciones, podremos volver a uno de los estados anteriores navegando entre ramas. Se activa con C-x u (como el deshacer normal), podemos navegar con las flechas y salir con la q.
  • highlight-symbol resalta el símbolo bajo el cursor. Aunque utilizo Semantic para navegar ṕor los símbolos con M-p y M-s, puedo utilizar M-s-h para resaltar el símbolo. (Configurado en las teclas rápidas).
  • Browse-kill-ring nos permite navegar por el portapapeles. Así para pegar un texto copiado anteriormente no tendremos que pulsar C-y y luego M-y hasta dar con el que queremos, podemos disponer de un menú interactivo y una previsualización muy chula gracias a browse-kill-ring-highlight-inserted-item, browse-kill-ring-highlight-current-entry, browse-kill-ring-show-preview y browse-kill-ring-separator
  • Previene la desactivación de los narrow-commands. Éstos permiten mostrar sólo parte del código, sin borrarlo. Es accesible desde C-x n n (para mostrar sólo la región seleccionada), C-x n d (para mostrar la función seleccionada) y C-x n w (para mostrar todo de nuevo).
  • Activa show-paren-mode, que muestra los paréntesis, llaves o corchetes que casan con el carácter actual. Junto con rainbow-delimiters son una joya para la edición de código.
  • Activa expand-region, que nos permitirá expandir y contraer la región seleccionada con C-= y C-0.
  • No desactiva upcase-region y downcase region para poner el texto seleccionado en mayúsculas (C-x C-u) o minúsculas (C-x C-l)
  • No desactiva el scroll lateral (C-x ). Eso sí, es incompatible con fci-mode.
  • No desactiva eval-expression (M-:)
  • Activa el cua-mode para hacer selecciones rectangulares. Yo lo activo con M-RET.
  • Evita que eliminemos texto cuando tenemos una selección abierta y pulsamos una tecla. Por ejemplo Cuando hacemos Control+Espacio y seleccionamos y luego escribimos una letra. Definiendo delete-selection-mode a nil no se borrarán las regiones.
  • Activamos multiple-cursors para trabajar en varios lugares a la vez. Podemos navegar con varias teclas que explico al final del post. Es complicado, pero cuando le coges el truco está muy bien.
  • Activamos page-break-lines y lo ocultamos. Este modo dibuja una línea horizontal cuando encuentra saltos de página (representados por ^L). Por cierto, para insertar un salto de página debemos pulsar C-q C-l. Tenemos formas de navegar por páginas, pero no lo uso demasiado. Sobre todo me gusta para la representación de los separadores del kill-ring con la extensión mencionada anteriormente.
  • Modo whole-line-or-region, hace que operaciones como copiar y cortar que afectan a regiones, o selecciones de texto, si no hay texto seleccionado afecten a la línea actual. Y como este modo no es compatible con CUA, lo desactivamos cuando utilizamos la selección rectangular.
  • Modo highlight-escape-sequences para resaltar las secuencias de escape como \n, \r, \t...
  • Modo guide-key que nos presentará ayuda sobre las teclas y sus funciones cuando empecemos a teclear una combinación de teclas como C-x C-c y demás. Podemos configurar el disparo de la ayuda con la combinación de teclas que deseemos.
  • Modo fill-column-indicator muestra una línea vertical en la columna 130, aunque podemos cambiar la columna. Lo malo de este modo es que no es compatible con muchas extensiones de Emacs. Actualmente le estoy dando una oportunidad, pero muchas veces suelo desactivarlo a mano.
  • Modo wc (Word count) que cuenta palabras dentro del buffer. Lo podemos activar a mano con M-x. Está bien, pero me llena la modeline de letras y la mayoría de las veces no me interesa. Adedmás, siempre podemos hacer M-x count-words.
  • Modo hs. Sirve para plegar el código, ocultando fragmentos que no nos interesan. Con M-+ y M- podemos plegar el código entre llaves, incluso funciones o clases enteras para visualizar en la pantalla sólo lo que necesitamos. Además, si utilizamos goto-line para ir a una línea determinada o hacemos una búsqueda dentro de un código oculto, éste se expandirá automáticamente.
  • Cuando utilizamos goto-line, mostramos los números de línea aunque estén desactivados.
  • Elimina los espacios (o los retornos de carro) sobrantes de los buffers antes de salvarlos. Eso nos ahorrará mucho tiempo, salvaremos archivos más pequeños y nos quitará muchos problemas.

Definimos algunas funciones nuevas con utilidades:

  • newline-at-end-of-line : Salta al fin de la línea, y crea una nueva línea. Una alternativa más corta que pulsar la tecla Fin y luego Enter. (La colocaremos en la tecla con s-RET).
  • yank-pop-forwards : Navega hacia atrás por el kill-ring. Es muy útil porque a veces queremos pegar un texto copiado hace mucho tiempo y pegamos, pegamos y pegamos y de repente nos pasamos y tenemos que dar la vuelta por todo el kill-ring para encontrar el texto. Con esta función podemos avanzar en dirección contraria.
  • sort-lines-random : Ordena aleatoriamente las líneas de una región o de un buffer. Podemos llamarla con M-x.
  • Redefinimos la tecla inicio a la función sacha/smarter-move-beginning-of-line. La primera vez que vamos al principio de la línea se hace al primer carácter escrito, por lo que si tenemos una línea indentada podemos acceder directamente a lo importante.

También definimos algunos valores de configuración como por ejemplo:

  • El tiempo de parpadeo del cursor (blink-cursor-interval)
  • Mostrar el número de columna (con column-number-mode)
  • Activamos la creación de archivos de backup (con make-backup-files)
  • Definimos el tiempo de autosalvado a 180 segundos (con auto-save-interval)
  • Hacemos que el pegado sea en la posición del cursor (con mouse-yank-at-point)
  • Activamos el truncado de líneas (con truncate-lines a 't)
  • No mostramos los espacios al final de línea (con show-trailing-whitespace a nil).
  • Y muchas más.

Autocompletado

Creando configuración personalizada para Emacs. .emacs.d explicaciones detalladas Edición código)
Creando una configuración personalizada para Emacs. Mi .emacs.d con explicaciones detalladas (II – Edición de código)

Algo básico en cualquier editor de código es que éste nos ayude a escribir. El desarrollo de un programa es algo muy duro para nosotros (que sea divertido es otra cosa) y actualmente tenemos ordenadores muy potentes por lo que podemos aprovechar esa potencia para evitarnos buscar y tener que recordar miles de cosas o, aunque las recordemos, al menos que sea rápido escribirlas, porque a veces hay funciones, variables o tipos con nombres muy largos que tenemos que escribir una y otra vez.

Así que, es importante contar con un buen sistema de autocompletado. En Emacs, disponemos, entre otros de auto-complete-mode y company-mode, al menos son los más grandes. A mí me gusta auto-complete-mode y este será mi fichero init-auto-complete.el:

En este fichero defino sólo la parte más básica. Cada lenguaje irá introduciendo sus propias formas de autocompletado. Por ejemplo C y C++ explorarán archivos fuente con Semantic y lo mezclarán con información sobre las bibliotecas; Lisp tendrá muchas funciones y símbolos definidas, otros lenguajes utilizarán parte de sus manuales para completar palabras, etc. Pero en este fichero sólo incluyo la configuración por defecto de auto-complete, lo activo globalmente, estblezco el fichero de historial y defino algunas preferencias:

  • El auto completado se dispara automáticamente al escribir 2 caracteres. (ac-auto-start)
  • Se buscarán posibilidades de autocompletado en abbrev (ac-source-abbrev), características de lisp (ac-source-features), palabras de buffers del mismo modo que el actual (ac-source-words-in-same-mode-buffers), palabras de diccionario (ac-source-dictionary) y palabras del propio buffer (ac-source-words-in-buffer)
  • Se establece una política inteligente para las mayúsculas y minúsculas en las búsquedas (ac-ignore-case 'smart) con lo que no tendremos que preocuparnos por ello.
  • Do What I Mean Mode. Altera el comportamiento de la tecla TAB dependiendo del contexto en el que estemos, lo que la hace más intuitiva. (ac-dwim t)
  • Retrasa la aparición del popup de ayuda a 1 segunto (ac-quick-help-delay 1). A veces con menos retraso puede causar problemas porque tarde en salir menos que la ventana de las opciones de autocompletado.
  • Limitamos el número de candidatos a mostrar (ac-candidate-limit)
  • Nos permite filtrar los resultados del menú de autocompletado con C-s (ac-use-menu-map)
  • El mínimo de candidatos para mostrar el menú es 1 (ac-candidate-menu-min)
  • Adicionalmente se establecen fuentes de autocompletado para Lisp y Eshell

En el próximo post veremos características personalizadas para lenguajes de programación. En los lenguajes incluiré C, C++, PHP, Python, Javascript, Ruby, HTML, SQL, CSS, LUA y alguno más.

Teclas rápidas

Creando configuración personalizada para Emacs. .emacs.d explicaciones detalladas Edición código)
Creando una configuración personalizada para Emacs. Mi .emacs.d con explicaciones detalladas (II – Edición de código)

Estas son algunas de las teclas rápidas que se han establecido en este post. En el último post de la serie haré un resumen de todas las teclas rápidas, para tenerlas a modo de chuleta rápida:

  • Control-RET (Control + Enter) [Semantic]: Menú de autocompletado de Semantic (en lugar del menú del modo auto-complete)
  • C-c ? [Semantic] : Muestra en un buffer aparte todas las posibilidades de autocompletar de una etiqueta. Muestra también cierta ayuda en línea de cada etiqueta.
  • C-c > [Semantic] : Muestra en un buffer aparte las posibilidades de autocompletar sin ayuda y todo revuelto.
  • C-c = [Semantic] : Visita el archivo incluido.
  • C-c j [Semantic] : Salta a la línea donde se declara una función. Hace un efecto visual con el salto indicándonos la cabecera, inicio y final de la función.
  • C-c q [Semantic] : Visualiza la documentación de las funciones. Por ejemplo con comentarios de Doxygen
  • C-c s [Semantic] : Muestra un resumen en el minibuffer de llamadas a funciones o métodos.
  • C-c p [Semantic] : Salta al prototipo de la función.
  • C-c m [Semantic] : Salta a una etiqueta determinada
  • M-Z (Alt + Shift + Z) : Borra hasta el carácter indicado.
  • s-y (Meta + y) / C-c k: Activa el navegador del portapapeles para pegar texto de forma más interactiva y precisa.
  • M-Y (Meta + Shift + Y): Si estamos navegando por el kill-ring a la antigua usanza (C-y M-y M-y...) con M-Y navegamos por el ring hacia atrás.
  • C-= (Control =): Expande el texto seleccionado. Nos permite seleccionar una región más grande, delimitada por paréntesis, llaves, corchetes, sentencias, etc.
  • C-0 (Control 0): Encoge el texto seleccionado con los mismos criterios de antes.
  • S-backspace (Shift + retroceder) : Borra la línea actual hasta la indentación.
  • C-c d: Clona la línea actual en la línea siguiente.
  • C-c D: Clona la línea actual en la línea anterior.
  • s-RET (Meta + Enter): Hace que estemos donde estemos en la línea (podemos estar al principio o en mitad), saltemos de línea. Sería como ir al final de la línea y pulsar Enter.
  • C- (Control + arriba): Retrocede un párrafo.
  • C- (Control + abajo): Avanza un párrafo.
  • C- (Control + izquierda): Retrocede una palabra.
  • C- (Control + derecha) Retrocede una palabra.
  • s-backspace (Meta + retroceder): Deshacer (lo que en el Emacs de siempre era C-x u).
  • s-S-backspace (Meta + Shift + retroceder): Rehacer
  • Los ratones que tienen scroll horizontal pueden usarlo.
  • C-M-º (Control + Alt + º): Indentar automáticamente la región. Porque muchas veces C-M-\ no funciona correctamente y porque en los teclados en español podemos pulsar esta combinación con una sola mano.
  • M-+ (Alt + +) : Mostrar un bloque previamente ocultado. Estos bloques pueden ser contenidos de funciones, bucles, comentarios, etc.
  • M- (Alt + -) : Ocultar un bloque.
  • M-j (Alt + j) : Unir líneas, lo contrario de un Enter que puede separarlas.
  • s-º (Meta + º) : Activa el modo focus.
  • M-s-h (Alt + Meta + h) : Resalta o elimina el resaltado del símbolo bajo el cursor.
  • M-RET (Alt + Enter) : Selección rectangular CUA.

Teclas para trabajar con varios cursores a la vez

Los cursores múltiples nos permiten editar varios lugares dentro de un buffer. Son muy útiles cuando insertamos o eliminamos trazas, cuando tenemos que escribir o borrar el mismo texto en varias regiones del código sin tener que ir al buscar y reemplazar varias veces o simplemente cuando queremos sorprender a las visitas o a los que nos miran por encima del hombro cuando estamos trabajando.
En mi configuración de Emacs podemos utilizar las siguientes teclas (algunas de ellas sacadas de la página oficial de la extensión multiple-cursors de Emacs).
Primero debemos seleccionar una región, puede ser una palabra o un fragmento, ya lo hagamos con el ratón o con C-SPC. Luego pulsamos:

  • C-
  • C-> o C-+ (Control + > o Control + "+") : Para crear un cursor en la siguiente réplica al texto seleccionado.
  • C-c C-

También podemos colocar cursores con el ratón si pulsamos s- o lo que es lo mismo la tecla meta o tecla Windows y luego hacer click en algún punto del buffer. Cuando tengamos los cursores podemos escribir cualquier texto y se replicará en cada uno de los cursores, y para insertar una nueva línea podemos pulsar C-j. Los cursores desaparecerán al pulsar Enter o C-g.

Otras opciones que tenemos disponibles son:

  • C-c c r (Control+c, c, r): Para seleccionar regiones rectangulares.
  • C-c c c : Editar las líneas de la región

También podría interesarte...


Volver a la Portada de Logo Paperblog