In größeren Webprojekten verbringt man viel Zeit damit, sich durch tief verschachtelte Ordner-Hierarchien zu klicken. Zeit, alte Vorgehensweisen über Bord zu werfen und einen Blick auf einen projektbasierten Dateimanager zu werfen.

Projektordner-Suche leicht gemacht

Wäre es nicht schön, jede Datei in seinem Projekt nur mit wenigen Tastendrücken zu erreichen? Ohne sich durch gefühlte 2000 Ordner hoch- unter herunterklicken zu müssen?

P ist im Grunde eine rekursive Suche durch einen Projektordner, welche seine Ergebnisse verzögerungsfrei anzeigt. Aus diesen Suchergebnissen wählt man dann mit den Cursortasten die Datei aus, die man öffnen möchte und drückt dann Enter. Schon öffnet sich die gewünschte Datei in dem für die Dateiendung hinterlegtem Programm.

Seine Stärke entfaltet das Tool aber erst durch die variablen Suchbegriffe, die man verwenden kann und dem Ausgangsverzeichnis der Suche, welches genauso frei gewählt werden kann.

Kein guter Dateimanager unter Linux

Entstanden ist P eigentlich aus dem Umstand, dass ich (Christoph) bei der Arbeit unter Windows den legendären Total Commander verwende, zuhause aber unter Linux keinen auch nur halbwegs konkurrenzfähigen Datei-Manager gefunden habe. Ich brauchte also eine Lösung zum schnellen Öffnen von Dateien unter Linux, bei der ich möglichst wenig tippen müsste und am besten komplett auf das unhandliche Touchpad verzichten könnte. Da ich im PHP-Umfeld zuhause bin, entschied ich mich zum Basteln eines PHP-Shell-Scripts, welches mein Problem pulverisieren sollte.

Als ich es dann Nils zeigte, der es auch unter Mac OS X ohne Probleme zum Laufen bekam und den Finder absolut unterirdisch findet, war er sofort bei der Weiterentwicklung dabei. Das Ergebnis der Zusammenarbeit sehr ihr hier.

Projektordnersuche ausprobieren

Wer jetzt Lust darauf bekommen hat, P einfach mal auszutesten, kann es folgendermaßen ganz einfach ausprobieren:

  1. Aktuelle Version von P Version 1.0 herunterladen
  2. Shell-Script ausführbar machen:
    $ chmod +x proj
  3. Alias in der .bashrc (Linux) oder in der .bash_profile (Mac OS X) anlegen:
    alias p='/path/to/proj'
  4. Jetzt könnt ihr P einfach starten per:
    $ p

Konfiguration anpassen

Nach der unglaublich zeitaufwendigen Installation muss P noch konfiguriert werden. Dafür müsst ihr einfach die Datei .proj_template.php kopieren und in .proj.php umbenennen:
$ cp .proj_template.php .proj.php

Öffnet jetzt die .proj.php und passt diese nach euren Wünschen an. Alles sollte eigentlich selbsterklärend sein. Sollten wir in den Kommentaren sehen, dass dem nicht so ist, werden wir den Bereich hier natürlich ergänzen.

Und wie geht das jetzt?

Hier sind die speziellen Tastenkombinationen, die in P zur Verfügung stehen:

In der Ergebnisliste navigieren

In das ausgewählte Verzeichnis und damit in die Ordner-Ansicht wechseln.

Einen Ordner weiter nach oben wechseln.

Bild ↑ Pos 1 In der Ergebnisliste nach oben springen

Bild ↓ In der Ergebnisliste nach unten springen

Entf Suchzeile komplett löschen

Enter Ausgewählte Datei oder Ordner öffnen.

F5 Den Root-Ordner neu indizieren.

F10 P beenden.

Nutzung des Dateimanagers „P“ unter Windows

