Archivo de la categoría: Emacs

Editor Emacs

Un poco de… Emacs (VI): insertar salida de comandos

Si trabajáis con la shell de Linux asiduamente como es mi caso, en ocasiones os resulta útil insertar en un fichero de texto el resultado de un comando.

Lo normal en estos casos es abrir una shell, ejecutar el comando, seleccionar la salida con el ratón, copiar y luego volver al editor (emacs, claro) y darle a pegar.

Otra opción es redirigir la salida del comando a un texto plano y luego insertar dicho archivo en el fichero en el que estamos trabajando (C-x i).

Sin embargo, lo más directo es usar la combinación C-u M-! (*). Con la última (M-!), lo que hace emacs es pedir en el minibuffer que introduzcáis un comando y la salida os la muestra en un buffer nuevo (no en el que estáis editando). Para que se inserte directamente donde tenéis el cursor hay que pulsar previamente C-u.

Recordad que:

 

C-u significa pulsar Control y la tecla "U",
C-x i significa pulsar Control y la tecla "X" y luego, tras soltar ambas, pulsar la tecla "I" (i latina),
M-! significa pulsar Alt y la tecla que tiene el símbolo "!" (admiración cerrado), que es la tecla del 1. Por tanto, habrá que pulsar Alt + Mayúsuclas + 1.
C-u M-! significa primero hacer el C-u, soltamos las dos teclas y hacemos el M-!.

 

(*) M-! : La tecla que aparece tras el «-» es la admiración cerrada pero por algún motivo, la fuente de wordpress no la pone correctamente (es problema de la fuente porque en el texto monoespaciado sí sale bien como se puede observar). Si alguien conoce este motivo agradeceré un comentario. PD. No es el «pipe», pues el pipe sí que lo muestra cuando se pulsa Alt gr + 1 (! es admiración y | es pipe). Sin embargo la admiración abierta sí la pone bien «¡».

Un poco de… Emacs (V): números de línea

Introducción

En ocasiones, cuando estamos editando un archivo de texto, nos puede interesar saber el número de línea en el que nos encontramos. Si estamos tecleando código fuente nos puede interesar que se muestre a la izquierda el número de línea (aunque espero que no sea para usar instrucciones de tipo goto… :-P).

Vamos a ver cómo hacer éstas y otras funciones con los números de línea desde nuestro editor de texto favorito (emacs, por supuesto).

Contar líneas, palabras, caracteres

Emacs tiene varias funciones para contar líneas y palabras. Unas de las más útiles son:

count-lines-page

que nos muestra el número total de líneas y luego entre paréntesis muestra las líneas antes de la actual y las que hay después (ejemplo: 53 (50 + 3)).

Si queremos contar palabras y caracteres:

count-words

Esto nos indica el número de líneas, de palabras y de caracteres del documento.

Ambas funciones tienen la opción de usarse para una región (i.e., un fragmento de texto seleccionado): count-lines-region y count-words-region.

Mostrar número de línea actual

Si queremos que siempre que escribamos se muestre el número de línea en la barra de estado (modeline) podemos ejecutar en el minibuffer este comando:

line-number-mode

Esta función es de tipo toggle (conmutador), es decir, que cada vez que la ejecutamos conmuta, en este caso, el modo «número de líneas». Así, si la ejecutamos una vez nos indicará que el modo de número de líneas está activado. Si la ejecutamos otra vez lo desactiva. La siguiente lo vuelve a activar, y así sucesivamente.

Con este modo, como decimos, el número de línea aparece en la barra de estado de emacs (modeline).

Conocer la línea actual

Si queremos conocer el número de línea actual y no tenemos activado el modo «line-number-mode» visto antes, podemos ejecutar esta función en el minibuffer:

what-line

y nos lo dirá (¡qué listo que es este editor! ;-)).

También existe la función what-cursor-position, que en este caso nos dirá en qué caracter está el cursor y qué posición ocupa en el documento.

Mostrar números de línea a la izquierda

