2009-09-09 9 views
3

J'ai un script Perl qui groove un tas de fichiers journaux à la recherche de lignes "intéressantes", pour une définition d'intéressant. Il génère un fichier HTML constitué d'une table dont les colonnes sont un horodatage, une référence filename/linenum et le bit "intéressant". Ce que j'aimerais faire, c'est que le nom de fichier/linenum soit un lien qui amènera ce fichier avec le curseur positionné sur ce numéro de ligne, dans emacs. Emacsclientw autorisera une telle chose (par exemple emacsclientw +60 foo.log) mais je ne sais pas quel type d'URL/URI à construire qui permettra à FireFox d'appeler emacsclientw. Le fichier HTML original sera local, donc il n'y a pas de problème.Comment configurer firefox pour exécuter emacsclientw sur certains liens?

Est-ce que je devrais définir mon propre type MIME et accrocher de cette façon?

La version de Firefox est 3.5 et j'utilise Windows, au cas où cela serait important. Merci!

Répondre

3

Merci pour le pointeur, p4bl0. Malheureusement, cela ne fonctionne que sur un vrai système d'exploitation; Windows utilise une méthode complètement différente. Voir http://kb.mozillazine.org/Register_protocol pour plus d'informations. Mais, vous m'avez certainement fourni le début dont j'avais besoin, alors merci beaucoup, beaucoup!

est ici la solution pour Windows:

D'abord, vous devez configurer correctement le Registre pour gérer ce nouveau type d'URL. Pour cela, enregistrez ce qui suit dans un fichier, le modifier en fonction de votre environnement, enregistrez et double-cliquez dessus:

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\emacs] 
@="URL:Emacs Protocol" 
"URL Protocol"="" 

[HKEY_CLASSES_ROOT\emacs\shell] 

[HKEY_CLASSES_ROOT\emacs\shell\open] 

[HKEY_CLASSES_ROOT\emacs\shell\open\command] 
@="\"c:\\product\\emacs\\bin\\emacsclientw.exe\" --no-wait -e \"(emacs-uri-handler \\\"%1\\\")\"" 

Ce n'est pas aussi robuste que le script shell de p4bl0, car il ne fait pas sûr que Emacs est en cours d'exécution en premier.Ensuite, ajoutez ce qui suit à votre fichier .emacs:

(defun emacs-uri-handler (uri) 
    "Handles emacs URIs in the form: emacs:///path/to/file/LINENUM" 
    (save-match-data 
    (if (string-match "emacs://\\(.*\\)/\\([0-9]+\\)$" uri) 
     (let ((filename (match-string 1 uri)) 
       (linenum (match-string 2 uri))) 
      (with-current-buffer (find-file filename) 
      (goto-line (string-to-number linenum)))) 
     (beep) 
     (message "Unable to parse the URI <%s>" uri)))) 

Le code ci-dessus ne vérifiez que le fichier existe, et la gestion des erreurs est rudimentaire au mieux. Mais ça marche!

Ensuite, créez un fichier HTML qui a des lignes comme les suivantes:

<a href="emacs://c:/temp/my.log/60">file: c:/temp/my.log, line: 60</a> 

puis cliquez sur le lien.

Post Script:

J'ai récemment mis à Linux (Ubuntu 9.10) et voici ce que je l'ai fait pour ce système d'exploitation:

$ gconftool -s /desktop/gnome/url-handlers/emacs/command '/usr/bin/emacsclient --no-wait -e "(emacs-uri-handler \"%s\")"' --type String 
$ gconftool -s /desktop/gnome/url-handlers/emacs/enabled --type Boolean true 

En utilisant la même emacs-uri-handler d'en haut.

8

Passez à la page about:config dans firefox. Ajouter une nouvelle chaîne:

network.protocol-handler.app.emacs 
valeur

: chemin vers un script qui analyser l'URL sans protocole (ce qui est après emacs://), puis appelez emacsclient avec l'argument approprié.

Vous ne pouvez pas simplement mettre le chemin d'emacsclient parce que tout ce qui suit le protocole est passé comme un argument à l'exécutable de sorte que votre +60 foo.log serait un nouveau fichier nommé de cette façon.

Mais vous pouvez facilement imaginer someting comme emacs:///path/to/your/file/LINENUM et un petit script qui suppriment la finale/et le numéro et appeler emacsclient avec le numéro et le fichier :-)

EDIT: Je pourrais le faire en bash si vous Je veux mais je ne sais pas comment le faire avec les fenêtres "shell" ou quoi que ce soit appelé.

EDIT2: Je me trompe sur quelque chose, le protocole est passé dans la chaîne arg à! Voici un petit script bash que je viens de faire pour moi, BTW merci pour l'idée :-D

#!/bin/bash 
ARG=${1##emacs://} 
LINE=${ARG##*/} 
FILE=${ARG%/*} 
if wmctrl -l | grep [email protected] &>/dev/null; then # if there's already an emacs frame 
    ARG="" # then just open the file in the existing emacs frame 
else 
    ARG="-c" # else create a new frame 
fi 
emacsclient $ARG -n +$LINE "$FILE" 
exit $? 

et mon network.protocol-handler.app.emacs dans mon Iceweasel (Firefox) est /home/p4bl0/bin/ffemacsclient. Cela fonctionne très bien!

Et oui, le nom de mon portable est romuald ^^.

+0

* Juste * me battre à elle. :-) –

0

est peut-être une bonne raison d'écrire votre premier plugin FF;)

+0

pas besoin d'un plugin ici ;-) – p4bl0

Questions connexes