Perderle el miedo a Emacs

Enviado por pvaldes el 15 Junio, 2012 - 20:45.

Llevo unos cuantos meses probando la beta del próximo emacs24, aún no disponible en Debian pero bastante prometedor, y quizás es el momento de dedicarle un post enteramente al editor de macros. Es difícil encontrar por donde empezar con éste...

Que entre el Flashback...


Muy poco después de tirarme a la piscina del software libre por primera vez, debo decir que sin ninguna habilidad ni conocimiento informático real alguno, empecé a fisgonear entre los editores de texto disponibles, pasé brevemente por ed, joe, elvis, vi y nano y en seguida decidí que concentraría mis esfuerzos en alcanzar una de las piezas de caza más deseadas entre los editores de texto, el Ñú de montaña de Massachusetts.

Un ñú nervioso, hermético, poco dado a expresar sus emociones y con los cuernos muy afilados, que tenía sus propios planes al respecto, debo decir.

Con el tiempo empecé a morder el polvo cada vez menos y un buen día tuve mi esperada recompensa cuando me ví a mi mismo buscando una palabra en un archivo de cientos de miles de líneas a una velocidad que estaba a años luz de la de los editores que conocía. De repente Word era una tortuga asmática y yo galopaba esta vez sí, hacia el horizonte como los vaqueros de verdad, (yiiihaaa!). Emacs fue el primer programa de GNU/linux que realmente pude decir que "dominaba". Lo más irónico es que ahora me doy cuenta de que apenas había rozado la superficie, pero tampoco importa mucho, me proporcionó la confianza y allanó el camino para meterme en empresas mayores, latex llegó seguidamente de modo totalmente natural. Nada mal para alguien cuyo conocimiento de la informática es autodidacta.


...Fin del Flashback.

¿Aconsejaría a los nuevos usuarios sin conocimientos informáticos que pierdan el miedo y se acerquen a emacs? Sin duda.

¿Aconsejaría que lo aprendieran dándose cabezazos contra la pared hasta sacar gravilla como lo hice yo? Probablemente NO.

Hay que advertir que la primera impresión puede ser algo cruda. De entrada es un programa vetusto, con una interface muy sobria para los tiempos que corren, hasta hace muy pocos años casi podríamos decir que hasta polvorienta. Además en todas partes se indica que emacs es personalizable hasta la nausea, pero si uno tiene la peregrina idea de entrar al menú Customize-emacs se llevará un puñetazo en el estómago. Es como estar en una habitación mal iluminada llena de estanterías de metal hasta el techo con cientos de cajones grises etiquetados con términos extraños y descripciones herméticas.
Customize en acción
Customize en acción. La primera vez uno sólo quiere salir corriendo de allí lo antes posible. Y la segunda también.

Sin embargo no debemos dejarnos engañar por las apariencias, en realidad tenemos en nuestras manos una pieza de software capaz de hacer montones de cosas a velocidad de relámpago y muy compleja. Existen literalmente cientos de funciones disponibles directamente. Unas pocas se usan a diario, otras se invocarán un par de veces al año y la mayor parte nunca; bien porque sean lanzadas automáticamente por el programa de modo transparente al usuario (que solo ve que las cosas funcionan del modo más sensato sin tener que hacer nada a cambio), o bien porque ni siquiera sabrá que existen.

Además por cada una de los cientos de funciones disponibles de serie hay otras tantas ocultas en las cañerías y en las bodegas que, como el basilisco de Harry Potter, no acudirán a menos que su presencia sea requerida del modo apropiado. Emacs24 hace cierto hincapié en solucionar eso, así que es probable que el número de funciones disponibles a los usuarios roce la estratosfera en un futuro próximo.

Por tanto un problema mayor ya no es solo saber que esas funciones existen o saber como y cuando usarlas, sino simplemente recordar sus nombres. De hecho muchas funciones tienen nombres muy similares entre sí.