Si lo que queremos es mostrar a la izquierda el número de la línea podemos usar uno de los muchos modos que han creado otros usuarios. Aquí tenéis una buena descripción de los modos y funciones disponibles referentes a numeración de líneas en emacs. En particular, yo uso yo uso line-num.el.

Este modo muestra, a la izquierda de cada línea, el número de la misma. Si queréis usar este modo, tenéis que tener el fichero con el código (*) del mismo en el directorio $HOME/.emacs.d por un lado y, por el otro, en el fichero $HOME/.emacs.el incluir esta línea

(load "line-num.el")

Una vez hecho esto, para activar el modo en el editor, ejecutaremos esto en el minibuffer:

linum-mode

Esta función activa el modo linum, que es el que nos mostrará los números de línea a la izquierda. Si queremos desactivarlo haremos como en el caso anterior: volver a ejecutarlo, ya que es, también, una función de tipo conmutador.

Cuando usáis este modo, las líneas os aparecen así:

emacs-linum_mode

Espero que os haya resultado útil el artículo. Si tenéis alguna duda o sugerencia dejadme un comentario.

 

(*) Emacs es un editor extensible, al que se pueden añadir infinidad de funciones nuevas usando el lenguaje de programación emacs-lisp. Simplemente cargando al inicio el fichero con el código fuente de dichas funciones ya las tendremos disponbiles para su uso. Asimismo, se pueden cambiar funciones, comportamientos y combinaciones de teclas para personalizarlo y adaptarlo para nuestra comodidad.

Un poco de… Emacs (IV): Comentarios

Si estáis programando es usual y recomendable (en realidad es ¡imprescindible!) añadir comentarios.

Lo normal es que lo hagáis manualmente tabulando vosotros mismos hasta llegar a la posición que os parece correcta, colocar el símbolo que introduce comentario en ese lenguaje y a continuación teclearlo.

Esto, obviamente, es una incomodidad cuando estás programando mucho tiempo. Lo más cómodo es que se haga de forma automática. Emacs, por supuesto, permite esto de forma sencilla como vamos a ver ahora.

Comentario en una línea de código

Estando situados en la línea de código que queremos comentar, pulsamos: M-; (es decir, la tecla ALT y el símbolo «;», para lo cual tendremos que usar la tecla MAY -ya que si no lo hacemos estaríamos tecleando el símbolo «,» en lugar de «;»).

Si queremos descomentar una línea anteriormente comentada pulsamos: C-u M-;

Comentario de una región de código

Seleccionamos un trozo de código y luego pulsamos -igual que antes- M-;

Para descomentar una región de texto anteriormente comentada pulsamos de nuevo: M-;. En este caso, como vemos, no hay que teclear previamente C-u.

Alguien se preguntará, ¿qué símbolo introducirá emacs para indicar que es comentario? ¿El carácter «#»? ¿El carácter «;»? Pues está claro: introducirá el que convenga en cada momento, y eso lo sabe emacs por el modo que se está usando. Así, si abrimos un archivo .c usará «#» y si abrimos un .el usará «;» para un comentario dentro de una línea y «;;» para comentar la línea entera.

Si tenéis alguna duda, curiosidad, información adicional… dejad un comentario (pero en este caso no hace falta pulsar M-;).

Un poco de… Emacs (III): comandos básicos

Algunos lectores me han sugerido que escriba un poco sobre las operaciones y comandos básicos en emacs, ya que les está costando seguir los artículos de esta serie (un poco de… emacs). De hecho, si no has usado nunca antes emacs, cuando trabajas con él la primera vez tienes dificultades para -por ejemplo- salir de la aplicación si no conoces bien el funcionamiento del mismo.

Aunque ya comenté al principio que esta serie no quería que fuera un tutorial de emacs (más que nada, porque existen muchos ya -y muy buenos- por internet (I)), en este artículo voy a explicar algunos de los aspectos más básicos de emacs. Empecemos.

Estructura de emacs