Die Nutzung unter Windows mit der Windows-Kommandozeile (cmd.exe) ist leider erstmal nicht möglich, weil das Script ein wenig an den Terminals herumkonfiguriert und teilweise auch auf Unix-Kommandos basiert. Dennoch gibt es in einer bestimmten Konstellation eine Möglichkeit.

Bei der Arbeit sieht es bei mir (Christoph) so aus, dass ich unter Windows arbeite, mein Webserver-Entwicklungsrechner aber eine Linux-Kiste ist, dessen DocumentRoot per Samba freigegeben ist. Ich verbinde mich jetzt per SSH (via Putty) und starte P, was natürlich dazu führt, dass die Dateien und die zugehörigen Programme auf dem Server statt auf meiner Windows-Maschine gestartet werden. Was mir erstmal relativ wenig hilft. Jetzt gibt es zwei Möglichkeiten.

Zum einen könnte ich X11-Forwarding für die SSH-Sitzung aktivieren und unter Windows einen X-Server aufsetzen (mit Xming sehr einfach). Allerdings könnte ich so ja nur auf dem Server installierte Programme nutzen (inkl. einer platzfressenden Installation von GTK oder Qt auf einer reinen Server-Installation). Ich möchte aber gern Notepad++ unter Windows verwenden.

Damit wären wir bei der zweiten Möglichkeit. Der Linux-Rechner müsste ein Signal an meinen Windows-Rechner schicken, um dort die richtige Datei (im Samba-Pfad) mit dem richtigen Programm aufzurufen. Ich habe es gelöst, indem ich mit PHP einen Socket-Server unter Windows aufgesetzt habe, welcher auf ein HTTP-Request wartet, um dann ein Programm mit der zugehörigen Datei zu starten.

Da es seit PHP5 einen eingebauten Webserver gibt, braucht man nicht mehr ein selbstgebasteltes Socket-Script, sondern kann ganz gemütlich PHP-eigene Funktionen nutzen, womit das Script um einiges kürzer wird:

C:\p\index.php

<?php

// set the replacements
$replacements = array(
	'\\var\\www\\' => 'V:\\', // map real path to samba path
	'[default]' => 'start', // the start command opens a file with the default application in windows
	'[folder]' => '"C:\Program Files\totalcmd\TOTALCMD.EXE" /O /L=', // open folders with total commander
);

if (isset($_SERVER['HTTP_X_P_COMMAND'])) {
	$command = $_SERVER['HTTP_X_P_COMMAND'];
	$command = str_replace('/', '\\', $command);
	$command = str_replace( array_keys($replacements), array_values($replacements), $command);
	exec($command);
}

Gestartet wird das Script jetzt z.B. mit Klick auf folgende Datei:
C:\p.bat

C:\Users\christoph\php\php.exe -S 192.168.3.136:9000 -t c:\p

Achtung! Dieser Socket-Server ist ein Sicherheitsrisiko, weil euer Rechner von außen gesteuert werden kann (wie bei einem Botnetz). Achtet also darauf, irgendeine Art von Authentifizierung einzubauen. Ein völlig abgedrehter Name des steuernden HTTP-Headers würde da schon reichen.

Jetzt muss natürlich noch die Konfiguration unter Linux angepasst werden. Ich hab es so gemacht.

	...
	'file' => array(
		'open' => array(
			'default' => 'wget --quiet --spider --tries=1 --header="X-P-Command: [default] %s" http://192.168.3.136:9000/ > /dev/null',
		),
	...
	'folder' => array(
		'open' => array(
			'default' => 'wget --quiet --spider --tries=1 --header="X-P-Command: [folder]%s" http://192.168.3.136:9000/ > /dev/null',
		),
	...

Sollten Probleme beim Aufsetzen unter Windows aufkommen, helfe ich natürlich gern weiter.

blog comments powered by Disqus

Christoph Erdmann Christoph Erdmann, 38
MINISTRY
Sicherheit in Webapplikationen und Shell-Fu

Nils Vogt Nils Vogt, 30
MINISTRY
iOS-Fighter