La verdad es que sería estupendo poder empezar en emacs invocando a nuestras funciones favoritas con un nombre que ya nos resultara familiar, fácil de recordar, descriptivo... ¿en castellano incluso?

Habemus tema de post... a pesar de todos los pesares hoy vamos a personalizar emacs.

Definiendo nuestros propios alias de emacs

El siguiente código permite crear algunos alias para nombres de funciones de uso habitual, de modo que podamos invocarlas con nombres sencillos. Para empezar a usarlos deberemos abrir o crear un archivo nuevo de texto llamado ~/.emacs (o sea, algo como "/home/pvaldes/.emacs") y copiar las lineas siguientes. La próxima vez que abramos emacs tendremos a nuestra disposición las nuevas definiciones.

(Los que estén familiarizados con el uso del programa pueden saltarse los párrafos siguientes).
Para usar cualquiera de las funciones presentes pulsaremos a la vez las teclas "escape" y "X" seguido del nombre del alias deseado. En las funciones con nombres más largos no hace falta escribir todo el nombre. Basta con escribir los primeros caracteres y darle al tabulador para autocompletar, igual que en bash. Un par de ejemplos
para abrir un archivo dentro de emacs pulsamos Escape-X, escribimos "abr", pulsamos tabulador y luego enter, y nos permitirá escribir el nombre del archivo que queremos visitar.
para buscar una cadena de texto dentro del archivo "Escape-X buscar", etc.

Para acceder a una descripción breve del comando usaremos describe-function (ej: "Escape-X describe-funcion" pulsamos enter escribimos "buscar" y pulsamos enter de nuevo)
Escrito parece mucho más complicado de lo que es en realidad. Le pillaréis el truco en seguida.

;;; Definir algunos alias para funciones comunes en emacs (parte I)
;;; pvaldes 2012

;;;_____________________________
;;; COMANDOS MENU ARCHIVO:
;;;     abrir, guardar, guardar-como, cerrar,
;;;     salir, crear-nuevo-directorio y examinar-directorio

(defalias 'abrir 'find-file "abre un archivo")