A continuación mostramos una captura de pantalla de emacs, en concreto en su versión 24, aunque es similar que las versiones inmediatamente anteriores:

emacs1

En la parte superior tenemos el menú y justo debajo una barra de herramientas con las opciones usuales (abrir archivo, guardar, cortar, copiar, imprimir…). Justo debajo tenemos la parte más importante de la aplicación, el buffer, que es precisamente donde escribimos (hablamos de esto más abajo).

En la parte inferior de la pantalla tenemos dos líneas: la superior, llamada «modeline», es donde aparecen los datos del estado (nombre del fichero, número de línea, modo activo -ya veremos qué son los modos en otro artículo-); la inferior, llamada minibuffer, se usa para «hablar» con emacs, es decir, para llamar a las funciones (por ejemplo: print-buffer, para imprimir el buffer actual).

Buffers y ficheros

Cuando arrancas emacs, lo que se muestra es un buffer llamado scratch. Un buffer no es más que el texto que se muestra en emacs. Podéis tener varios buffers abiertos, cada uno para una cosa (uno para escribir un documento, otro para probar combinaciones de teclas y funciones de emacs…).

Un buffer puede estar asociado a un fichero o no. Por ejemplo, si abrimos un fichero en emacs (ver apartado «Funciones más usuales en emacs» para ver cómo hacerlo), lo que hará será crear un buffer con el contenido del fichero. Luego, si modificamos el texto y salimos sin guardar, el fichero estará igual que al abrirlo, es decir, no reflejará los cambios, pero si guardamos, lo que hará es copiar el contenido del buffer en el fichero; dicho con otras palabras, guardará el fichero con las nuevas modificaciones (como en cualquier editor de texto).

Se puede tener un buffer para escribir y no guardarlo, que es lo mismo que abrir otro editor/procesador de texto, escribir en un documento nuevo y salir sin guardar.

Combinaciones de teclas

Emacs está pensado para trabajar 100% con el teclado. Se puede usar el ratón, sí, pero lo cierto es que si estás quitando la mano del teclado para coger el ratón «pierdes tiempo». Si por el contrario aprendes a hacer las cosas directamente desde el teclado, aumentas tu productividad.

En emacs la mayoría de las funciones están asociadas a combinaciones de teclas (II). La simbología usada para representarlas es la siguiente:

C-g     --> Pulsas la tecla Control y, sin soltarla, pulsas la tecla G.
C-x C-f --> Pulsas la tecla Control y, sin soltarla, pulsas la tecla X. A 
            continución, pulsas la tecla Control y, sin soltarla, pulsas la tecla 
            F. Esto es lo mismo que pulsar la tecla Control y, sin soltarla, 
            pulsar la tecla X y, a continuación, la tecla F.
M-x     --> Pulsas la tecla ALT y, sin soltarla, pulsas la tecla X.

Cada función hemos dicho que se puede usar mediante su correspondiente combinación de teclas, pero también podemos llamar a la función directamente mediante el uso del minibuffer.

Arrancando y saliendo de Emacs

Para arrancar la aplicación, nada más simple, o bien desde el menú de aplicaciones (normalmente dentro de la categoría utilidades, o editores, o similar), o bien desde la propia línea de comandos (III):

$ emacs

Para salir de la aplicación pulsaremos la combinación de teclas:

C-x C-c

Si hemos hecho alguna modificación (si hemos escrito algo, vaya), nos preguntará si queremos guardar antes de salir, algo que hace cualquier editor que se precie (incluso Word lo hace :-P).

Funciones más usuales en emacs

Abrir archivo: C-x C-f
Guardar archivo: C-x C-s
Guardar archivo como: C-x C-w

Desplazar cursor derecha: C-f
Desplazar cursor izquierda: C-b
Desplazar cursor línea abajo: C-n
Desplazar cursor línea arriba: C-p
Desplazar cursor principio línea: C-a
Desplazar cursor final línea: C-e

Avanzar cursor una palabra: M-f
Retroceder cursor una palabra: M-b
Situar cursor al principio del texto: M-<
Situar cursor al final del texto: M->

