Un petit raccourci pratique pour ion3, qui permet, sur la combinaison de touches de son choix, de prendre le texte actuellement sélectionné (surligné) dans sa session X11, et, en fonction de son contenu :

  • d'ouvrir un onglet Firefox avec l'url sélectionnée,
  • d'ouvrir un xpdf si c'est une URL de fichier PDF,
  • lancer OpenOffice.org si c'est un fichier OOo,
  • ouvrir le fichier dans emacs si c'est un .py, .po, etc.
  • etc.

Pour cela, il faut le script magique ci-dessous, et configurer ion pour appeler ce script sur la bonne combinaison de touches. Par ex. ajouter dans votre ~/.ion3/cfg_ion.lua les lignes

defbindings("WMPlex.toplevel", {
  bdoc("Automagically view the selected string"),
  kpress(META.."F7",
         "ioncore.exec_on(_, '/home/user/bin/view')"),
})

Ici, j'ai mappé "Meta+F7", et le script est /home/user/bin/view

#!/usr/bin/env python

from mimetypes import guess_type
import sys
from os.path import abspath
from os import system, popen

import re
RGX = re.compile

EMACS = 'emacsclient --no-wait %(uri)s'
EMACS_WITH_LINE = 'emacsclient --no-wait +%(lineno)s %(uri)s'
FIREFOX = 'firefox -remote "openURL(%(uri)s, new-tab)"'
WGET = 'cd /home/adim/tmp && wget %(uri)s & '

commands = [
    ('text/html', FIREFOX),
    ('application/xml', EMACS),
    ('text', EMACS),
    ('image', 'display %(uri)s &'),
    ('application/pdf', 'xpdf %(uri)s &'),
    ('application/postcript', 'gv %(uri)s &'),
    ('application/vnd.sun.xml', 'ooffice %(uri)s &'), # matches writer, impress, etc.
    ('application/vnd.oasis.opendocument', 'ooffice %(uri)s &'),
    ('application/msword', 'ooffice %(uri)s &'),
    ('application/vnd.ms-', 'ooffice %(uri)s &'),
    ]

patterns = [
    (RGX(r'https?://.*?(zip|gz|pdf|ods|doc|odt|ppt|sxw|sxi)$'), WGET),
    (RGX(r'.*(?P<uri>https?://[^ ()]*)( .*)?'), FIREFOX),
    (RGX('.*?\.conf$'), EMACS),
    (RGX('.*?\.po$'), EMACS),
    (RGX('.*?\.xslt$'), EMACS),
    (RGX('.*?\.pot$'), EMACS),
    (RGX(r'\s*F?i?l?e? ?"?(?P<uri>.*?\.py)", line (?P<lineno>\d+)[a-zA-Z_:-]*'), EMACS_WITH_LINE),
    (RGX('.*?(readme|changelog|depends|manifest|makefile)(\.in|\.gz|\.bz2)?$', re.I), EMACS),
    # others might come here ...
    ]

def find_command(selection):
    for rgx, cmd in patterns:
        m = rgx.match(selection)
        if m:
            args = m.groupdict() or {'uri' : selection}
            return cmd, args
    mimetype, encoding = guess_type(selection)
    # XXX: encodings like zip, or gz could be handled
    if mimetype is not None:
        selection = abspath(selection)
        for registered_type, cmd in commands:
            if mimetype.startswith(registered_type):
                return cmd, {'uri' : selection}
    raise ValueError('nothing matched')

if len(sys.argv)>1:
    selected = ' '.join(sys.argv[1:])
else:
    selected = popen('xclip -o').read()

if selected:
    try:
        cmd, args = find_command(selected)
    except ValueError:
        # system('wmiijabber error viewing %s' % ' '.join(sys.argv[1:]))
        # XXX print a message in wmii status bar ?
        pass
    else:
        #print "yooo =>", repr(cmd), repr(args)
        system(cmd % args)

Pour que cela fonctionne, il ne faut pas oublier d'installer xclip (sous debian, apt-get install xclip).

-- écrit par David Douard sur un script de Adrien diMascio

blog entry of