Open with Emacs - Nautilus


Da ich selber hauptsächlich unter GNOME mit Linux arbeite, suchte ich eine Möglichkeit, direkt aus Nautilus heraus remote Dateien mit meinem Lieblingseditor zu edieren. Nautilus kann ja Dank der sft://user@hostname/directory/ Syntax remote Dateien anzeigen. Wenn man diese Dateien dann doppelklickt, werden sie zwar vom Gnome Editor geladen, aber man kann sie nicht ändern. Abgesehen davon bin ich eingefleischter Emacs Benutzer - und auch der Emacs kann Dank TRAMP mit SCP u.ä. remote Dateien edieren. Jetzt musste ich nur noch einen Weg finden, diese beiden Tools zu einem vernünftigen Zusammenspiel zu überreden.

"Google ist Dein Freund!" ist einer meiner Wahlsprüche, und tatsächlich wurde ich nach kurzer Suche fündig - zumindest fast. Genauer gesagt fand ich auf Externes Link perlmonks.org ein Externes Link Script, um die Nautilus Syntax in die gvim Dateinamensyntax zum remote edieren umzusetzen. Da TRAMP noch eine andere Syntax benutzt, nahm' ich dieses Script als Ausgangspunkt und passte es auf meine Bedürfnisse an. Das Ergebnis stelle ich hier der Allgemeinheit zur Verfügung, vielleicht kann es ja außer mir noch jemand gebrauchen.

Die Installation ist gänzlich einfach: Speichere einfach den folgenden PERL-Sourcecode unter "~/.gnome2/nautilus-scripts/Open with Exim" ab. Nach einem Neustart von Nautilus (bzw. dem Öffnen eines neuen Fensters, wenn ich mich nicht irre), sollte beim Rechtsklick auf einen Dateinamen jetzt der neue Menüpunkt Skripte auftauchen und im darauf folgenden Untermenü ein Punkt Open with Emacs erscheinen. Das war's schon. War doch einfach, oder? Hier nun der Sourcecode:

#!/usr/bin/perl
 
use strict;
use warnings;
 
my @files;
 
foreach (split /\n/, $ENV{NAUTILUS_SCRIPT_SELECTED_URIS}) {
    if(s{^file://(/.*)$}{$1}) {
        push @files, unescape($_);
    }
    elsif(s{^ssh://([^/]+)/(.*)$}{/$1:/$2}) {
        push @files, unescape($_);
    }
    elsif(s{^sftp://([^/]+)/(.*)$}{/$1:/$2}) {
        push @files, unescape($_);
    }
    else {
        system(qq{gdialog --infobox "Unknown URI type: '$_'"});
        exit;
    }
}
 
my $msg = "Files:\n" . join("\n", @files);
#system(qq{gdialog --infobox "$msg"});
system('emacs', @files);
 
exit;
 
sub unescape {
    my($data) = $_;
 
    $data =~ s/%([\da-fA-F][\da-fA-F])/chr(hex($1))/eg;
 
    return $data;
}