Imprimir buffer actual: M-p
Eliminar buffer actual: C-x k    (IV)
Entrar en el minibuffer para introducir comandos: M-x
Cancelar combinación de teclas: C-g

Muchas combinaciones de teclas, aunque os resultarán extrañas al principio, están estudiadas para que sean sencillas de usar sin necesidad de levantar las manos del teclado. Por ejemplo, para desplazarnos por el documento podemos usar los cursores, pero tenemos que levantar la mano de la posición normal para usarlos. Además, las combinaciones de teclas, en la medida de lo posible, usan un carácter que recuerda la función que realizan. Por ejemplo:

C-f (move Forward)
C-b (move Backward)
C-n (move Next line)
C-p (move Previous line)

Se pueden realizar muchas opciones con los frames y ventanas de forma que podéis dividir una ventana en 2 horizontalmente, abrir un buffer distinto en cada uno, dividir de nuevo verticalmente… pero no vamos a entrar en estos detalles ya que esto pretende ser una pequeña introducción. Otro artículo hablaremos, si procede, de la gestión de frames y ventanas con emacs.

NOTA: Aunque aquí pongo la combinación de teclas, tened en cuenta que cada función tiene un nombre y que podéis ejecutarla directamente en el minibuffer. Obviamente, para las opciones más usuales, lo suyo es usar una combinación de teclas para agilizar, pero si no conocéis la combinación de teclas o bien no hay ninguna asociada, podéis usar la función en el minibuffer. Por ejemplo, para imprimir el buffer podéis introducir la función «print-buffer» (para entrar en el minibuffer podéis pulsar M-x). Otra función que os puede resultar curiosa es «tetris», sin las comillas (que os divirtáis ;-)).

Si comenzáis con una combinación de teclas o bien entráis en el minibuffer y os dáis cuenta que queréis cancelar, que no queréis ejecutar la función que habíais pensado, podéis usar C-g (muy útil).

¿Necesitáis ayuda en emacs?

Como se comenta en la nota (I), existe un tutorial que podéis seguir para adquirir los conceptos básicos (algo como lo que he intentado transmitiros aquí). Podéis acceder a él pulsando C-h t

Si queréis saber qué función realiza una combinación de teclas podéis usar esta función en el minibuffer (ya sabéis: pulsando M-x váis al minibuffer (V)): where-is. Por ejemplo:

where-is <INTRO> print-buffer

os motrará esto:

Print buffer is on M-p.

También os dice cómo encontrar la función dentro de los menús de la aplicación.

Si, por el contrario, queréis saber qué función hay asociada a una combinación de teclas, usaréis la siguiente función: describe-key. Ejemplo:

describe-key <INTRO> M-p

que abrirá otro buffer (en un frame nuevo -veremos esto en otro artículo-) mostrándonos la información requerida.

También es posible que nos suene un comando, una palabra, pero no sabemos ni la combinación de teclas ni el nombre exacto de la función. En este caso podemos usar la función «apropos». Ejemplo:

apropos <INTRO> print

Esto nos mostrará todas las funciones que contienen «print» en ella.

Conclusión

Con este pequeño artículo quería mostraros unas pequeñas pinceladas sobre cómo funciona emacs. Obviamente, me he dejado muchas, muchísimas cosas en el tintero, pero para una introducción sencilla creo que no son necesarias (echarían a muchos para atrás ;-)).

A partir de aquí, si os pica el gusanillo de emacs, podéis echarle un vistazo al tutorial de emacs (recordad: C-h t). En internet tenéis mucha información. También hay libros, de los que yo os recomiendo «Learning GNU Emacs -Third Edition-«.

En esta misma web intentaré escribir de vez en cuando -cuando el tiempo me lo permita-, artículos sobre emacs, sobre cosas concretas, así que si os gusta emacs… ¡no os los perdaís! 😉

