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
Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.