Cuaderno de GNUtas

Ejecutar comandos de shell en Emacs sobre archivos marcados de dired

Se dice que los fumadores de pipa pasan más tiempo cuidando y puliendo su colección de pipas que fumándolas. Una gracia parecida puede aplicarse a los usuarios de emacs, que nos echamos la jornada entera apilando código y paquetes, a cada cual más novedosos, en nuestro archivo de configuración, el indispensable ~/.emacs. Nunca estaremos satisfechos y siempre hay algo que se puede automatizar mejor. La gente sabia de los habituales foros emacsianos de la red comparte mil y una funciones para mil y una tareas, que estamos deseosos de probar o modificar a nuestra conveniencia (una buena práctica es, cuando lo hagamos, incluir siempre entre nuestros comentarios la fuente). También podemos ensayar nuestras propias funciones, mucho más chapucers y de andar por casa, pero que hacen el avío y —cómo no— nos vienen de perlas para seguir aprendiendo esa cosa infinita de paréntesis infinitos llamada emacs-lisp.

A ese último grupo pertenecen las funciones que aquí les comparto, y que me son bastante útiles en mi trabajo del día a día. Son varias, pero la estructura es la misma y bastante simple. La cosa está en poder ejecutar un comando de shell sobre un archivo que tengamos marcado en el navegador de archivos de emacs que atiende al nombre de dired. Aquí se las dejo.

Extraer las imáges de un documento docx u odt

Ésta me es especialmente provechosa. Si tenemos un documento de LibreOffice o de Word marcado en dired, nos extrae todas las imágenes y las guarda en una carpeta en la misma ubicación del documento. El comando en shell que nos interesa ejecutar aquí es pandoc, exportando a html con la opción de guardar las imágenes --extract-media=img (luego el html resultante lo podemos eliminar):

(defun extrae-afotos (archivo)
"extrae todas las imágenes de un documento de word o libreoffice
con pandoc y las guarda en una carpeta"
(interactive (dired-get-marked-files))
(shell-command (format "pandoc '%s' --extract-media=img -o doc.html" archivo)))

Ojo, el comodín '%s' entre comillas simples para nombres de archivo que contienen espacios.

Exportar un archivo odt a LaTeX

Para exportar un odt a *.tex prefiero usar aquí writer2latex y no pandoc. El primero es mucho más preciso y configurable en este caso concreto. Eso sí, añado la opción de aplicar mi propio archivo de configuración a la exportación, que nombro como miconfig.xml:

(defun convierte-odt-a-latex (archivo)
"convierte un *odt marcado en dired a un *tex mediante writer2latex"
(interactive (dired-get-marked-files))
(shell-command (format "writer2latex -config ~/Tipografía/miconfig.xml '%s'" archivo)))

Copiar uno o más archivos marcados a nuestra carpeta de Nextcloud

El problema que tienen las anteriores funciones es que sólo podemos ejecutar el comando de shell sobre un único archivo marcado. Si queremos que funcionen sobre varios archivos, entonces dired-get-marked-files nos entregará una lista que el comando de shell no será capaz de digerir. Esto lo podemos remediar haciéndolo de otra forma: definiendo una variable antes, que recoja los archivos marcados e incluyendo el comando de shell en la función mapconcat, que ejecuta sucesivamente los distintos elementos de una lista1. Esto es útil, por ejemplo, si queremos copiar uno o varios archivos a una ubicación fija, como una carpeta de Nextcloud, pero también podemos adaptarlo a los casos anteriores. Por supuesto, al final de la función (como se diría en el teatro) hay que darle a la variable el valor nil.

(defvar archivos-a-copiar-lista nil)

(defun manda-a-nextcloud ()
  (interactive)
  (setq archivos-a-copiar-lista (dired-get-marked-files))
  (when archivos-a-copiar-lista
    (shell-command
     (mapconcat
      #'shell-quote-argument
      `("cp" "-r" ,@archivos-a-copiar-lista ,"~/Nextcloud/Compartir")
      " "))
    (setq archivos-a-copiar-lista nil)))

Publicado: 24/04/2019

Última actualización: 24/04/2019


Índice general

Acerca de...

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.

Notas:

1

La idea la he tomado de este hilo de Stackexchange, fuente inagotable de conocimiento.

© Juan Manuel Macías
Creado con esmero en
GNU Emacs