Por último, os dejo una hoja de referencia con las combinaciones de teclas y más usuales para que la imprimáis y la tengáis cerca de vuestro equipo para consulta. Es la que viene con la propia instalación de emacs. Aquí la tenéis de la página oficial de GNU, donde viene la misma hoja pero en plan… «envejecido» (cosas de RMS).

 

(I) Además, el propio emacs tiene su tutorial al que se puede acceder pulsando C-h t.

(II) En cualquier caso, las que no lo están también se pueden asociar a las combinaciones que queramos. También se pueden cambiar las asociaciones de teclas por defecto. Todo es personalizable, incluso en tiempo real (sin tener que salir de la aplicación, modificar configuraciones, recompilar, etc.). Esto es, sin embargo, materia para otros artículos.

(III) El «$» al principio, por si alguien se pierde, es el prompt de la línea de comandos. Es como el «C:\>» de Windows. A continuación del mismo escribimos los comandos que queremos ejecutar.

(IV) (Control y X al mismo tiempo, soltamos ambas y pulsamos «K»)

(V) En el minibuffer, de forma similar a como sucede en la consola de Linux, se puede usar el tabulador para autocompletar el comando. Así, si escribir «print» y le dáis al tabulador os dará como opciones «buffer» y «region». En cuanto pulséis las teclas suficientes para que sepa cuál queréis podéis pulsar de nuevo tabulador y se completará entera. Así, si pulsáis «print», le dáis a tabulador, y escribís «b», se completará a «print-buffer».

 

Un poco de… Emacs (II): selección rectangular

En esta segunda entrega vamos a explicar cómo realizar selecciones rectangulares de texto. ¿Para qué puede servirnos esto? Imaginaos que tenéis un listado de un directorio tal como éste:

listado

y queréis seleccionar las columnas 4, 5 y 6 del mismo para las líneas que van desde «zip» a «zipnote», por ejemplo. Es decir, queréis esto:

184K jul 1 
 85K jul 1 
2,9K ago 14 
159K ago 14 
 80K jul 1

La forma de hacerlo es la siguiente: os situáis al principio del bloque queréis (es decir, justo antes de 184K), pulsáis Control+Espacio para marcar inicio de selección de texto, os situáis entonces al final del bloque (es decir, justo después del 1 de la línea 80K jul 1) y pulsáis Control+x r k. Con esto, habéis cortado el bloque rectangular. Para pegarlo en otro lugar pulsáis Control+x r y.

El resto de comandos que os puede interesar sobre la selección rectangular son éstos:

 C-x r k  Cortar rectángulo (lo mandamos a un kill ring especial -no el normal)             Función kill-rectangle (*).

 C-x r d  Borrar rectángulo. Función delete-rectangle.

 C-x r c  Limpia rectángulo. Función clear-rectangle.

 C-x r o  Abre un rectángulo en la posición que marquemos (inserta un rectángulo            en blanco). Función open-rectangle.

 C-x r y  Pegar rectángulo.

 

(*) Como sabéis, cada acción que ejecutáis en emacs (incluso escribir una letra) tiene una función asociada que podéis llamar directamente desde el minibuffer pulsando M-x. Os iré mostrando, en la medida de lo posible, las funciones asociadas a los comandos que muestre en sucesivos artículos de esta serie.

Un poco de… Emacs (I): copiar y pegar en emacs

Comenzamos una nueva sección en la que hablaremos sobre el magnífico editor de texto llamado emacs (GNU/Emacs para los más puristas).

Emacs es un editor de texto creado, entre otros, por Richard Stallman. Es parte del proyecto GNU y cuenta con una cantidad de funciones abrumadora. Está pensado para ser usado con el teclado exclusivamente (aunque se puede usar el ratón también) de forma que las funciones del mismo están asociadas a combinaciones de teclas. De esta forma, podemos trabajar rápida y eficientemente sin tener que levantar las manos del teclado.

La curva de aprendizaje es un poco dura, por lo que si no os gusta trabajar con combinaciones de teclas y preferís en su lugar un editor sencillo tipo «bloc de notas», mejor no perdáis el tiempo.

