.. _mimetypes:
Aplicaciones predeterminadas
****************************
Cuando escribimos una orden en la |CLI|, cuál es la aplicación con la que se
desea manejar un archivo es información totalmente implícita::
$ geeqie foto_molona.jpeg
La orden indica expresamente al sistema que deseamos abrir el archivo
(presumiblemente una foto) con `Geeqie `_. Hay, en
cambio, otras muchas ocasiones (p.e. cuando en un entorno gráfico pinchamos
sobre el icono que representa la foto) en que es el sistema el que tiene que que
determinar cuál es la aplicación adecuada. Cuál sea depende de cuál sea el tipo
del archivo y, así, un archivo |PDF| habrá que consultarlo con un visor para
|PDF|\ s, o una foto |JPEG| con un visor de imágenes. Para la expresión del tipo
se usa la nomenclatura |MIME|, en la que los tipos se expresan, en general, en
la forma :kbd:`tipo/subtipo`, de manera que :kbd:`image/jpeg` identifica a una
imagen en formato |JPEG| o :kbd:`application/pdf` a un archivo |PDF|.
.. seealso:: Consulte `este artículo sobre tipos MIME
`_
de la página de desarrolladores de Mozilla_.
Así pues, para escoger la aplicación apropiada debemos conocer cuál es el tipo
del recurso. En los sistemas suelen producirse distintas situaciones:
* En ocasiones, se proporciona al sistema directamente el tipo |MIME| como
ocurre cuando se accede por |HTTP| a un recurso alojado en un servidor web y
éste envía el campo de cabecera :kbd:`Content-Type` cuyo valor es directamente
el tipo |MIME|. Para más información sobre ello consulte :ref:`los fundamentos
del protocolo HTTP `.
* En otras, nuestra intención es abrir un archivo. En este caso, no se nos indica
directamente el tipo, pero se llega a él a través de dos estrategias: la
habitual que consiste en determinarlo a partir de :ref:`la extensión que
incluye el nombre ` y la menos habitual de usar los `números
mágicos `_ y que es
la que usa la aplicación :ref:`file `. La primera forma exige un mapeo
que relacione extensiones con tipos |MIME|\ [#]_.
* Y en otras se nos ofrece un recurso a través de una |URL|, y es necesario
conocer qué aplicación es capaz de gestionar esa |URL|. Por ejemplo, que ante
un enlace `ftp://ftp.mozilla.org `_ el sistema sepa
que tiene que usar un determinado cliente |FTP| y lo abra al pinchar sobre
él. En este caso, hay que asociar una aplicación (un cliente |FTP| en el ejemplo anterior)
a un protocolo de |URL| (``ftp://``), en vez de a un tipo de archivo; por lo
que es --en principio-- un problema distinto. Sin embargo, se usa una argucia
para reducir este problema al anterior: cada protocolo se asimila a un tipo
|MIME| :kbd:`x-scheme-handler`, donde el subtipo es el nombre del propio
protocolo (:kbd:`x-scheme-handler/ftp`) y así vuelve a reducirse el problema a
asociar un tipo con una aplicación. Siguiendo esta estrategia, el tipo |MIME|
:kbd:`x-scheme-handler/http` sirve para representar el protocolo |HTTP|,
:kbd:`x-scheme-handler/https`, el protocolo |HTTP|\ s o
:kbd:`x-scheme-handler/mailto` las |URL|\ s que representan direcciones de
correo electrónico.
.. note:: Por ejemplo, si acude a la `página de Valide
`_, verá que tiene la posibilidad de
firmar documentos |PDF|. Si lo intenta, como los navegadores no tienen esa
capacidad, la acción de firma intenta abrir un recurso mediante el
protocolo ``afirma://``. Si en su sistema está definido el tipo |MIME|
:kbd:`x-scheme-handler/afirma` y asociado éste a la aplicación Autofirma_,
entonces podrá firmar. En cambio, si no está instalado Autofirma_ o, si
aun estándolo, no existe tal asociación, el sistema no sabrá cómo manejar
ese protocolo, no sabrá cómo firmar y, consecuentemente, no podremos
firmar.
.. image:: files/mimeapps.png
De lo expuesto se desprende que se resolverá completamente el problema si se
hace:
#. Un mapeo entre extensiones y tipos |MIME|.
#. Un mapeo entre tipos |MIME| y aplicaciones.
.. _mimetypes-cli:
|CLI|
=====
Aunque en muchas ocasiones el propio usuario invoca la aplicación que quiere
usar, existe la posibilidad de que esto no ocurra: por ejemplo, cuando desde
dentro de un cliente de correo (como :ref:`mutt `) necesitamos abrir un
adjunto.
.. rubric:: Mapeo de extensiones
Para relacionar extensiones de nombres de archivo y tipos |MIME| se usa el
archivo :file:`/etc/mime.types` incluido en el paquete :deb:`media-types`. Nada
más echar un vistazo al archivo, se comprende cómo funciona: está constituido
por líneas que expresan en la primera columna el tipo |MIME| y en las restantes
las extensiones asociadas. Por ejemplo, las páginas web (:kbd:`text/html`)
tienen asociadas las siguientes extensiones::
$ grep '^text/html' /etc/mime.types
text/html html htm shtml
.. rubric:: Mapeo de aplicaciones
Muchas aplicaciones de texto (p.e. :ref:`mutt `) usan :manpage:`mailcap`
para conocer qué aplicación está asociada a cada tipo |MIME|. La lectura de la
página del manual es suficientemente ilustrativa de cuál es el formato del
archivo :file:`/etc/mailcap`. También se lee el archivo de usuario
:file:`~/.mailcap` para que cada usuario pueda personalizar la aplicación a
usar.
.. _run-mailcap:
Directamente en la línea de órdenes, puede usarse la órden
:manpage:`run-mailcap` para abrir un archivo usando la aplicación que exprese el
archivo :file:`mailcap`::
$ run-mailcap ~/Documentos/lista.txt
.. _mimetypes-gui:
|GUI|
=====
La gestión de extensiones, tipos de archivo y aplicaciones se realiza en el
entorno gráfico a través de las `xdg-utils`_ definidas por el proyecto
freedesktop.org_. Gracias a ellas, todos los entornos gráficos de *Linux* tiene
un modo unificado de tratar internamente el problema.
Por lo general, los gestores gráficos de archivos proporcionan un modo sencillo
para fijar o modificar con qué programa quiere abrirse cada tipo de archivo.
Nosotros aquí, sin embargo, trataremos cómo usar directamente las utilidades de
freedesktop.org_ desde la consola. Esto aproximación, además de ser
independiente de cuál sea el entorno gráfico, nos permite conocer qué estrategia
se sigue internamente.
.. _xdg-mime:
.. index:: xdg-mime
.. rubric:: Mapeo de extensiones
Se utilizan dos bases de datos distintas:
* La *general*, que se encuentra en :file:`/usr/share/mime/`.
* Con preferencia, la *particular* a cada usuario, que se encuentra en
:file:`~/.local/share/mime/`.
Las bases de datos se manipulan y consultan a través de la orden
:manpage:`xdg-mime`. Así, si queremos saber el tipo del documento
:file:`~/Documentos/redaccion.txt`::
$ xdg-mime query filetype ~/Documentos/redaccion.txt
text/plain
ya que en la base de datos la extensión :file:`.txt` está asociada a ese tipo
|MIME|. Mapear (y desmapear) es algo más complicado, ya que se necesita
describir la relación mediante un archivo |XML| con este aspecto:
.. literalinclude:: files/foo-bar.xml
:language: xml
Gracias al cual asociamos el tipo |MIME| :kbd:`text/x-foobar` a las extensiones
:file:`.bar`, :file:`.foo` y :file:`.foobar`. Una vez construido el archivo,
tenemos dos modos de regenerar la base de datos:
* Colocar el archivo en el subdirectorio :file:`packages/` de una de las dos
bases de datos (dependiendo de si queremos que sea un mapeo general o
particular) y regenerarla::
$ mv foobar.xml ~/.local/share/mime/packages
$ update-mime-database ~/.local/share/mime
* Utilizar :command:`xdg-mime`::
$ xdg-mime install --mode user foobar.xml
.. note:: El registro de un tipo |MIME| debería ir acompañado de la definición
de cuál es el icono gráfico que representa los archivos de tal tipo. Tal
acción se lleva a cabo con :manpage:`xdg-icon-resource`, pero eso no forma
parte del objeto de este epígrafe.
En ambas alternativas, se ha ilustrado cómo hacer un mapeo dentro de la base
de datos particular al usuario. Hecho éste, podemos probar el nuevo mapeo::
$ echo "Este archivo tiene un formato de prueba" > /tmp/caca.bar
$ xdg-mime query filetype /tmp/caca.bar
text/x-foobar
Para deshacer el mapeo, tenemos también dos alternativas:
* Borrar el archivo |XML| de :file:`packages/` y regenerar la base de datos::
$ rm ~/.local/share/mime/packages/foobar.xml
$ update-mime-database ~/.local/share/mime
* Utilizar :command:`xdg-mime`::
$ xdg-mime uninstall --mode user ~/.local/share/mime/packages/foobar.xml
.. note:: El |XML| puede encontrarse en cualquier ubicación, pero es bastante
probable que, después de un tiempo, ya no se encuentre en su ubicación
original. Donde sí debe encontrarse es en el subdirectorio
:kbd:`packages/`, así que es de esta ubicación de donde lo sacamos.
.. rubric:: Mapeo de aplicaciones
La segunda parte del asunto es asociar aplicaciones a tipos |MIME|. Tal
asociación no se hace dentro de las bases de datos anteriores, sino aparte. En
cualquier caso, empecemos por saber consultar cuál aplicación abre por defecto
una archivo de un tipo |MIME| determinado::
$ xdg-mime query default application/postscript
gimp.desktop
Obsérvese que lo que se obtiene no es un ejecutable, sino un archivo
:file:`.desktop`. Estos archivos son los que utilizan los entornos gráficos para
crear los lanzadores de las aplicaciones y saber cómo tienen que arrancarse,
cómo incluirse en los menús o qué icono debe asociarse a ellas\ [#]_. `Su
especificación
`_ también
es obra de freedesktop.org_.
Bien, pero ¿de dónde ha salido esta asociación? Si ejecutamos de esta otra
forma, obtendremos más información::
$ XDG_UTILS_DEBUG_LEVEL=2 xdg-mime query default application/postscript
Checking /home/josem/.config/mimeapps.list
Checking /home/josem/.local/share/applications/mimeapps.list
Checking /home/josem/.local/share/applications/defaults.list and /home/josem/.local/share/applications/mimeinfo.cache
Checking /home/josem/.local/share/applications/defaults.list and /home/josem/.local/share/applications/mimeinfo.cache
Checking /usr/local/share//applications/defaults.list and /usr/local/share//applications/mimeinfo.cache
Checking /usr/local/share//applications/defaults.list and /usr/local/share//applications/mimeinfo.cache
Checking /usr/share//applications/defaults.list and /usr/share//applications/mimeinfo.cache
gimp.desktop
Llegamos al mismo resultado, obviamente, pero la orden nos ha ido desglosando en
que archivos se ha buscado la asociación: primero en archivos propios del
usuario (y que, por tanto, serán asociaciones exclusivas para ese usuario) y
después en localizaciones generales. El mapeo se comprueba en el orden que
desglosa el comando; y, cuando se encuentra una, para la búsqueda y devuelve el
resultado.
Se observan, además, dos tipos de archivos: los :file:`.list` y los
:file:`.cache`. Lo habitual es que los archivos que se usen sean:
#. :file:`~/.config/mimeapps.list`
#. :file:`~/.local/share/applications/mimeinfo.cache`
#. :file:`/usr/share/applications/defaults.list`
#. :file:`/usr/share//applications/mimeinfo.cache`
Ambos tipos de archivos se generan de distinto modo. Los :file:`.cache` se
generan a partir de los archivos :file:`.desktop` que habitualmente incluyen un
campo :kbd:`MimeType` que desglosa cuáles son los tipos de archivos asociados al
ejecutable correspondiente. Por ejemplo, :file:`chromium.desktop` trae estos::
$ grep "^MimeType=" /usr/share/applications/chromium.desktop
MimeType=text/html;text/xml;application/xhtml_xml;application/x-mimearchive;x-scheme-handler/http;x-scheme-handler/https;
lo cual asocia el navegador Chromium_ a los documentos |HTML|. Este campo, en sí
mismo, no implica la asociación efectiva; pero, si tras la copia del
archivo en el directorio, se ejecuta :manpage:`update-desktop-database`::
# update-desktop-database /user/share/applications
se regenerará en tal directorio el archivo :file:`mimeinfo.cache` dentro del
cuál se hace la asociación efectiva. El archivo es texto claro, así que puede
leerse simplemente con :ref:`cat `. Como varios archivos :file:`.desktop`
puede relacionarse con el mismo tipo |MIME|, pueden existir varias aplicaciones
apropiadas para un mismo tipo |MIME|. En ese caso y en ausencia de una
definición en otro archivo más precedente, ¿cuál es la predeterminada? En
principio, será simplemente la primera que aparezca asociada al tipo en
:file:`mimeinfo.cache`. Por ejemplo, para esta línea\ [#]_::
$ grep ^application/pdf= /usr/share/applications/mimeinfo.cache
application/pdf=gimp.desktop;libreoffice-draw.desktop;org.gnome.Evince.desktop;
será :program:`Gimp` la aplicación que abrirá el |PDF|::
$ xdg-mime query default application/pdf
gimp.desktop
Sin embargo, un usuario particular puede establecer cualquiera de las otras en
su entorno de escritorio echando mano de :command:`xdg-mime`. Por ejemplo::
$ xdg-mime default org.gnome.Evince.desktop application/pdf
$ xdg-mime query default application/pdf
org.gnome.Evince.desktop
Estas declaraciones se almacenan en el archivo :file:`.list` del usuario (por
tanto, :file:`~/.config/mimeapps.list`) y al tomar precedencia sobre el otro
archivo, prevalecerá. El archivo, supuesto que no existiera o estuviera vacío,
quedará así::
$ cat ~/.config/mimeapps.list
[Default Applications]
application/pdf=org.gnome.Evince.desktop
que evidencia cuál es su sintaxis. Hay, no obstante, algunos limitaciones al
usar la orden para declarar la aplicación predeterminada:
* El archivo :file:`.desktop` debe existir.
* El archivo :file:`.desktop` debe declarar la aplicación como apropiada para el
tipo |MIME|.
* La definición siempre se realiza en el archivo :file:`.list` personal, no en
el general.
Dada la sencillez de su formato, los archivos :file:`.list` pueden editarse a
mano, lo cual será indispensable si queremos añadir mapeos en el archivo
:file:`.list` general.
.. seealso:: Puede consultar todas las posibilidades de :file:`mimeapps.list`
en `esta entrada de la wiki de Archilinux
`_.
.. _xdg-open:
.. index:: xdg-open
Por último, la orden :manpage:`xdg-open` (o, simplemente, :command:`open`) abre
un archivo o |URL| con la aplicación que determine como adecuada el sistema. Por
lo tanto::
$ xdg-open https://www.iescastillodeluna.es
abrirá esa |URL| en el navegador predeterminado. ¿Cuál? Debería saber ya
cómo averiguarlo::
$ xdg-mime query default x-scheme-handler/https
chromium.desktop
.. rubric:: Enlaces de interés
* `Especificaciones de shared MIME-info
`_.
.. rubric:: Notas al pie
.. [#] Y la segunda, otro mapeo que relaciones números mágicos (o `rúbricas de
archivo `_) con
tipos |MIME|.
.. [#] Estos archivos suelen encontrarse en :file:`/usr/share/applications/` o,
para un usuario particular, en :file:`~/.local/share/applications`.
.. [#] Estamos suponiendo, claro está, que el :file:`mimeinfo.cache` propio del
usuario (incluido en :file:`~/.local/share/applications`) no tiene
información al respecto.
.. |CLI| replace:: :abbr:`CLI (Command Line Interface)`
.. |GUI| replace:: :abbr:`GUI (Graphical User Interface)`
.. |MIME| replace:: :abbr:`MIME (Multipurpose Internet Mail Extensions)`
.. |PDF| replace:: :abbr:`PDF (Portable Document Format)`
.. |JPEG| replace:: :abbr:`JPEG (Joint Photographic Experts Group)`
.. |URL| replace:: :abbr:`URL (Uniform Resource Locator)`
.. |XML| replace:: :abbr:`XML (eXtensible Markup Language)`
.. |HTML| replace:: :abbr:`HTML (HyperText Markup Language)`
.. _Mozilla: https://www.mozilla.org/
.. _Chromium: https://www.chromium.org/
.. _xdg-utils: https://www.freedesktop.org/wiki/Software/xdg-utils/
.. _freedesktop.org: https://www.freedesktop.org/wiki/
.. _Autofirma: https://firmaelectronica.gob.es/Home/Descargas.html