[conspire] myopen(1)

Eric De Mund ead-conspire at ixian.com
Thu Mar 26 02:40:48 PDT 2009


Well, I've given your words regarding exo-open(1) and freedesktop.org's
use of the shared mime-info cache (mimeinfo.cache) a whole bunch of
thought, and I have to agree with you.

I've determined that my problem was that, with my use of exo-open(1), I
crossed the line from laziness (the first virtue of a programmer [1]) to
out-and-out delegation. Or maybe delegation to a program that doesn't
share my values.

My problems with freedesktop.org's exo-open(1) and D-Bus [2] were:

1.  D-Bus, which exo-open(1) uses, is entirely too complex a solution
    for such a simple problem as opening a file.

2.  The documentation for both stinks. I shouldn't have to spend days
    crawling web sites and then through C code to determine how each
    works. All I want to do, after all, is open a file.

3.  The real rub: I don't get full control of applications with the
    XDG_DATA_DIRS environment variable. Full control means I'm able to
    specify the full search path for mimeinfo.cache, beyond which NO
    additional searching takes place. Unfortunately, I don't get that.
    Instead, I get "search my path and then (unconditionally) proceed on
    to your hard-coded system path" behavior. No thank you. I want full
    control. (And come on people, this is not hard to implement. Where's
    the softness? Software is supposed to be soft, flexible, *rich* in
    its support of usage patterns, not just providing one mode of usage.)

4.  Also, it seems that the design of mimeinfo.cache, or rather of how
    it's managed (touched) by developers, is flawed. "Design" may not be
    the right word, but the problems appear to be:

4a. There doesn't appear to be any agreement on how developers (of GIMP,
    of evince, of xpdf, to speak of PDF-capable programs, for example)
    should be touching mimeinfo.cache. Is it a complete free-for-all? Is
    any program allowed to edit mimeinfo.cache, and put itself first in
    line, as the preferred handler for a particular type of file?

    Refreshing people's memory, what touched off this whole trip down
    the rabbit hole for me was the fact that one day I found that, at
    the command line, "o myfile.pdf" (alias o=exo-open) was invoking
    GIMP (hello!), while the previous day my preferred evince(1) was
    being invoked.

4b. Even if there are freedesktop.org project guidelines for applica-
    tions on how and when they're to touch mimeinfo.cache, there doesn't
    appear to be any way for me, the user, to weigh in with a standing
    declaration of "If an entry (i.e. an application or a list of appli-
    cations) for file type 'application/foo' appears in the file, please
    append rather than prepend yourself to that entry/list." Again, not
    rocket science.

But they didn't write the software this way, and so I went and wrote my
own Bourne shell script, called myopen(1) [3], to do this. It takes the
entries in a text file called $HOME/.myopen, e.g.

    # begin .myopen ---------------------------------------------
    DEFAULT:    less -FiMX
    iso:        isoinfo -l -R -i FILE | less -FiMX
    log:        -                   # DEFAULT
    odt:        openoffice
    ogg:        xmms
    pdf:        evince
    png:        display             # ImageMagick(1)'s display(1)
    txt:        -                   # DEFAULT
    zip:        unzip -l FILE | less -FiMX
    # end .myopen -----------------------------------------------

and causes the specified program to be invoked (for instance, evince(1))
when for instance "myopen myfile.pdf" is issued.

