Archivo

Archivo para la categoría ‘Emacs’

Las teclas que utilizo más frecuentemente en Emacs / Guía para principiantes

Sábado, 11 de Diciembre de 2010 Gaspar Fernández 3 comentarios

Hace unos días hablé de la importancia de conocer los atajos de teclado de tu IDE favorito; hoy hablaré de las teclas que más utilizo en el mío, Emacs, y de paso hago una pequeña guía para principiantes en este editor.

I. Un apunte básico del uso del teclado en Emacs

Lo primero que hay que mencionar es que hay muchas combinaciones con la tecla Control y Alt (o Meta), cuando una tecla, por ejemplo, la “x” se pulsa junto con Control diremos C-x y cuando esa misma tecla la pulsamos junto con Alt diremos M-x cuando pulsamos una combinación por ejemplo (M-g) y luego tenemos que soltar las teclas y pulsar una tecla sola, por ejemplo, otra g, diremos (M-g g), lo mismo vale con combinaciones, si tenemos que pulsar primero C-x y luego C-c diremos: “C-x C-c”

Si por alguna casualidad no podemos pulsar la tecla Meta, o una combinación (como sucede en algunos tipos de terminales remotos), podemos, para pulsar M-x, pulsar “Escape x”

II. Acceder al comando que queremos ejecutar

Una de las muchas cosas buenas que tiene Emacs es que todo lo que podemos hacer por teclado tiene un comando asociado, incluso para muchas acciones que no tienen tecla asociada. Por otra parte, también tenemos que decir que las teclas se pueden personalizar, por lo que estas teclas que diré (si no digo lo contrario) son las que vienen por defecto, y que casi todos los usuarios mantenemos porque suelen ser cómodas de pulsar, aunque en algunas ocasiones serían cómodas en un teclado inglés… pero te terminas acostumbrando.

Como iba diciendo, para ejecutar un comando debemos pulsar M-x y podremos, desde el minibuffer escribir el comando que queremos ejecutar, eso sí, disponemos de completion por lo que en cualquier momento podemos pulsar tab y veremos las posibilidades que tenemos. Incluso podemos pulsar M-x tab y veremos todas las posibilidades que tenemos, hay que recordar que podemos cargar extensiones y éstas pueden añadir comandos nuevos. Es más, la lista de comandos se abrirá en un nuevo buffer de Emacs, con lo que podremos buscar en ese buffer (no siempre nos acordamos de cómo empieza un comando). Para buscar también podemos hacer M-h a.

III. Me he equivocado con tanta combinación de teclas. ¿ Qué hago ?

Pulsar C-g en cualquier momento, eliminará todo lo que hemos pulsado hasta ahora. Es cierto, que a veces hay combinaciones demasiado largas, o en ocasiones hemos empezado a pulsar algo y nos arrepentimos, bien C-g es la solución para seguir por donde estábamos.

También podemos pulsar C-g si queremos cancelar una acción en curso, como por ejemplo salir, cuando tenemos muchos buffers abiertos y nos pregunta si queremos guardar o no, podemos pulsar C-g para que deje de preguntar por archivos y no salir del programa.