(defalias 'crear-nuevo-directorio 'mkdir
    "si no existe un directorio con el nombre indicado lo crea.
     Si el directorio ya existe no hace nada.")

(defalias 'examinar-directorio 'dired
  "permite navegar por un directorio, mostrando sus contenidos.
  Para entrar en un subdirectorio o abrir un archivo simplemente
  basta con pulsar encima de él con el raton")

(defalias 'guardar 'save-buffer
     "copia los cambios desde la imagen en memoria al archivo real en el disco.
     \(actualiza y guarda el archivo\)")

(defalias 'guardar-como 'write-file
   "Una de las maneras de guardar un documento
    con otro nombre \(No es la única\)")

(defalias 'cerrar 'kill-buffer
     "cierra el documento actual")

(defalias 'salir 'save-buffers-kill-emacs
    "cierra todo y sale de emacs,
    si hay cambios que no hayan sido guardados
    preguntará que se debe hacer con ellos")

;;;_____________________________
;;; COMANDOS MENU EDITAR:
;;;     deshacer, cortar, pegar, buscar, buscar-hacia-atras,
;;;     reemplazar y reemplazar-todo

(defalias 'deshacer 'undo
    "deshacer el ultimo cambio. Repetir el comando las veces que sea necesario
    para deshacer más cambios recientes. Es mejor usar el atajo
    de teclado Control+\"_\" \(guion bajo\) para ese fin")

(defalias 'cortar 'kill-region
    "corta el trozo de texto seleccionado y lo guarda en una especie de portapapeles circular.
    Atajo: Control+W");

(defalias 'pegar 'yank
    "inserta desde el portapapeles y en la posición actual del puntero el último trozo de texto cortado.
    Atajo: Control+Y");

(defalias 'buscar 'search-forward
    "busca hacia adelante desde la posición actual del ratón.
    Se recomienda usar el atajo de teclado
    Control+s repetidamente en su lugar")

(defalias 'buscar-hacia-atras 'search-backward)

(defalias 'reemplazar 'query-replace
      "buscar y reemplazar interactivo.
      consulta antes de reemplazar mirando caso por caso")

(defalias 'reemplazar-todo 'replace-string
     "reemplazar todas las apariciones de una cadena desde
      la posición actual del ratón hasta el fin del archivo
      mucho más rápido pero no interactivo")

;;;_____________________________
;;; COMANDOS MENU VER:
;;;     dividir-ventana-en-horizontal, dividir-ventana-en-vertical, maximizar, listar-documentos-abiertos, ver-imagenes

(defalias 'dividir-ventana-en-horizontal 'split-window-horizontally
   "crea una division en la ventana para poder ver varios documentos al mismo tiempo")

(defalias 'dividir-ventana-en-vertical 'split-window-vertically
   "crea una division en la ventana para poder ver varios documentos al mismo tiempo"))

(defalias 'maximizar 'delete-other-windows
        "elimina divisiones ocultando todas las demás ventanas salvo la actual
         para volver a recuperar las ventanas ocultas usar: listar-documentos-abiertos")

(defalias 'listar-documentos-abiertos 'ibuffer
        "ver la lista actual de documentos abiertos")

(defalias 'ver-imagenes 'tumme
  "muestra todas las imágenes del directorio indicado
   en forma de colección de miniaturas. Si el directorio
   no contiene ninguna imagen devuelve una ventana en blanco.
   Una copia de las miniaturas se guardarán en el directorio
   ~/.emacs.d/ de donde pueden ser borradas si se requiere liberar
   espacio en el disco")

;;;_____________________________
;;; OTROS COMANDOS UTILES (navegar, contar-lineas, ir-a-linea, man)

(defalias 'navegar 'browse-url
      "visita la direccion url indicada en el navegador por defecto.")

(defalias 'contar-lineas 'count-lines-page
      "cuenta el número de líneas del documento actual")

(defalias 'ir-a-linea 'goto-line
      "mueve el puntero al numero de linea indicado
       se usa bastante para verificar errores")

(defalias 'man 'woman
    "consultar paginas de manual desde emacs. \(mejor preguntar a las chicas\)")
    
     ;; Este es un caso especial. Las páginas de manual son tradicionalmente
     ;; territorio Vi, de hecho uno de sus últimos reductos, y esto obligaba a tener
     ;; que memorizar un nuevo set de comandos de vi para moverse con agilidad
     ;; por ellas. Abrirlas con emacs nos permite usar comandos ya conocidos como
     ;; buscar sin tener que aprender un segundo editor sólo para esto. De todos
     ;; modos, actualmente se ha añadido un pequeño menú que facilita mucho las cosas.

;;;_____________________________

No hay que desanimarse por la cantidad de opciones disponibles, la mayoría de los usuarios nos moveremos sólo dentro de un pequeño gueto de unas pocas decenas de funciones que se adaptan a nuestras necesidades durante años sin echar nada en falta y en realidad no hay nada malo en ello. A medida que vayamos encontrando nuevas funciones que nos resulten útiles podemos ir creando alias que nos resulten fáciles de memorizar e ir ampliando nuestra lista.

Imagen de Debish
Enviado por Debish el 16 Junio, 2012 - 00:04.

Especialmente agradecido uno que aún usa nano meparto

Imagen de pvaldes
Enviado por pvaldes el 16 Junio, 2012 - 00:12.

Uy lo que te pierdes... mira la foto del customize, mira eyebrows

Imagen de yen-lo-wan
Enviado por yen-lo-wan el 16 Junio, 2012 - 08:20.

y yo que intentando salir de nano me meto a vim XD, quizas tenga que volver a plantearmelo

Imagen de Black Rider
Enviado por Black Rider el 16 Junio, 2012 - 10:39.

Lo siento, yo soy un VFF.

Vim Fanboy Forever :-) Lo uso hasta para escribir la lista de la compra.

Sí, ya lo sé ¿qué pasa? No puedes esperar publicar una entrada sobre Emacs y que no aparezca un VFF.

Imagen de cenizoish
Enviado por cenizoish el 16 Junio, 2012 - 11:03.

A mí me gusta más el

$ emacs23 -nw

No tengo ni idea de utilizarlo pero bueh, para cortar, copiar pegar, navegador de archivos, visor de pdf, shell interactiva, tiling, numeración de líneas, dejarlo en segundo plano y retornar con fg, navegar en consola y poder copiar y pegar me suele venir bastante bien.

ESC-ESC-ESC es el mejor comando. Que sirve para salirte de los sitios a donde no sabes cómo has llegado.

Eso sí, es un poco pesado y tarda en arrancar mucho más que vim.

Es un intérprete de Lisp, con lo cual, si no sabes Lisp, pues como que te da igual; y tiene agenda, calendario y un org-mode que es toda una carrera superior.

Vamos, que con el geany voy que ardo.

Imagen de pvaldes
Enviado por pvaldes el 16 Junio, 2012 - 12:09.
Black Rider escribió:

Lo siento, yo soy un Vim Fanboy Forever :-) Lo uso hasta para escribir la lista de la compra.

No hay nada malo en ello...

El mayor problema para alternar entre uno y otro es la memoria muscular. Cuando se repite muchas veces un comando luego te sale sin pensarlo. Eso hace que sea muy rápido pero también que cueste pasarte al otro y acabas metiendote en Vim y tecleando comandos de emacs constantemente.

Lo bueno es que para facilitar el asunto a los VFF en emacs existe viper-mode. Viper viene de Vi peril "el peligro Vi" y es un emulador de Vi desde dentro de Emacs con cinco niveles que van desde escribir exclusivamente en Vi a cuatro mezclas de comandos de emacs y Vi. Digamos que puedes elegir el porcentaje de comandos de Vi que conservas y el porcentaje que sustituyes por comandos de emacs. Imagino que si lanzas "escape+X viper-mode" y eliges el nivel 1 que es practicamente 100% Vi no te sentirías muy extraño experimentando en emacs.

Imagen de pvaldes
Enviado por pvaldes el 16 Junio, 2012 - 12:22.

Lanzar emacs en terminal con opciones predefinidas o usarlo desde la linea de comandos como si fuera un one-liner de perl (que también es posible) ya son palabras mayores meparto

cenizoish escribió:

ESC-ESC-ESC es el mejor comando. Que sirve para salirte de los sitios a donde no sabes cómo has llegado.

El comando que necesitas para abortar algo en estos casos es probablemente keyboard-quit. Hace que el programa se olvide de todo cuando uno comete errores (por ejemplo pulsa por error escape-X tres veces seguidas) o se arrepiente en medio de un comando, y el teclado vuelve a estar disponible para volver a empezar. Vamos, que si algo se bloquea de un modo horrible la salida de emergencia suele ser la combinacion de teclas asociadas como atajo de teclado de keyboard-kit: "Control-G"

Imagen de Black Rider
Enviado por Black Rider el 16 Junio, 2012 - 12:37.
pvaldes escribió:

Lo bueno es que para facilitar el asunto a los VFF en emacs existe viper-mode.

Interesante, pero es un concepto un poco raro.

Probablemente, quien quiera correr un editor de textos que actúa como Vim, debería usar Vim. Si quieres usar Emacs, lo lógico es que aprendas Emacs, no un híbrido Vim/Emacs.

Es un poco como quienes pretenden correr el AutoCAD, el Notepad++ y MS Office bajo Linux. Si te empeñas lo haces, pero leches, ¿no será mejor usar las alternativas nativas o cambiar el SO, que andarse con modos de compatibilidad extraños? (Me refiero a aplicaciones que se usan con mucha frecuencia, claro, entiendo que uno no se instale un SO completo para trastear el AutoCAD una vez el mes).

Imagen de pvaldes
Enviado por pvaldes el 16 Junio, 2012 - 13:18.

Es como una especie de cortesía ante las visitas ocasionales, supongo. Si alguien acostumbrado a trabajar de una determinada manera entra ocasionalmente, emacs puede mimetizar aquellos comandos a los que está acostumbrado para facilitarle la estancia y que no esté tropezando constantemente. La verdad es que no lo he usado mucho, pero está bien saber que existe esa posibilidad. Imagino que Vim tendrá cosas similares.

Imagen de MOSE
Enviado por MOSE el 22 Junio, 2012 - 17:03.

BIGOFFTOPIC

Black Rider escribió:

Lo siento, yo soy un VFF.

Vim Fanboy Forever :-) Lo uso hasta para escribir la lista de la compra.

Sí, ya lo sé ¿qué pasa? No puedes esperar publicar una entrada sobre Emacs y que no aparezca un VFF.

Y luego se imprime con

:hardcopy!

Añade otro a la lista de los VFF :).

pvaldes escribió:

Imagino que Vim tendrá cosas similares.

Yo uso un modo especial de emulación de vim que es totalmente compatible con emacs. xD

:!emacs
Dependencias: emacs

/BIGOFFTOPIC
Me ha gustado mucho la entrada del blog, es bastante interesante, aunque lo de personalizar comandos existentes y "remapear" (menudo palabro) cosas es un arma de doble filo, es tentador convertir todas esas palabras crípticas en palabras fáciles de recordar y hasta en tu idioma materno, pero o te llevas tu(s) archivo(s) de configuración a cualquier máquina en la que quieras trabajar o lo pasarás mal (te haces configuradicto :D).

Yo por ejemplo tenía un vimrc muy grande y que no paraba de crecer (el vicio de copiar y pegar), tenía cosas que nunca usaba y un 70% de líneas NPI (Ni P%$a Idea de lo que hacen); un buen día (hace 3 semanas) borre el vimrc y me hice uno de 8 líneas (4 que me sé de memoria y 4 no esenciales), y desde entonces vivo más tranquilo, me ha crecido el pelo otra vez y tengo un color más saludable XD.

pvaldes escribió:

No hay que desanimarse por la cantidad de opciones disponibles, la mayoría de los usuarios nos moveremos sólo dentro de un pequeño gueto de unas pocas decenas de funciones que se adaptan a nuestras necesidades durante años sin echar nada en falta y en realidad no hay nada malo en ello. A medida que vayamos encontrando nuevas funciones que nos resulten útiles podemos ir creando alias que nos resulten fáciles de memorizar e ir ampliando nuestra lista.

No se puede tener más razón, ojalá te hubiera leído a tí o a Moolenar antes y no tendría que haber aprendido la lección the hard way.

http://www.moolenaar.net/habits.html escribió:

On the other hand, you should not try to learn every command an editor offers. That would be a complete waste of time. Most people only need to learn 10 to 20 percent of the commands for their work. But it's a different set of commands for everybody. It requires that you lean back now and then, and wonder if there is some repetitive task that could be automated. If you do a task only once, and don't expect having to do it again, don't try to optimise it. But you probably realize you have been repeating something several times in the last hour. Then search the documentation for a command that can do it quicker. Or write a macro to do it. When it's a larger task, like lining out a specific sort of text, you could look around in newsgroups or on the Internet to see if somebody already solved it for you.

Pues eso, lo mejor:
1. Hacer el tutorial de inicio.
2. Editar.
3. Repetir paso 2.
Si crees que haces algo de forma muy ineficiente y lo haces varias veces cuando editas, busca una forma más rápida de hacerlo.