Vendredi, 29 janvier 2010

TextMate : répétition de texte style emacs

Attention: cette entrée est vielle. Il est possible qu’elle contienne de l’information dépassée ou qu’elle ne réflète plus mon opinion.

Avec jed, mon éditeur texte favori pour terminal, j’ai accès à la fonction « repeat command » : peser sur ESC, entrer un chiffre, et ensuite quelque chose d’autre répétera quelque chose chiffre fois. Cette fonctionnalité existe aussi dans emacs et dans bash.

Cette fonction peut aussi être utilisée avec des commandes, comme « delete » et « yank » (coller). J’utilise surtout cette fonction pour générer des lignes de « - » et de « = ».

Voici donc une recette pour simuler cette fonctionnalité dans TextMate.

Le script

Sélectionnez le menu “Bundles” → “Bundle Editor” → “Show Bundle Editor”.

Créez un « bundle » en utilisant le « + » sous la liste. Je place mes propres choses dans un paquet nommé « _Serge ».

Dans ce paquet, créez une nouvelle « Commande » en utilisant encore le « + ». Utilisez les valeurs suivantes :

  • “Save”: Nothing
  • “Input”: “Selected Text” or “Word”
  • “Output”: “Insert as Snippet”

Et dans la boîte de texte « Command(s) » :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python
# -*- Mode: python; tab-width: 4; indent-tabs-mode: nil; coding: utf-8 -*-

import os
import sys
import subprocess

textmate_path = '/Applications/TextMate.app'
cocoadialog_exe = os.path.join(
    textmate_path,
    'Contents/SharedSupport/Support/bin/CocoaDialog.app',
    'Contents/MacOS/CocoaDialog'
)

input = sys.stdin.read().decode('utf-8')
if ':' in input:
    # Quick entry:  "6:-" repeats "-" 6 times
    input = input.split(':')
    r_num = int(input.pop(0))
    r_what = u':'.join(input)
    sys.stdout.write(r_what * r_num)
    sys.exit(0)

r_num = int(input)

help_text = u"Enter the string to repeat %d times" % r_num
initial_text = u"-"

cmd = [
    cocoadialog_exe,
    'standard-inputbox',
    '--informative-text', help_text,
    '--float',
    '--text', initial_text,
]

sp = subprocess.Popen(cmd, stdout=subprocess.PIPE)
stdout, stderr = sp.communicate()

lines = stdout.split('\n')
if lines[0] != '1':
    # Cancel
    exit(0)

r_num = int(input)
r_what = lines[1]

sys.stdout.write(r_what * r_num)

Si vous le désirez, assigner un « Key Equivalent ». J’utilise quelque chose comme « Command-ESC » (⌘-⎋).

Utilisation

Ce script a deux modes d’opération.

Premier mode

Pour répéter « = » 7 fois, taper « 7:= » dans TextMate, le sélectionner, et ensuite appeler la commande.

Second mode

Pour répéter « = » 7 fois, taper « 7 » dans TextMate, appeler la commande (e.g. ⌘-⎋), et taper « = » dans la boîte de texte, et appuyer sur « enter ».

Exemples

Texte Résultat
10:* **********
10:: ::::::::::
10:' ''''''''''
10:-*- -*--*--*--*--*--*--*--*--*--*-
Posté à 22 h 9
 
Tags : osx · TextMate

Commentaires

RSS de commentaires

Il n’y a aucun commentaire pour cet article.

Laisser un commentaire






Les commentaires sont formattés par Markdown. Syntaxe de base sur Wikipedia.