Ahora bien, si os gustaría aumentar vuestra productividad en el manejo de texto plano así como disponer de funcionalidades ilimitadas (*), no lo dudéis: probad emacs!

En Internet hay muchos tutoriales sobre iniciación a emacs (**) por lo que aquí no voy a explicar los aspectos básicos del mismo (***) sino que, en cada entrega, os mostraré funcionalidades útiles a la hora de trabajar con este editor.

En este artículo os voy a comentar cómo copiar y pegar en Emacs.

Emacs usa un «portapapeles» especial llamado ring (anillo), que es independiente del de GNU/Linux o Windows. Esto puede ocasionar algún problema a la hora de copiar/pegar en otras aplicaciones (tal y como hacemos usualmente con procesadores de texto, por ejemplo). Ahora os cuento cómo solucionar esto.

Lo primero que debéis saber es que para copiar en emacs primero tenéis que seleccionar el texto. Para ello nos situamos al principio del texto a seleccionar y pulsamos Control + Espacio, nos vamos al final del texto y pulsamos Alt + W. Con esto copiamos el texto. Si lo que queremos es cortar, en lugar de pulsar Alt + W pulsaremos Control + W. Para pegarlo en otro lugar pulsaremos Control + Y.

Antes os comentaba que si copiáis en emacs, no podréis pegar en otra aplicación. Para solucionar esto tenéis que añadir unas líneas en el archivo .emacs.el. Éste es el archivo de configuración de la aplicación, reside -como es usual- en el home del usuario y se ejecuta cada vez que arrancamos la aplicación. En él se encuentran las personalizaciones que queramos hacer a la aplicación (colores, combinaciones de teclas, funciones nuevas…).

Las líneas a añadir en este archivo para que podamos copiar/pegar desde (y hacia) son las siguientes:

(global-set-key "\C-w" 'clipboard-kill-region)
(global-set-key "\M-w" 'clipboard-kill-ring-save)
(global-set-key "\C-y" 'clipboard-yank)

Una cosa importante a tener en cuenta. Emacs se puede usar tanto en modo gráfico como en modo texto (para esto último ejecutaríamos emacs -nw), es decir, o bien se nos abre una ventana con la aplicación o bien, si lo llamamos desde un terminal con la opción -nw, se nos abre la versión en modo texto en la misma ventana de la consola.

En este úlitmo caso (emacs abierto en modo consola), no os funcionará el copy/paste entre aplicaicones de la forma anterior, ya que la gestión del portapapeles se realiza a través de las aplicaciones gráficas y no desde la consola. Para solucionar esto, cuando estéis en emacs (o en cualquier otra aplicación de la consola) podéis usar las siguientes combinaciones de teclas:

Control + Mayúsculas + C           (copiar)
Control + Mayúsculas + V       (pegar)

Espero que os haya resultado útli el artículo. ¡Hasta el próximo!

 

(*) Fijaos que no entrecomillo la palabra ilimitadas, y es que en emacs podemos crear nuestras propias funciones y asociarlas a combinaciones de teclas incluso, de forma que el editor se adapte a cualquier necesidad que se nos pueda ocurrir. Para esto se usa Emacs Lisp, que es un dialecto de Lisp específico para GNU Emacs.

(**) No incluyo referencias concretas porque son muchísimas las webs que ofrecen información interesante y útil sobre emacs, tanto para usuarios nuevos como para avanzados, así que os invito a que busquéis en Google (por ejemplo: «tutorial emacs», o «iniciación emacs»… -sin las comillas-) y elijáis la(s) que más os guste(n).

(***) En el propio emacs tenéis un tutorial de iniciación donde se os explican los aspectos fundamentales del editor y cómo empezar a trabajar con él. Para acceder a él bastará con arrancar el programa emacs: en la pantalla de bienvenida (ver captura siguiente) tenéis un enlace al mismo (situáis el cursor encima del enlace «Emacs Tutorial»).

emacs