Here's its manual page, in case anyone is having trouble sleeping this

         myopen - open a file with associated handler

         myopen [-f <handler-file>] [-n] [-v] <file>
         myopen --help
         myopen --manual
         myopen --version

         myopen  opens  a  file  with its  handler  application,  the
         program associated with that particular type of file.

              Print usage message.

         -f <handler-file>
              The  handler  file,  that  contains  the file type <-->
              application mapping. If not specified, this defaults to

              This  file   contains  a  list  of   file  types  (file
              extensions)  and their associated applications (be they
              executable binaries or scripts).  Each line consists of
              a file extension,  followed by a colon  (":"), followed
              by whitespace  (any non-zero combination  of spaces and
              tabs), followed by a string to execute. In its simplest
              form,   that    string   is   an    application   name.
              Alternatively,  it  may  be  an application  name  with
              options.  Finally, it may be a pipeline  of such simple
              commands,  with  the  reserved  word  FILE representing

              The  special  file  type of NOEXT represents files with
              either no extension or with a trailing dot (".").

              If no application is associated with a file type, or if
              an application of DEFAULT  (or NONE or -) is associated
              with a file type,  then the application associated with
              the  special file  type  of DEFAULT  is  used. If  that
              special DEFAULT  type isn't found,  or if it's found to
              have  an  associated  application of NONE or -, then no
              action is taken.

              If  the  special application of STOP or ! is associated
              with a file type, then myopen exits immediately without
              taking any action.

              Lines  may  be blank,  or  may  contain comments  (i.e.
              strings beginning with "#" and continuing to the end of
              the  line).  Blank  lines  are  ignored.  Comments  are
              removed. Trailing whitespace is ignored.

              This is best described with an example:

              ##    .myopen                                        ##

              # DEFAULT type values:
              #     An application, NONE, or -.
              # File type values:
              #     An application, DEFAULT, NONE, -, STOP, or !.

              # file type name
              # |       file type value (typically an application)
              # |       |
              # v       v

              DEFAULT:  less -FiMX    # if no other file handler

              NOEXT:    -             # no file ext, or ending in "."
              avi:      vlc
              bmp:      display       # ImageMagick(1)'s display(1)
              bin:      !             # STOP (do nothing and exit)
              doc:      openoffice
              flac:     xmms
              gif:      display
              jpeg:     display
              jpg:      display
              iso:      isoinfo -l -R -i FILE | less -FiMX
              log:      -             # DEFAULT
              m3u:      xmms
              mp3:      xmms
              odt:      openoffice
              ogg:      xmms
              pdf:      evince
              png:      display
              ps:       evince
              rm:       mplayer       # RealMedia
              sh:       -             # DEFAULT
              tif:      display
              tiff:     display
              torrent:  deluge
              txt:      -             # DEFAULT
              zip:      unzip -l FILE | less -FiMX

              ##    end .myopen                                    ##

              Print this manual page.

         -n   Don't open <file> with handler,  but instead just print
              the command that would be invoked.

         -v   Verbose. Print the command that will be invoked.  Also,
              print a note if no  associated  handler  is  found  for

              Print version number.

         This  is  a  quick  hack and not the proper approach to this
         problem.  A  proper  approach  is to have the file type <-->
         application  mapping  be  determined  by  the file's  actual
         contents (e.g. as reported by file(1))  rather  than  by its
         filename extension.  Look for that capability in an upcoming

         Copyright 2009 Eric De Mund.  This program is free software:
         you can redistribute it  and/or modify it under the terms of
         the  GNU  General  Public  License  as published by the Free
         Software Foundation, either version 3 of the License, or (at
         your option) any later version.

         This  program  is  distributed  in  the hope that it will be
         useful, but WITHOUT ANY WARRANTY;  without  even the implied
         PURPOSE.  See  the  GNU  General  Public  License  for  more

         You  should  have received  a copy of the GNU General Public
         License   along    with   this   program.    If   not,   see

         echo(1), cat(1), egrep(1), fgrep(1), more(1), sed(1), sh(1),
         tail(1), tty(1).

         Eric De Mund <ead-myopen at ixian.com>

         17 March 2009

         $Ixian: myopen,v 1.7 2009-03-26 00:42:35 ead Exp $




1. Virtues of a programmer

2. D-Bus

3. myopen(1)
"That destructive siren, sloth, is ever to be avoided." --Horace

Eric De Mund   | Ixian Systems           | Jab: eadixian at jabber.org/main
ead at ixian.com  | 650 Castro St, #120-210 | Y!M: ead0002
ixian.com/ead/ | Mountain View, CA 94041 | ICQ: 811788

More information about the conspire mailing list