Blog entries

  • Petites astuces de vim

    2008/05/27 by Arthur Lutz

    J'ai découvert vim-addons (qui est apparu dans debian récement) et ce petit outil permet de faire d'etendre les fonctionnalités de vim assez facilement. Voici une utilisation parmi tant d'autres :

    mode gnupg

    pour installer le mode gnupg faites

    vim-addons install gnupg
    

    Ensuite vim pourra ouvrir directement des fichiers encryptés et les réncrypter lorsque vous sauvez. Donc simplement

    vim mot-de-passe-envoyé-par-client.gpg
    

    Voilà, le tour est joué.

    J'avoue que je reste avec emacs pour le code, mais ce genre de petit raccourcis est bien pratique.


  • Petit raccourci pratique avec ion3

    2008/05/27 by Arthur Lutz

    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


  • ion, dock and screen configuration

    2008/07/04 by David Douard

    I have a laptop I use at work (with a docking station), in the train and at home (with an external display), on which my environment is ion3.

    As I use suspend-to-RAM all the time, I have added some keybindings to automatically reconfigure my screen when I plug/unplug an external display (on the dock as well as direct VGA connection).

    The lua code to paste in your .ion3/cfg_ion.lua for the bindings looks like:

    function autoscreen_on()
            local f = io.popen('/home/david/bin/autoscreen -c', 'r')
          if not f then
              return
          end
          local s = f:read('*a')
          f:close()
        ioncore.restart()
    end
    
    function autoscreen_off()
            local f = io.popen('/home/david/bin/autoscreen -d', 'r')
          if not f then
              return
          end
          local s = f:read('*a')
          f:close()
        ioncore.restart()
    end
    
    defbindings("WMPlex.toplevel", {
        bdoc("Turn on any external display and tell ion to reconfigure itself"),
        kpress(META.."F10",
               "autoscreen_on()"),
    })
    
    defbindings("WMPlex.toplevel", {
        bdoc("Turn off any external display and tell ion to reconfigure itself"),
        kpress(META.."F11",
               "autoscreen_off()"),
    })
    

    It makes use of the following python script (named /home/david/bin/autoscreen in the lua code above):

    #!/usr/bin/env python
    
    import sys
    import os
    import re
    from subprocess import Popen, PIPE
    import optparse
    parser = optparse.OptionParser("A simple automatic screen configurator (using xrandr)")
    parser.add_option('-c', '--connect', action="store_true",
                      dest='connect',
                      default=False,
                      help="configure every connected screens")
    parser.add_option('-d', '--disconnect', action="store_true",
                      dest='disconnect',
                      default=False,
                      help="unconfigure every connected screens other than LVDS (laptop screen)")
    parser.add_option('', '--main-display',
                      dest='maindisplay',
                      default="LVDS",
                      help="main display identifier (typically, the laptop LCD screen; defaults to LVDS)")
    
    options, args = parser.parse_args()
    
    if int(options.connect) + int(options.disconnect) > 1:
        print "ERROR: only one option -c or -d at a time"
        parser.print_help()
        sys.exit(1)
    
    
    xrandr = Popen("xrandr", shell=True, bufsize=0, stdout=PIPE).stdout.read()
    
    connected = re.findall(r'([a-zA-Z0-9-]*) connected', xrandr)
    connected = [c for c in connected if c != options.maindisplay]
    
    cmd = "xrandr --output %s %s"
    
    if options.connect or options.disconnect:
        for c in connected:
            if options.connect:
                action = "--auto"
            elif options.disconnect:
                action = "--off"
    
            p = Popen(cmd % (c, action), shell=True)
            sts = os.waitpid(p.pid, 0)
    

  • Emacs and mercurial trick

    2009/04/03 by Ludovic Aubry
    http://www.logilab.org/image/8863?vid=download

    While using emacs I always find the need to use grep on a terminal to search for things within a specific project. This is not ideal, even within an embedded emacs shell.

    Since I recently discovered the emacs command grep-find I decided to make it work nicely with mercurial projects, and here's the result:

    (defun grep-project (s)
      (interactive "sSearch project for: ")
       (grep-find (concat "files=(`hg manifest`);grep -nH -e \"" s "\" ${files[@]/#/`hg root`/}"))
    )
    (global-set-key (quote [f4]) (quote grep-project))