La tecla Meta
Ha aprendido ya sobre una "tecla modificadora" en Emacs, la tecla |_Control_|. Hay una segunda, llamada la tecla Meta, que se usa casi tan frecuentemente. Sin embargo, no todos los teclados tienen su tecla Meta en el mismo lugar, y algunos ni siquiera la tienen. Lo primero que necesita hacer es encontrar dónde se encuentra su tecla Meta. Es probable que las teclas |_Alt_| de su teclado sean también teclas Meta, si usa un PC IBM o algún otro teclado que tenga una tecla |_Alt_|.
La forma de probar esto es mantener presionada una tecla que crea que puede ser una tecla Meta y teclear "x". Si ve que un pequeño prompt aparece en el minibuffer (como esto: |_M-x_|), entonces la ha encontrado. Para librarse del prompt y regresar al buffer de Emacs, teclee ||_C-g_||.
Si no consigue un prompt, entonces todavía queda una solución. Puede usar la tecla ||_Escape_|| como una tecla Meta. Pero en vez de mantenerla pulsada mientras teclea la próxima letra, tiene que pulsarla y soltarla rápidamente, y entonces teclee la letra. Este método funcionará tenga o no una tecla Meta verdadera, también es la manera más segura para hacerlo. Intente ahora pulsar ligeramente ||_Escape_|| y entonces teclee "x". Debería conseguir otra vez ese pequeño prompt.
Simplemente use ||_C-g_|| para salir. ||_C-g_|| es la manera general en Emacs para salir de algún lugar donde no quiere estar. Los fastidiosos y comunes pitidos son para hacerle saber que ha interrumpido algo, pero está bien, porque es lo que quería hacer cuando tecleó ||_C-g_||4
La notación |_M-x_| es análoga a |_C-x_| (ponga cualquier carácter en el lugar de la "x"). Si ha encontrado una verdadera tecla Meta, use ésta, de otra manera simplemente use la tecla ||_Escape_||. Yo escribiré simplemente |_M-x_| y ud. tendrá que usar su propia tecla Meta.
Cortar, pegar, destruir y tirar
Emacs, como cualquier buen editor, le permite cortar y pegar bloques de texto. A fin de hacer esto, necesita una forma de definir el comienzo y fin del bloque. En Emacs, se hace esto estableciendo dos ubicaciones en el buffer, conocidas como marca y puntero. Para colocar la marca, vaya al lugar donde quiere que comience el bloque y teclee |_C-SPC_| ("SPC" significa ||_Espacio_||, por supuesto).
Debería ver el mensaje "Mark set" (Marca establecida) que aparece en el minibuffer5. Ahora la marca ha sido establecida en ese lugar. No habrá ningún indicador especial destacando este hecho, pero Ud. sabe dónde la ha puesto, y eso es lo que importa.
¿Y qué hay del puntero? Bien, resulta que ha colocado un puntero cada vez que ha movido el cursor, porque "puntero" simplemente se refiere a su ubicación actual en el buffer. En términos formales, el puntero es el punto donde se insertará el texto si escribe algo. Al colocar la marca, y luego moverse al final del bloque, ha definido un bloque de texto. Este bloque es conocido como la región. La región siempre significa el área entre la marca y el puntero.
El sólo hecho de definir la región no la deja disponible para pegar. Tiene que decirle a Emacs que lo copie para poder ser capaz de pegarlo. Para copiar la región, asegúrese de que la marca y el puntero están correctamente establecidos, y teclee |_M-w_|. Ahora ha sido grabada por Emacs. Para pegarlo en alguna otra parte, simplemente vaya allí y teclee ||C-y_||. Esto es conocido como tirar el texto en el buffer.
Si quiere mover el texto de la región a alguna otra parte, teclee |_C-w_| en vez de |_M-w_| Esto matará la región, todo el texto dentro de ella desaparecerá. De hecho, se ha guardado del mismo modo que si hubiera usado |_M-w_|. Puede tirar de nuevo con ||_C-y_||, como siempre. El lugar donde emacs guarda todo este texto es conocido como el círculo de muerte. Algunos editores lo llaman el "porta papeles" o el "buffer de pegado".
Existe otra manera para cortar y pegar: cuando usa |_C-k_| para matar hasta el final de una línea, el texto matado se guarda en el círculo de muerte. Si mata más de una línea seguida, se guardarán todas juntas en el círculo de muerte, para que la próxima tirada pegue todas las líneas al mismo tiempo. Por ello, casi siempre es más rápido usar repetidas veces |_C-k_| para matar algún texto, que establecer la marca y el puntero y usar |_C-w_|. Sin embargo, de una u otra manera funcionará. Es realmente una cuestión de preferencia personal cómo lo hace.
Buscar y reemplazar
Hay varias maneras para buscar texto en Emacs. Muchas son más bien complejas, y no merece la pena tratarlas aquí. La más fácil y la más entretenida es usar isearch.
"Isearch" se refiere a "incremental search" (búsqueda incremental). Supongamos que quiere buscar la cadena "tábano" en el siguiente buffer:
Yo estaba temeroso que nos quedáramos sin gasolina, cuando mi tácito pasajero
exclamó ``Auch un aguijón! Hay un tábano aquí dentro! .
Debería moverse al comienzo del buffer, o por lo menos a algún punto que sabe que está antes de la primera aparición de la palabra, "tábano", y teclear |_C-s_|. Eso le pondrá en el modo de búsqueda isearch. Ahora comience a escribir la palabra que está buscando, "tábano". Pero tan pronto como escribe la "t", ve que Emacs ha saltado a la primera aparición de "t" en el buffer. Si la cita de arriba es todo el contenido del buffer, entonces la primera "t" es de la palabra "temeroso". Ahora escriba la "á" de "tábano", y Emacs saltará sobre "tácito", que contiene la primer ocurrencia de "tá". Y finalmente, "b" consigue "tábano", sin haber tenido que escribir la palabra entera.
Lo que hace en una isearch es definir una cadena para buscarla. Cada vez que agrega un carácter al final de la cadena, el número de posibles cadenas se reduce, hasta que haya escrito lo suficiente para definir la cadena singularmente. Una vez que ha encontrado la palabra, puede salir de la búsqueda con |_Intro_| o cualquiera de los comandos normales de movimiento. Si piensa que la cadena que buscas esta atrás en el buffer, entonces debería usar |_C-r_|, que hace isearch hacia atrás.
Si encuentra una palabra, pero no es la que buscaba, entonces presione |_C-s_| nuevamente mientras todavía esté en la búsqueda. Esto le moverá hasta la próxima palabra coincidente, cada vez que lo haga. Si no existe una próxima palabra, dirá que la búsqueda fracasó, pero si presiona |_C-s_| nuevamente en este punto, la búsqueda volverá a comenzar desde el principio del buffer. Se puede decir lo opuesto de |_C-r_| comienza al final del buffer.
Intente introducir un buffer de texto en inglés y haga un isearch para la cadena "the". Primero teclee todos los "the" que quiera y luego use |_C-s_| para ir a todas las apariciones. Note que también aparecerán palabras como " them", dado que también contiene la subcadena "the". Para buscar un único "the", deberá agregar un espacio al final de la cadena de búsqueda. Puede agregar nuevos caracteres a la cadena en cualquier punto de la búsqueda, después tiene que presionar |_C-s_| repetidamente para encontrar las próximas palabras coincidentes. Puede usar también la |_Retroceso_| o ||_Supr_|| para quitar caracteres de la cadena en cualquier punto de la búsqueda, y presionando |_Intro_| sale de la búsqueda, dejándole en la última coincidencia.
Emacs también permite reemplazar todas las apariciones de una cadena con alguna nueva cadena, esto es conocido como query-replace (preguntar-reemplazar). Para invocarlo, teclee query-replace y |_Intro_|.
Como se hace terminación automática sobre el nombre del comando, una vez que has escrito "query-re", puede simplemente presionar |_Tab_| para terminarlo. Digamos que desea reemplazar todas las ocurrencias de "tábano" por "mosca". En el prompt "Query replace: " (preguntar-reemplazar), escriba "tábano", y presione |_Intro_|. Entonces aparecerá el prompt nuevamente, y deberá introducir "mosca". Entonces Emacs recorrerá el buffer, parando a cada aparición de la palabra "tábano", y preguntando si quiere reemplazarla. Simplemente presione en cada instancia " y" o "n", por "Yes" o "No', hasta que termine. Si no entiende esto mientras lo lee, pruébelo.
¿Qué es lo que ocurre realmente?
Realmente, todas estas teclas ligadas que ha aprendido son los atajos a funciones de Emacs. Por ejemplo, ||_C-p_|| es una manera abreviada de decirle a Emacs que ejecute la función interna previous-line (línea_previa). Sin embargo, todas estas funciones internas pueden ser llamadas por el nombre, usando |_M-x_|. Si olvida que previous-line está ligado a ||C-p_||, puede escribir simplemente |_M-x_| previous-line |_Intro_|, y se moverá una línea hacia arriba. Pruebe esto ahora, para que comprenda como |_M-x_| previous-line y ||_C-p_ || son realmente la misma cosa.
El diseñador de Emacs comenzó desde la base hacia arriba, primero definió un lote completo de funciones internas, y entonces les asoció o ligó ciertas teclas a las más comúnmente usadas. A veces es más fácil llamar a una función explícitamente con |_M-x_| que recordar a qué tecla está ligada.
La función query-replace, por ejemplo, está ligada a ||_M-%_|| en algunas versiones de Emacs. Pero ¿quién puede recordar tan rara combinación? A menos que use query-replace muy frecuentemente, es más fácil simplemente llamarla con |_M-x_|.
La mayoría de las teclas que pulsa son letras, cuya función es ser insertadas en el texto del buffer. Cada una de esas teclas está ligada a la función self-insert-command, que no hace nada más que insertar la letra en el buffer. Las combinaciones que usan la tecla |_Control_| con una letra generalmente están ligadas a funciones que hacen otras cosas, como mover el cursor. Por ejemplo, |_C-v_| está ligada a una función llamada scroll-up (avanzar página), que mueve el buffer una pantalla hacia arriba (lo que quiere decir que su posición en el buffer se mueve hacia abajo, por supuesto).
Si alguna vez quisiera realmente insertar un carácter de Control en el buffer, entonces, ¿cómo lo haría? Después de todo, los caracteres de Control son caracteres ASCII, aunque rara vez usados, y puede querer tenerlos en un archivo. Hay una manera para_impedir_que los caracteres de Control sean interpretados como comandos por Emacs. La tecla ||_C-q_||6 está ligada a una función especial llamada quoted-insert (insertar lo citado). Todo lo que quoted-insert hace es leer la próxima tecla e insertarla literalmente en el buffer, sin tratar de interpretarla como un comando. Así es cómo puede poner los caracteres de Control en sus archivos usando Emacs. ¡Naturalmente, la manera de insertar un C-q es presionar ||C-q_|| dos veces!
Emacs también tiene muchas funciones que no están ligadas a ninguna tecla. Por ejemplo, si escribe un mensaje largo, y no quiere tener que presionar |_Intro_| al final de cada línea. Puede hacer que emacs lo haga por Ud. (de hecho puede hacer que Emacs haga cualquier cosa por Ud.), el comando para hacerlo se llama auto-fill-mode (modo de auto llenado, pero no está ligado a ninguna tecla por defecto. A fin de invocar este comando, debe escribir "M-x auto-fill-mode".
"M-x" es la tecla usada para llamar a funciones por el nombre. Podría usarlo para llamar a funciones como next-line y previous-line, pero eso sería muy ineficaz, ya que esas funciones están ligadas a |_C-n_| y ||_C-p_||.
A propósito, si mira su línea de modo después de invocar auto-fill-mode, notará que la palabra "Fill" se ha agregado al lado derecho. Mientras esté allí, Emacs llenará (rellenará) el texto automáticamente. Puede desactivarlo escribiendo "M-x auto-fill-mode" nuevamente, es un comando de palanca.
La incomodidad de escribir largos nombres de función en el minibuffer disminuye porque Emacs hace terminación automática en los nombres de funciones de la misma manera que lo hace en los nombres de archivo. Por lo tanto, rara vez debería encontrarse escribiendo el nombre entero de la función letra a letra. Si no está totalmente seguro de si puede o no usar la terminación automática, simplemente presione |_Tab_|. No puede hacer daño: lo peor que puede suceder es que consiga un carácter Tab, y si es afortunado, resultará que puede usar la terminación automática.
Pidiendo ayuda a Emacs
Emacs tiene extensas facilidades de ayuda, tan extensas de hecho, que sólo podemos comentarlas un poco aquí. A las facilidades de ayuda más básicas se accede tecleando |_C-h_| y luego una única letra. Por ejemplo, |_C-h_k_| muestra la ayuda sobre una tecla (le pide que presiones una tecla, y entonces le dice lo que esa tecla hace). |_C-h_t_| abre un breve manual sobre Emacs. Más importante aún, |_C-h_C-h_C-h_| le da ayuda sobre la ayuda, para decirle que está disponible una vez que ha tecleado |_C-h_| por primera vez. Si sabe el nombre de una función de Emacs (save-buffer (grabar el buffer), por ejemplo), pero no puede recordar cuál es la combinación de teclas a la que está ligada, use |_C-h_w_|, para "where-is" (dónde está), y escriba el nombre de la función. O, si quiere conocer qué hace una función con detalle, use |_C-h_f_|, que preguntará por un nombre de función.
Recuerde, que como Emacs hace terminación automática del nombre de la función, realmente no tiene que estar seguro de cómo se llama para pedir ayuda sobre ella. Si piensa que puedes adivinar la palabra con la que podría comenzar, teclee ésa y presione |_Tab_ |para ver si se completa. Si no, vuelva atrás e intente otra cosa. Lo mismo ocurre con los nombres de archivo: aún cuando no pueda recordar del todo como nombró cierto archivo al que no ha accedido en tres meses, puede probar y usar la terminación automática para averiguar si está en lo cierto. Usa la terminación automática como una forma de preguntar, y no sólo como una manera de teclear menos.
Hay otros caracteres que puede pulsar después de |_C-h_|, y con cada uno consigue ayuda de una manera diferente. Los que usará más frecuentemente son |_C-h_k_|, |_C-h_w_|, y |_C-h_f_|. Una vez que esté más familiarizado con Emacs, otra para probar es |_C-h_a_|, que le pregunta por una cadena y le comenta todas las funciones que tienen esa cadena como parte de su nombre (la "a" sería para "apropos" [a propósito], o "about"[acerca]).
Otra fuente de información es el lector de documentación Info. Info es demasiado complejo para tratarlo aquí, pero si está interesado en explorarlo por si mismo, teclee |_C-h_i_| y lea el párrafo en la parte superior de la pantalla. Le dirá cómo conseguir más ayuda.
Especializando buffers: Modos
Los buffers de Emacs tienen modos asociados7. La razón para esto, es que sus necesidades cuando escribe un mensaje de correo son muy diferentes de sus necesidades cuando, por ejemplo, escribe un programa. Mejor que tratar de crear un editor que satisfaga cada necesidad particular en todo momento (que sería imposible), el diseñador de Emacs8 eligió hacer que Emacs se comporte de manera diferente dependiendo de qué hace Ud. en cada buffer individual. Así, los buffers tienen modos, cada uno diseñado para alguna actividad específica. Los aspectos principales que distinguen un modo de otros son las combinaciones de teclas, pero también pueden existir otras diferencias.
El modo más básico es el modo Fundamental, que realmente no tiene ningún comando especial.
De hecho, esto es todo lo que Emacs dice sobre el Modo Fundamental:
Modo Fundamental:
Modo mayor no especializado para nada en particular. Los otros modos mayores son definidos por comparación con este.
Obtuve así esa información: Teclee |_C-x_b_|, que es switch-to-buffer (cambiar al buffer), e introduje "foo" cuando se me preguntó por un nombre de buffer al que cambiar. Como no había anteriormente ningún buffer llamado "foo", Emacs creó uno y me cambio a él. Estaba en el modo fundamental por defecto, pero si no lo hubiese estado, podría haber tecleado "M-x fundamental-mode" para que estuviese. Todos los nombres de modo tienen un comando llamado <nombre-de-modo>-mode que pone el buffer actual en ese modo. Entonces, para averiguar más sobre este modo mayor, tecleé |_C-h_m_|, que consigue ayuda sobre el modo mayor actual del buffer en que está.
Hay un modo ligeramente más útil llamado text-mode, (modo texto, que tiene los comandos especiales |_M-S_|, para centrar párrafo, y |_M-s_|, que invoca centrar línea. |_M-S_|, a propósito, significa exactamente lo que piensa: mantenga pulsadas la |_Meta|y la tecla |_Shift_|, y presiona "S".
Pero no me tome la palabra en esto, cree un nuevo buffer, póngalo en modo texto, y teclee |_C-h_m_|. Puede que no entienda todo lo que Emacs le diga cuando lo haga, pero debería ser capaz de conseguir sacar alguna información útil de ello.
Esto es una introducción a algunos de los modos más comúnmente usados. Si los usa, asegúrese de que teclea en cada uno |_C-h_m_| alguna vez, para averiguar más sobre cada modo.
4 Ocasionalmente, un C-g no es suficiente para persuadir a emacs que realmente quiere interrumpir lo que hace. Simplemente insista, y normalmente Emacs volverá a un modo más cuerdo.
5 Sobre algunos terminales, |_C-SPC_| no funciona. Para estas máquinas, debe usar |_C-@_|.
6 Llamamos a C-q una "tecla", aunque se produce manteniendo presionada la tecla Controly presionando "q", porque es un único carácter ASCII.
7 para colmo de males, hay "Modos Mayores" y "Modos Menores", pero en este momento no necesita conocer nada acerca de esto.
8 Richard Stallman, a veces también conocido como "rms", porque es su login.