Mehrfachauswahl
- Leertaste markiert/entmarkiert den Eintrag unter dem Cursor und rueckt eine
Zeile weiter; markierte Eintraege werden fett und gelb dargestellt.
- Strg+A markiert alles bzw. hebt alles auf, Esc leert die Markierung.
- Die Pfadleiste oben zeigt die Anzahl markierter Eintraege je Paneel.
- l/u/d arbeiten auf allen markierten Eintraegen, sonst auf dem Cursor-Eintrag,
und melden anschliessend Erfolge und Fehler.
- Markierungen werden bei Verzeichniswechsel und nach Transfers verworfen und
beim Neuaufbau auf tatsaechlich vorhandene Eintraege eingedampft.
Datei-Betrachter
- Enter bzw. v oeffnet Textdateien mit Syntax-Hervorhebung; die Sprache
bestimmt Pygments anhand des Dateinamens (.txt, .md, .cpp, .py, ...).
- Entfernte Dateien werden dafuer in eine Temporaerdatei geladen und danach
wieder entfernt. Binaerdateien und Dateien ueber 2 MiB werden abgelehnt.
- Blaettern mit Pfeiltasten/Bild/Pos1/Ende, w schaltet den Umbruch, l die
Zeilennummern, Esc/q schliesst.
- Enter auf einer Datei setzte vorher remote_path auf die Datei selbst, was
das anschliessende listdir() scheitern liess.
Verbindungsdialog
- Pfeiltasten wechseln jetzt zwischen den Feldern. Ein eingeklapptes Select
band up/down auf show_overlay und verschluckte sie; NavSelect gibt sie an
den Screen weiter, geoeffnet wird mit Enter/Leertaste. Ist das Overlay
offen, behaelt es seine eigene up/down-Navigation.
- Enter in einem Eingabefeld verbindet, Strg+S speichert das Profil.
- Dialog bei kleinen Terminals scrollbar.
Bedienmenue skaliert
- Pfad- und Statusleiste hatten "height: 1" und wurden am rechten Rand
abgeschnitten; sie brechen jetzt um (height: auto).
- Der Footer wurde entfernt: seine Tasten reichten bei 78 Zeichen Breite bis
Spalte 193 und waren zu zwei Dritteln unsichtbar. Die umbrechende
Statusleiste zeigt die Belegung stattdessen vollstaendig.
- Spaltenbreiten der Dateiliste richten sich nach der Paneelbreite; zuerst
entfaellt das Datum, dann die Groesse. Vorher ragten die Spalten ueber das
Paneel hinaus und erzeugten einen horizontalen Scrollbalken.
- Fehlermeldungen stehen in einer eigenen Zeile, die nur bei Inhalt Platz
belegt. Bisher wurden sie in die Statusleiste geschrieben und dort vom
naechsten Cursor-Wechsel sofort wieder ueberschrieben.
paramikos getcwd() liefert None, solange kein chdir() erfolgt ist. Der
Rueckfall auf "." landete als remote_path in der App, woraus _join()/_abs()
Pfade wie "/./datei" bauten. Der Server loeste die relativ zum Dateisystem-
Root statt zum Home auf -> "No such file" beim Download, "Permission denied"
beim Upload. Das Listing funktionierte, weil listdir(".") serverseitig
relativ zum Home aufgeloest wird -- daher fiel es erst beim Transfer auf.
- connect()/chdir()/listdir() loesen den Pfad ueber sftp.normalize() auf
- _abs() haengt relative Pfade an das CWD an, statt blind "/" voranzustellen
- _copy_tree(): die beiden mkdir-Zweige waren vertauscht. Beim Download
wurde backend.mkdir() auf einen lokalen Pfad angewendet (Verzeichnis
entstand auf dem Server), beim Upload os.makedirs() auf einen entfernten.
Ordner-Transfers waren dadurch in beide Richtungen defekt.
Verifiziert per End-to-End-Test gegen einen echten sshd/SFTP-Server:
Datei- und rekursiver Ordner-Transfer in beide Richtungen.
Closes#3
- Screen-Bindings lösen Actions im Screen-Namespace auf. "quit" traf daher
ins Leere, weil Screen.action_quit nicht existiert – die Taste wurde still
verworfen. Bindings auf "app.quit" umgestellt (q im Browser, Escape im
Verbindungsdialog).
- RenameScreen._ok rief do_rename() auf sich selbst statt auf den darunter
liegenden BrowserScreen (AttributeError). Reihenfolge korrigiert: erst
pop_screen(), dann do_rename().
- RenameScreen mit Escape abbrechbar.
- Neuer Helfer _selected_entry() blendet den ".."-Navigationseintrag aus.
Download, Upload, Löschen und Umbenennen operierten sonst auf "↑ ..".