"Después del juego es antes del juego"
Sepp Herberger

lunes, 2 de febrero de 2015

Asociación de archivos en Linux.

Esto siempre se me olvida, así que voy a dejarlo aquí como referencia. En cualquiera de los escritorios de Linux tenemos un sistema para definir con que aplicación abrir un determinado tipo de archivo y la capacidad de mostrar una lista de aplicaciones candidatas, usando la opción "Abrir con..." del menú contextual del fichero.

La forma en que se determina a que tipo pertenece un fichero es mediante uno de estos dos comandos:

file --mime-type -b "nombre fichero"

o

xdg-mime query filetype "nombre fichero"

que nos da un tipo MIME. El sistema interno con el que file reconoce un fichero es un tanto esotérico, debido a que Linux no tiene información sobre el tipo MIME en los metadatos del sistema de archivos (como si tenía, por ejemplo, BeOS en los 90 del siglo pasado ). Para ello "file" se basa en "números mágicos"  (si, como suena), examinando el fichero e intentando interpretar a que tipo pertenece en función de su contenido.

Una vez determinado el tipo MIME (por ejemplo, application/vnd.oasis.opendocument.text) hay que saber que aplicaciones pueden abrirlo y que aplicaciones serán mostradas en el "Abrir con.." del menú contextual.

Para saber que aplicaciones están asociadas a un tipo de fichero se consulta en las ubicaciones ~/.local/share/applications y /usr/share/applications dentro de los siguientes ficheros:

  • mimeinfo.cache
  • mimeapps.list

Para saber con que aplicación se abre un fichero al hacer doble click sobre él o ejecutar el comando:

xdg-open "nombre fichero"

se mira en orden en los siguientes ficheros:

  • La asociación en  ~/.local/share/applications/mimeapps.list.
  • La asociación en  ~/.local/share/applications/defaults.list.
  • La asociación en /usr/local/share/applications/defaults.list.
  • La asociación en /usr/share/applications/defaults.list.
  • La primera asociación en /usr/share/applications/mimeinfo.cache.

Todos estos ficheros tienen la misma estructura:

  • Secciones marcadas con [...]. A efectos prácticos son comentarios.
  • Asociaciones de un tipo MIME con una lista de aplicaciones o una sola aplicación, según el caso.

Las asociaciones tienen el aspecto del siguiente ejemplo:

image/gif=display.im6.desktop;gthumb.desktop;firefox.desktop;gimp.desktop;ristretto.desktop;arora.desktop;

Como vemos, las aplicaciones se definen por "nombre.desktop". ¿Y desde ahí como llega a la aplicación exacta?. Fácil: está dentro del fichero /usr/share/applications/nombre.desktop. Allí dentro está la ruta de la aplicación junto con otra información adicional que no viene a cuento.

Si queremos cambiar las asociaciones de /usr/share/applications podemos caer en la tentación de editar a mano mimeinfo.cache. Craso error, ya que el comando update-desktop-database, ejecutado muchas veces durante la instalación de una nueva aplicación, lo reconstruye de nuevo y nos hace perder los cambios. Realmente mimeinfo.cache es un índice inverso que se crea a partir del procesado de los ficheros .desktop del directorio applications. La forma correcta es crear o copiar el fichero .desktop correspondiente en /usr/share/applications con las líneas MimeType y Exec con los valores correctos, por ejemplo:

...
Exec=ristretto %F
...
MimeType=image/png;image/gif;image/jpeg;image/bmp;image/x-pixmap;image/tiff;image/svg+xml;image/x-xpixmap;
...

una vez hecho esto, ejecutamos:

update-desktop-database /usr/share/applications

para actualizar mimeinfo.cache.

Si lo que queremos es quitar una aplicación de la lista del menú contextual, simplemente borramos su fichero .desktop en /usr/share/applications y actualizamos la base de datos con update-desktop-database.

Si deseamos cambiar la aplicación por defecto para abrir un fichero haremos:

xdg-mime default nombre.desktop mymetype

Por ejemplo:

xdg-mime default ristretto.desktop image/jpeg

Y ya está, con esta lista de comandos podremos definir desde un script o una tarea puppet como queremos establecer las asociaciones de nuestros ficheros con las aplicaciones que los manejan.

Una cosa que echo en falta a este sistema es la imposibilidad de imponer una asociación sobre la que tenga definida el usuario en su fichero ~/.local/share/applications/mimeapps.list local, algo parecido a los mandatory o los lock de las configuraciones de Gnome o XFCE. La idea sería poder hacer que, por ejemplo, en una máquina concreta los ficheros jpg siempre se abrieran por defecto con la misma aplicación, independientemente de lo que tuviera establecido el usuario. Como eso no es posible, pues a aguantarse.

Y hasta aquí hemos llegado hoy.

No hay comentarios:

Publicar un comentario