IV. Comandos básicos de un editor de texto

  • Abrir archivo: C-x C-f nos preguntará qué archivo abrir, podemos navegar por directorios desde el minibuffer, tenemos además la posibilidad de completar el nombre del archivo. (A lo bash)
  • Nuevo archivo: C-x C-f ¡ igual que antes ! y es que no hacemos nada diferente, abrimos un nuevo buffer. El archivo no se creará hasta que no lo salvemos por primera vez, así que, sin problema.
  • Salvar archivo: C-x C-s Salvamos el archivo con el nombre que tiene.
  • Salvar como: C-x C-w Nos pregunta con qué nombre nuevo queremos salvar el archivo
  • Salir: C-x C-c Salimos, nos preguntará
  • Buscar un texto: C-s (busca hacia adelante) C-r (busca hacia atrás) La primera vez que pulsamos cualquiera de las teclas, nos preguntará qué texto buscar, luego podemos jugar y buscar adelante y atrás como queramos.
  • Deshacer: Es posíblemente la opción peor implementada en Emacs, pero a veces hace el apaño. Podemos pulsar C-x u para deshacer un carácter o C-u C-x u para deshacer un conjunto de caracteres.
  • Seleccionar texto: Podemos hacerlo con el ratón o pulsar C-espacio, soltar y movermos con las teclas (flechas, re-pag, av-pag, inicio, fin y combinaciones.
  • Copiar: Con un texto seleccionado, pulsamos M-w
  • Cortar: Con un texto seleccionado, pulsamos C-w
  • Pegar: Pulsar C-y, pero si queremos pegar alguno de los textos copiados antes del último, justo después de C-y pulsamos M-y, e iremos navegando por todo lo que hemos ido copiando anteriormente.
  • Cambiar de ventana: C-b y seguidamente escribimos el nombre del fichero que queremos editar (de los que previamente están abiertos. O también C-x C-b para ver un listado de ficheros abiertos.
  • Cerrar buffer: C-x k Cerramos el buffer abierto ahora mismo, si correspondía con un fichero y no hay más buffers con ese fichero abierto, cerraremos el fichero y si tiene algún cambio, nos preguntará si queremos salvarlo.

V. Comandos para movernos más rápidamente

Algunos de estos son utilizados en más lugares:

  • C-k Elimina desde la posición actual del cursor hasta fin de línea. Estamos cortando el texto, por lo que la línea se copiará automáticamente.
  • M-< Saltamos al principio del buffer
  • M-> Saltamos al final del buffer
  • C-arriba / C-abajo : Nos moveremos verticalmente en bloques, es decir entre líneas en blanco o entre funciones, entre comentarios, etc
  • C-l Centra el buffer actual en la posición del cursor. Si se nos ha perdido el cursor es muy útil, o si estamos leyendo un documento.
  • M-g g nos preguntará a qué línea nos queremos ir del texto.
  • C-x h Selecciona el buffer completo
  • M-h Selecciona el párrafo actual

VI. Visualizando varios buffers a la vez

Emacs nos permite, en la misma ventana (aunque aquí se llame frame) tener varios cuadros de texto (que Emacs llama windows):

  • C-x 2 dividimos horizontalmente la pantalla, para tener un buffer arriba y otro abajo
  • C-x 3 dividimos verticalmente la pantalla, así tenemos un buffer a la derecha y otro a la izquierda.
  • C-x 0 (cero) eliminamos el buffer seleccionado
  • C-x o (letra O) cambiamos de buffer, nos vamos al de al lado, aunque también podemos seleccionarlos con ratón

VII. A la hora de programar nos será muy útil…

  • C-; Si tenemos un texto seleccionado, comentará ese texto, si no introducirá un comentario al final de la línea.
  • C-M-@ Si tenemos un texto seleccionado, se auto-indentará todo dependiendo del lenguaje de programación que estemos escribiendo.
  • M-/ Se completará automáticamente la palabra que estamos escribiendo ahora mismo.
  • Cuando hacemos C-espacio, C-s, C-r, etc vamos a irnos a otra posición diferente a la que estábamos, por lo que necesitamos una tecla para regresar: C-x C-x ; es útil cuando programamos y tenemos que escribir algo arriba del todo, y luego regresar a la línea donde seguimos escribiendo.
  • C-x r espacio Nos hará una pregunta, pulsamos una letra cualquiera, por ejemplo a. Guardará la posición en esa a
  • M-x register-to-point Nos preguntará una posición, por ejemplo, la de antes: a; y nos lanzará a esa parte del texto. (Podremos vincularlo a una tecla si lo usamos bastante.

Aunque parece que tenemos que estudiar para utilizar el editor, basta con una semana para habituarse a las teclas básicas, y poco a poco, llamando a los comandos M-x  indent-region (por ejemplo) nos dirá la tecla que debemos pulsar para acceder rápidamente.

Sustituyendo texto con expresiones regulares en EMACS

Domingo, 18 de Julio de 2010 Gaspar Fernández Sin comentarios

regular_expression

Una de las herramientas más utilizadas (por mí al menos) es la de reemplazar texto. En EMACS la podemos encontrar con:

M-x replace-string

Con esta orden podemos cambiar un texto por otro dentro de un buffer o una selección. Hasta aquí bien. Pero alguna vez nos podemos encontrar con un texto que debemos reemplazar por otro, y aunque no es exactamente igual en todos los reemplazos que tenemos que hacer sigue una cierta lógica.

Imaginemos que tenemos este código en PHP (Gracias Antonio):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
switch ($pregunta) {
    case 0: $preg="<br><br>¿Qué significa PHP?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. Power H Processor</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. PHP: Hypertext Preprocessor</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. Para Hacer Poco</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. PHP: Harvard Preprocessor</a><br>";
            break;

    case 1: $preg="<br><br>¿Dónde se ejecuta PHP?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. En el Cliente</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. En algún lugar de la Mancha...</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. En el Servidor</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. Ninguna de las anteriores</a><br>";
            break;

    case 2: $preg="<br><br>¿Cuál de las siguientes variables NO existe como predefinida en PHP?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. PTTS_BOOK</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. PHPSESSID</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. REQUEST_METHOD</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. REMOTE_ADDR</a><br>";
            break;

    case 3: $preg="<br><br>¿Quién creó PHP?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. Rasmus Lerdorf</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. Obi One Kenobi</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. Bill Gates</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. Andrew S. Tanenbaum</a><br>";
            break;

    case 4: $preg="<br><br>¿Con qué <i>marca</i> habrá un salto de línea en el código fuente?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. \\t</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. \\n</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. &lt;br&gt;</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. \\g</a><br>";
            break;

    case 5: $preg="<br><br>¿Cuál de las siguientes funciones NO se puede acceder al servidor de datos MySQL?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. mysql_query</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. mysql_connect</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. mssql_connect</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. mysql_pconnect</a><br>";
            break;

    case 6: $preg="<br><br>¿Cuál es la frase correcta?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. setcookie() puede ser llamada desde cualquier parte del documento HTML</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. Las cookies sólo se pueden mandar antes de mandar cualquier otra cabecera</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. Las cookies no son parte de la cabecera HTTP</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. El perro de San Roque no tiene rabo, porque el Chiquito se lo ha robado</a><br>";
            break;

    case 7: $preg="<br><br>¿La función ftp_get?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. Sube un fichero al servidor FTP</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. Establece una conexión FTP</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. Descarga un fichero del servidor FTP</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. Devuelve el nombre del directorio actual</a><br>";
            break;
}

Y queremos sustituirlo por este otro:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
addPregunta($pregresp, "¿Qué significa PHP?", "a. Power H Processor", "b. PHP: Hypertext Preprocessor", "c. Para Hacer Poco", "d. PHP: Harvard Preprocessor");

    addPregunta($pregresp, "¿Dónde se ejecuta PHP?", "a. En el Cliente", "b. En algún lugar de la Mancha...", "c. En el Servidor", "d. Ninguna de las anteriores");

    addPregunta($pregresp, "¿Cuál de las siguientes variables NO existe como predefinida en PHP?", "a. PTTS_BOOK", "b. PHPSESSID", "c. REQUEST_METHOD", "d. REMOTE_ADDR");

    addPregunta($pregresp, "¿Quién creó PHP?", "a. Rasmus Lerdorf", "b. Obi One Kenobi", "c. Bill Gates", "d. Andrew S. Tanenbaum");

    addPregunta($pregresp, "¿Con qué <i>marca</i> habrá un salto de línea en el código fuente?", "a. \\t", "b. \\n", "c. &lt;br&gt;", "d. \\g");

    addPregunta($pregresp, "¿Cuál de las siguientes funciones NO se puede acceder al servidor de datos MySQL?", "a. mysql_query", "b. mysql_connect", "c. mssql_connect", "d. mysql_pconnect");

    addPregunta($pregresp, "¿Cuál es la frase correcta?", "a. setcookie() puede ser llamada desde cualquier parte del documento HTML", "b. Las cookies sólo se pueden mandar antes de mandar cualquier otra cabecera", "c. Las cookies no son parte de la cabecera HTTP", "d. El perro de San Roque no tiene rabo, porque el Chiquito se lo ha robado");

    addPregunta($pregresp, "¿La función ftp_get?", "a. Sube un fichero al servidor FTP", "b. Establece una conexión FTP", "c. Descarga un fichero del servidor FTP", "d. Devuelve el nombre del directorio actual");

    addPregunta($pregresp, "¿Con qué función se puede eliminar una variable de sesión?", "a. session_unregister", "b. session_destroy", "c. session_register", "d. jam_session");

    addPregunta($pregresp, "¿Con que harías un buen bocadillo...?", "a. Con pavo de ese que tiene trozos de colores", "b. Con un milagro", "c. Con habichuelas", "d. Con las manos");

El switch podemos quitarlo a mano, y en este ejemplo, tal vez para 7 preguntas, podríamos hacerlo a mano, aunque si fuera alguna más, nos pensaríamos este nuevo método.

Bien, en EMACS, tenemos la siguiente herramienta:

M-x regexp-builder

Que nos seleccionará el texto que corresponde con la expresión regular que estemos construyendo, y nos ayudará a generar una expresión más compleja, en definitiva queremos que la expresión cubra todos los cases, para continuar la lectura del post, nos fijamos en el primero:

1
2
3
4
5
6
case 0: $preg="<br><br>¿Qué significa PHP?<br>";
            $resp="<a href=".$_SERVER['PHP_SELF']."?respuesta=1>a. Power H Processor</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=2>b. PHP: Hypertext Preprocessor</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=3>c. Para Hacer Poco</a><br>".
                  "<a href=".$_SERVER['PHP_SELF']."?respuesta=4>d. PHP: Harvard Preprocessor</a><br>";
            break;

Para construir la expresión, hay mucho copy-paste, además, desde Linux podemos seleccionar texto y pegarlo con el botón central del ratón, lo que nos facilita mucho la vida. Por otra parte, hay que tener en cuenta que tenemos que escapar muchos caracteres (como “, [, (, ), ], ?), de todas formas, nos vamos dando cuenta de eso al construir la expresión, si EMACS no selecciona un carácter como correspondiente a la expresión, lo más normal es que tengamos que escaparlo, también, tenemos que tener en cuenta que un espacio en blanco se representa aquí como [:space:]. Con todo esto, construimos la siguiente expresión:

“case [0-9]: $preg=\”

[a-zA-Z_.\<\>\/\¿\?áéíóú[:space:]]*
\”;
[[:space:]]*$resp=\”[\\_()a-zA-Z,\:áéíóú&;[:space:]\.]+
\”.
[[:space:]]*\”[\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+
\”.
[[:space:]]*\”[\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+
\”.
[[:space:]]*\”[\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+
\”.
[[:space:]]*break;

Se seleccionarán todos los case, ahora copiamos la expresión para luego pegarla para reemplazarla. Aunque antes, tenemos que fijarnos en una cosa, en cada línea que queremos sustituir hay fragmentos de texto que queremos que figuren en la cadena sustituida, queremos hacerlo también automáticamente, eso lo conseguimos poniendo entre paréntesis en la expresión anterior las cadenas que vamos a aprovechar del texto que vamos a sustituir. La dejamos así:

case [0-9]: $preg=\”

\([a-zA-Z_.\<\>\/\¿\?áéíóú[:space:]]*\)
\”;
[[:space:]]*$resp=\”\([\\_()a-zA-Z,\:áéíóú&;[:space:]\.]+\)
\”.
[[:space:]]*\”\([\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+\)
\”.
[[:space:]]*\”\([\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+\)
\”.
[[:space:]]*\”\([\\_()a-zA-Z,&áéíóú\:;[:space:]\.]+\)
\”.
[[:space:]]*break;

Ahora llamamos a la siguiente orden:

M-x replace-regexp

Introducimos como expresión la última que hemos hecho (la de los paréntesis, marqué en negrita los textos que queremos conservar). Y la sustituimos por lo siguiente:

addPregunta($pregresp, “\1″, “\2″, “\3″, “\4″, “\5″);

Vemos que es una función a la que le pasamos una variable y después cinco textos, el primer texto (\1), coincidirá con la pregunta (en el código de los cases), y desde el segundo (\2) hasta el quinto (\5) coincidirá con cada una de las cuatro posibles respuestas.

Una vez hecho esto se sustituirán todo el código de los cases, por el de la función addPregunta() con los textos correspondientes.

Tal vez este ejemplo haya sido un poco grande, pero las expresiones regulares son muy útiles, seguro que casi a diario encontráis la necesidad de hacer algo parecido a esto en vuestro editor de texto.

Referencias:
Text Pattern Matching in EMACS
Regexp Replace - GNU Emacs

Foto: fdecomite (Flickr)

EMACS: Cambiando la codificación

Miércoles, 12 de Mayo de 2010 Gaspar Fernández Sin comentarios

Es muy común, sobre todo en trabajos colaborativos, que cada persona trabaje en una codificación diferente (casi siempre porque se usan programas diferentes para editar, y poca gente se para a cambiar la codificación por defecto). Por ejemplo, hay quienes guardan todos sus archivos en iso-8859-1 o iso-8859-15, incluso utf-8. Pero llega el momento en que se edita el archivo de otra persona, y esas codificaciones producen extraños comportamientos en la ejecución.

Una solución desde EMACS sería:
M-x set-buffer-line-coding-system RET [codificación, TAB para ver opciones] RET

O también podemos utilizar la recla rápida:
C-x RET f [codificación] RET

Ya podemos salvar el archivo (C-x C-s) y seguir trabajando.

Contar letras (caracteres) en EMACS

Miércoles, 14 de Abril de 2010 Gaspar Fernández Sin comentarios

letrasHay ocasiones en las que, cuando estamos escribiendo en nuestro editor de texto, necesitamos saber cuántas letras tiene un texto seleccionado.

Podemos hacerlo a la antigua usanza (la mayoría de los editores nos dicen el número de línea y carácter donde está el cursor, pues miramos al final del texto y al comienzo y restamos. Aunque emacs tiene un comando específico que nos hará esa tarea más fácil.

M-x count-lines-region

Nos devolverá el número de líneas y caracteres que tiene un texto seleccionado, como carácter se cuenta también el retorno de carro.

Por cierto, también dispone de tecla rápida: M-=

Foto: Laineys Repertoire (Flickr)

Categories: Emacs Tags: , , , ,

Abbrev mode para EMACS (utiliza abreviaturas)

Martes, 13 de Abril de 2010 Gaspar Fernández Sin comentarios

perritoCuando estamos programando, normalmente hay palabras o bloques de texto que tenemos que repetir varias veces. Por ejemplo:

  • Cuando creo una función, tengo un bloque grande de comentarios para Doxygen. Crear esos comentarios, cuando lo haces 20 ó 30 veces ya resulta pesado.
  • Cuando creo una clase, pasa exactamente lo mismo que antes.
  • Suelo escribir los nombres y los mails de las personas que intervienen en el proyecto, uso atajos: “Gaspar@” devolverá mi nombre y mi mail.
  • Mientras documentamos el código hay muchas palabras/frases que repetiremos y algunas muy largas.
  • A medida que vayamos escribiendo código nos vamos dando cuenta de las cosas que repetimos y queremos hacerlo con menos pulsaciones de teclado (lo que nos ahorrará mucho tiempo).

Aunque este modo tiene unos atajos de teclado algo complicados (aunque con cierta lógica), tenemos que tener en cuenta que tenemos dos formas de añadir una abreviatura: global, y asociada al modo actual (más o menos es el lenguaje en el que estamos escribiendo). Por tanto si queremos añadir una abreviatura a un texto que tenemos escrito:

  1. Lo seleccionamos.
  2. Si queremos que sea una abreviatura global pulsamos (C-x a g) o M-x add-global-abbrev
  3. Si queremos que sea una abreviatura local asociada al modo actual pulsamos (C-x a l) o M-x add-mode-abbrev

De todas formas yo prefiero escribirlas directamente de la siguiente manera:

  • M-x edit-abbrevs
  • Debajo del modo que escoja escribo:
    “palabracorta” 0 “expansión que deseo que salga después de la palabra corta”
  • C-x C-s (Lo de siempre para salvar)

El cero que he puesto entre la palabra corta y la expansión es el número de veces que la he utilizado. Si después de un día de trabajo acudimos a las abreviaturas con M-x list-abbrevs veremos cómo ese número va variando, es el número de veces que hemos utilizado cada abreviatura, esto nos permite saber cuáles son las más usadas, y podremos borrar si queremos las que no hayamos utilizado.

Por otra parte, tenemos el autocompletado de las palabras, y esto es que, pulsando una combinación de teclas (normalmente M-/, un poco incómodo sobre todo en portátiles), la palabra que tenemos escrita parcialmente se completará con alguna coincidencia de palabras escritas en el buffer actual.

Si queremos mapear ese autocompletado con otra combinación de teclas (Yo tengo C-_) podemos escribir lo siguiente en nuestro archivo .emacs:

(global-set-key (kbd “C-_”) ‘dabbrev-expand)

Foto: exfordy (Flickr)

Plantillas en EMACS

Viernes, 9 de Abril de 2010 Gaspar Fernández Sin comentarios

pie-grandeEs la primera entrada de mi editor de texto favorito.

Cuando pasas gran parte del día editando archivos, es muy útil que al empezar un fichero nuevo haya algo escrito, algo que siempre toca escribir a mano, unos pocos comentarios donde dices más o menos de qué va lo que hay en el fichero y poco más.

Casi todos los editores modernos disponen de esa característica y emacs no iba a ser menos, sólo que hay que instalar una extensión (se puede hacer sin necesidad de extensiones, pero hace falta programar un poco y lo que queremos es una solución rápida que nos permita seguir trabajando en lo realmente importante), después de probar dos o tres, me quedo con emacs-template, es fácil de instalar y de configurar. Sólo hay que hacer lo siguiente:

  1. Descargar de la página oficial de emacs-template.
  2. Descomprimir en un directorio (yo lo hice en ~/.emacs_loadpath/
  3. Compilar template.el (recomendable), para ello dentro de emacs hacemos: M-x byte-compile-file y luego buscamos el archivo template.el; generaremos template.elc
  4. Copiamos template.elc a ~/.emacs_loadpath/
  5. Copiamos el contenido de templates a ~/.templates/ ; al descomprimir el archivo habrá un directorio templates con algunos archivos, tendremos que copiarlas al nuevo directorio.
  6. Editar .emacs para cargar la extensión:

Dentro de ~/.emacs debemos escribir lo siguiente:

(add-to-list ‘load-path “~/.emacs_loadpath/”)

Para buscar en el directorio donde hemos copiado template.elc

(template-initialize)

Para cargar la extensión. A partir de este punto, cuando creemos un archivo: C-x C-f archivo.c (por ejemplo) habrá algunas líneas pre-escritas.

Las plantillas las encontramos en ~/.templates/ y aunque vienen pocas, podemos crear todas las que queramos situándolas en ese directorio. Por otra parte, tenemos la posibilidad de introducir palabras clave dentro de la plantilla que se traducirán por el valor correspondiente como por ejemplo:

  • (>>>DATE<<<) : La fecha actual
  • (>>>AUTHOR<<<) : Tu nombre e email
  • (>>>FILE<<<) : El fichero que estamos editando
  • (>>>POINT<<<) : El punto donde el usuario empezará a editar, muy útil por ejemplo para archivos HTML donde escribimos todas las cabeceras, los pies, y tenemos que situarnos en medio para empezar; aunque lo podemos extender a todos los lenguajes.
  • Y muchos más. Ver documentación.

Os dejo aquí una pequeña plantilla para PHP.

Pero aún hay más, podemos definir puntos en los que movernos rápidamente para editar, tal vez campos en los que debamos introducir texto y en los que queramos entrar de forma fácil, para ello se definen puntos (>>>0<<<) al (>>>9<<<) y nos podremos ir ahí rápidamente con el comando M-x jump-to-register ( ). (C-x r j), aunque el atajo de teclado no ataja mucho y es algo complicado, yo lo he cambiado por C-a (a porque es una tecla que pilla muy cerca de Control) editando .emacs:

(global-set-key (kbd “C-a”) ‘jump-to-register)

Un detalle más, emacs no cogía bien mi nombre y dirección de correo para usar (>>>AUTHOR<<<), por lo que tuve que hacer una pequeña modificación más a .emacs:

(setq user-mail-address “Gaspar Fernández “)

De esta forma, además, puedo personalizar la dirección de correo, para que a la hora de publicar mis trabajos no me llegue demasiado spam.
Foto: hoyasmeg (Flickr)

Visita otras webs de la red