Xclip: Copy&Paste mit Rxvt-Unicode, Vim, Elinks und der Konsole

Text kopieren von X nach Konsole ist manchmal keine ganz triviale Aufgabe. Umgekehrt leider auch nicht. Etwas einfacher macht es Xclip.
Im Regelfall lassen sich Texte mit der Maus markieren und mit einem Klick auf die mittlere Maustaste (bei nur zwei Maustasten beide simultan gedrückt halten) an einer anderen Stelle wieder einfügen (Primäre Auswahl). Ebenso funktioniert z.B. in Rxvt-Unicode die Tastenkombination Shift+Einfg. Ich stellte jedoch immer wieder fest, dass Text falsch formatiert in einer Konsolenanwendung gelandet ist.
Xclip ist da der ideale Helfer, wenn man in einer X-Anwendung, z.B. einem Browser, Text markiert und in der Zwischenablage (Clipboard) speichert und ihn dann in ein Konsolenprogramm mit STRG+v oder ALT+v einfügen möchte. Hier sind ein paar Ideen Xclip mit bekannter Software für die Konsole einzusetzen.

Xclip im Terminal und in Skripten

Z.B. Quellcode markieren und in der Datei clipboard ausgeben. Der Parameter -o gibt den Inhalt der primären Zwischenablage nach STDOUT aus.
xclip -o > clipboard
Xclip eignet sich auch hervorragend für Pipe-Konstruktionen. Hier wird z.B. die Ausgabe von dmesg | grep eth0 in die primäre Zwischenablage kopiert, die sich mit der mittleren Maustaste in jede X-Anwendung einfügen lässt.
dmesg | grep eth0 | xclip
Siehe auch man xclip.

Xclip und VIM

Glücklich darf man sich schätzen, wenn man nicht nur auf GRMLs ZSH-Konfiguration, sondern auch GRMLs .vimrc gestoßen ist. Der Tipp stammt ursprünglich aus dem Vim-Wiki.

:map <F7> :w !xclip<CR><CR>
:vmap <F7> "*y
:map <S-F7> :r!xclip -o<CR>

Wenn SHIFT-F7 im Terminal der Wahl nicht funktioniert und "*y den Text ebenfalls nicht wie vorgesehen in den Buffer von Vim kopiert, kann man noch eine andere Variante aus den Kommentaren zum Tipp benutzen.

vmap <F6> :!xclip -f -sel clip
map <F7> mz:-1r !xclip -o -sel clip`z

Sobald sich etwas in Vims Buffer befindet, lässt sich mit F6 dieser Inhalt in die Zwischenablage kopieren und wie gewohnt mit STRG+V in eine X-Anwendung einfügen. Anders herum geht es mit F7 innerhalb von Vim, wenn man zuvor einen Text in einer grafischen Anwendung kopiert hat.

Xclip und Elinks

Ich will nun niemanden zu Textbrowsern wie Elinks bekehren, aber es gibt auch Anwendungsfälle, in denen sie sich sehr gut mit grafischen Browsern und anderen Anwendung ergänzen. Es gibt leider Webseiten, die lassen sich selbst mit modernen Rechnern nur schwerfällig betrachten, wenn Javascript und Flash die Überhand zu nehmen scheinen. Ich benutze deswegen zum Download und Anschauen von Youtube-Videos gerne auch Elinks in Kombination mit Youtube-dl und dem MPlayer. Die Konfiguration funktioniert nicht nur mit betagten Oldtimern, sondern spart mir auch die Zeit beim Auffinden von neuen Videos.
Durch die Brille eines Textbrowsers betrachtet ist Youtube nur eine Ansammlung von Links zu mehr oder weniger gut gelungenen Videos. Im alten Beitrag benutze ich die y-Taste zum Download oder Abspielen eines markierten Links und Alt-y um das Video der aktuell aufgerufenen Seite zu verarbeiten.
Mit Elinks lässt sich ein Link natürlich nicht nur an Youtube-dl oder Mplayer delegieren. Nicht ganz einfach ist es, die Adresse der gerade besuchten Seite in Elinks an die Zwischenablage zu übergeben und den Link anschließend weiterzureichen. Benutzt man jedoch Xclip ist nur ein weiterer Eintrag im Optionsmanager notwendig.

Taste O -> Dokumente -> URI-Delegierung

Jetzt nur noch einen neuen Eintrag namens "Zwischenablage" hinzufügen, der den folgenden Befehl ausführt.
echo -n %c | xclip -i -selection clipboard
Bedeutet nichts anderes, als dass der Link an Xclip übergeben und in die Zwischenablage kopiert wird, von wo er mit STRG+v in jede X- oder Konsolenanwendung eingefügt wird. Je nach dem, ob nun die y-Taste oder Alt-y aufgerufen wird, lässt sich so der Link der gerade besuchten Webseite oder irgendein beliebiger Link auf einer Seite, der gerade ausgewählt ist, in die Zwischenablage kopieren und dort weiterverarbeiten.
Klingt nach einer esoterischen Lösung, jedoch ist sie außerordentlich schnell. Am besten behält man sie im Hinterkopf, wenn man wieder einmal Elinks, Irssi, Mplayer, Youtube-dl, Wget, Aria2 und andere bekannte Applikationen für die Konsole benutzt.

Rxvt-Unicode

Zum Schluss: Rxvt-Unicode oder kurz urxvt. Ein schlanker Terminal-Emulator, der über Unicode- und Perl-Unterstützung verfügt. Bert Münnich hat eine nette Sammlung von nützlichen Perl-Erweiterungen für urxvt zur Verfügung gestellt, darunter auch das Clipboard-Skript. Welche Veränderungen man dafür in der .Xdefaults/.Xresources vornehmen muss, steht z.B. im Gentoo-Wiki.
Mit Xclip und der Perl-Erweiterung ist es danach möglich auch Text in die Zwischenablage zu kopieren und umgekehrt auch von X-Anwendungen mit Control-v in Rxvt-Unicode einzufügen.
Kopiert das Clipboard-Skript nach /usr/lib/urxvt/perl, um es global verfügbar zu machen. Meine Optionen für die .Xdefaults sind dann:

urxvt*perl-lib:         /usr/lib/urxvt/perl
urxvt*perl-ext-common:  default,clipboard
urxvt.keysym.A-c:     perl:clipboard:copy
urxvt.keysym.A-v:     perl:clipboard:paste
urxvt.keysym.A-C-v:   perl:clipboard:paste_escaped
urxvt.clipboard.copycmd:  xclip -i -selection clipboard
urxvt.clipboard.pastecmd: xclip -o -selection clipboard

Hier wird der Pfad zu den Perl-Erweiterungen definiert und die neue Erweiterung clipboard freigeschaltet. Die restlichen Zeilen legen die Tastenkombinationen fest, mit denen man Text vom Terminal in die Zwischenablage kopieren und umgekehrt auch wieder einfügen kann. Wichtig ist auch hier, dass sowohl für das Kopieren als auch für das Einfügen Xclip verwendet wird.

Fazit

Ich bin mir sicher, jeder stößt im Laufe der Zeit auf das Kopieren-und-Einfügen-Problem. Zwar ist die Standardlösung mit dem Markieren von Text mit der Maus und dem Einfügen mit der mittleren Maustaste sehr bequem und dazu auch noch äußerst schnell ausgeführt, jedoch funktioniert das bei umfangreich formatiertem Text nicht immer bestens. Mit Xclip gibt es ein sehr leichtgewichtiges Programm, dass das Leben auf der Konsole auf jeden Fall angenehmer macht. 🙂

Zsh und vils: Leerzeichen von Dateinamen in Vim durch Unterstriche ersetzen

Ich habe vor einiger Zeit aus Neugier die Bash mit Zsh ersetzt und dabei auf die sehr nützliche Konfiguration von .zshrc und .zshrc.local von Grml zurückgegriffen. Seitdem habe ich auf jedem Rechner mit Ausnahme des Toshiba Satellite 220cs, dort läuft immer noch die ash von Busybox, die Shell ausgetauscht.
An dieser Stelle will ich nicht lange über Zsh schwärmen und davon erzählen, warum euer Leben sinnlos ist, solange ihr Zsh nicht selbst ausprobiert habt. (Es gibt genug Seiten, die das tun.) Nein, womöglich kommt man als normaler Mensch auch wunderbar mit der Bash aus, sowie das bei mir jahrelang der Fall war. Dennoch...der Austausch war einfach und ich konnte mir das Installieren der bash-completion und die farbenfrohe Veränderung der Bash dank Grml sparen.
Abgesehen davon, dass ich nun eine phänomenale Tab-Vervollständigung habe und nicht mehr nur eine großartige, dass meine Tippfehler praktischerweise korrigiert werden und ich mit Hilfe von vils problemlos Dateien und Ordner in Vim umbenennen kann, musste ich mich bisher auch kaum umstellen.
Mehr über vils lässt sich auf freshports.org erfahren, wo es zwei Links zum Herunterladen dieses kleinen Skripts gibt.

Das Skript sollte man mit chmod u+x ausführbar machen und am besten gleich nach /usr/local/bin kopieren, damit man es im $PATH benutzen kann.
Die Bedienung ist simpel. Man führt es im Verzeichnis aus, indem man die Dateien oder Unterverzeichnisse umbenennen möchte, wodurch alle Namen in Vim importiert werden und dann beliebig geändert werden können. Speichert man danach, werden alle Dateien und Ordner dementsprechend umbenannt.
Als Hinweise werden im Skript genannt:

  1. Man solle die Nummern vor jeder Zeile nicht entfernen.
  2. Wenn man eine Zeile löscht und abspeichert, wird die Datei nicht gelöscht.
  3. Man kann jedes Zeichen zum Ersetzen benutzen, nur muss man doppelt angeben.
  4. Es wird vor dem Überschreiben gleichlautender Dateinamen gefragt.
  5. Man kann den Dateinamen von zwei oder mehr Dateien nicht austauschen.
  6. Man kann gezielt einzelne oder mehrere Dateinamen in Vim laden, indem sie auf der Kommandozeile übergeben werden. (vils datei1 datei2 datei3)

Leerzeichen mit Unterstriche tauschen

Ich entferne im Visual-Block-Modus immer die vorangestellten Nummern und füge sie nach der Umbenennung wieder ein. STRG+v, dann d zum Löschen und später p zum Einfügen. Das ist ein Weg um zu verhindern, dass das erste Leerzeichen zwischen der Nummer und dem Dateinamen durch einen Unterstrich ersetzt wird. Danach genügt im Normalmodus:
:%s/ /_/g
Nachdem die Nummern wieder eingefügt und alles abgespeichert wurde, sind sämtliche Leerzeichen durch Unterstriche ersetzt worden.
Wenn man sich nun noch ein paar Reguläre Ausdrücke vorstellt, lässt sich so ziemlich jedes Umbenennungsproblem innerhalb von Vim mit Hilfe von vils lösen und man kann auf diese Lösung, die aber ebenso gut funktioniert, verzichten.

Apt-Pinning für die Mutigen

Apt-Pinning. Ein oft genanntes Stichwort bei Debian und Co. Manchmal möchte man eine neuere Softwareversion installieren als diejenige, die in einer bestimmten Veröffentlichung von Debian- oder Ubuntu vorhanden ist. Die Gründe sind vielfältig. Vielleicht ist man lediglich an einem neuen Feature interessiert, andererseits kann man aber genauso gut auch auf ein neues Paket angewiesen sein oder es ausschließlich aus Neugier installieren.
Für Debian Stable gibt es genau aus diesem Grund das offizielle Backport-Projekt, mit dem sichergestellt ist, dass ausgewählte Pakete zwar aktueller sind als die bestehenden, aber immer noch stabil mit dem Gesamtsystem harmonieren.
Mit Apt-Pinning gibt es eine weitere Möglichkeit für erfahrene und fortgeschrittene Anwender aktuellere Software zu installieren. Insbesondere ist diese Methode für Debian Testing und Unstable interessant, wenn man z.B. Pakete aus dem Experimental Zweig zusätzlich installieren möchte und es kann unter Umständen auch für Debian Stable eine Option sein, wenn keine Backports vorhanden sind.
Meine Motivation für diesen Beitrag waren zwei Pakete in Debian Testing, die nicht aktualisiert wurden, obwohl in Unstable eine Version vorhanden war, die Bugs beseitigte.
Im Regelfall bin ich der typische, langweilige Debianbenutzer. Bei meinen Stable-Installationen läuft nur Stable, bei Testing nur Testing und bei Unstable...nur Unstable. Das ist zwar wenig aufregend, hat mich bisher aber immer vor instabilem Paket-Mischmasch bewahrt.
Manche ätzen, dass das Mischen von Paketen später nur mit der Suche nach Hilfe in irgendwelchen Foren oder IRC-Channels enden kann, wo die Methusalems dich erst einmal zu Abbitte und Buße auffordern. Du möchtest nicht wissen, was mit Leuten passiert, die eingestehen Ubuntu-PPAs mit Debianpaketen gemischt zu haben. Ihr seid also gewarnt! 😈
Apt-Pinning wird ausführlich und gut mit man apt_preferences erklärt. Hilfreich finde ich außerdem

Apt-Pinning anhand eines Beispiels

Bei meinem konkreten Problem ging es um Vim und Iceweasel. Vor einem Monat wurde ich durch Zufall auf #debian im IRC auf einen Bug in Vim aufmerksam gemacht, den ich zwei Stunden später dann per Reportbug gemeldet habe. Die Bearbeitung und Lösung des Problems war mustergültig. Der Paketverwalter bestätigte den Fehler und knapp zwei Wochen später war der Bug durch Upstream gefixt worden und das neue Paket in Debian Unstable. Doch auch Wochen danach kam davon nichts in Testing an. Mittlerweile hat es das Paket zwar nach Testing geschafft, doch gerade in so einem Fall kann Apt-Pinning weiterhelfen.
Mein anderer Favorit ist Iceweasel. In der Regel folge ich den Anweisungen auf mozilla.debian.net und habe zum gleichen Thema auch schon einen Beitrag geschrieben. Im Moment dauert es aber mal wieder mit dem Versionswechsel von 7 auf 8 und 9 ist nicht mehr weit entfernt.

Apt-Pinning Pin-Priorität

In einem solchen Fall ist Apt-Pinning sehr einfach global einzurichten. Standardmäßig wird jedem Paket, jeder Installation und Aktualisierung eine Priorität zugewiesen, von der man in der Regel gar nichts mitbekommt. Alle installierten Pakete haben Prioriät 100, alle anderen Pakete innerhalb einer Version wie z.B. Squeeze 500. Überprüfen lässt sich das mit

apt-cache policy

Die Zahlenwerte haben laut man apt_preferences eine unterschiedliche Gewichtung. Im Allgemeinen gilt umso höher der Zahlenwert, desto höher die Priorität ein Paket aus einer anderen Version zu installieren. Für mich funktioniert das Folgende ziemlich gut:
Erstellt euch in /etc/apt/apt.conf.d/ eine Datei mit beliebigem Namen. Ich habe hier 10default-release gewählt und editiert sie mit folgendem Inhalt. Z.B.:

APT::Default-Release "testing";

Das gilt natürlich nur für Debian Testing und sollte auf die entsprechende Debian Version geändert werden, die man gerade benutzt. Führt man danach ein aptitude update aus und anschließend apt-cache policy stellt man fest, dass sich die Priorität für die Pakete in Debian Testing auf 990 erhöht hat.
Zwar wäre das Folgende auch ohne diese Festlegung machbar gewesen, mir hilft es aber sicherzustellen, dass bei zukünftigen Updates immer Testing Pakete vor allen anderen bevorzugt werden.
Um nun Vim oder Iceweasel aus Debian Unstable zu installieren, muss man zuerst die Paketquellen in /etc/apt/sources.list aktualisieren und z.B. folgenden Eintrag für Unstable hinzufügen.

deb http://ftp.de.debian.org/debian unstable main

Danach lässt sich Iceweasel oder Vim aus Unstable mit

aptitude -t unstable install iceweasel vim

installieren. Bei zukünftigen Updates prüft Apt, ob die Version aus Unstable oder Testing neuer sein sollte. Da Testing bei mir eine höhere Priorität bekommen hat, wird im Zweifelsfall immer aus Testing installiert.
Das ist natürlich noch nicht alles. Apt kann mehr, viel mehr. Wenn ihr Ubuntu benutzt lässt sich z.B. explizit festlegen, ob ihr nur Pakete aus 10.04 bevorzugt oder doch besser 11.04. Wie wäre es, wenn man festlegen könnte, ob man nur bis Version X aus Debian Testing installiert und danach nur noch Pakete aus Experimental installiert? Wie schränke ich meine Prioritäten nur auf KDE-Pakete ein?
Apt ist ein wirklich sehr mächtiges und smartes Programm. Doch in der Regel kommt man wie oben beschrieben schon mit sehr wenig Aufwand aus und sollte beim Mischen von Paketen verschiedener Versionen immer skeptisch bleiben. Für alle, die sich eine maßgeschneiderte Preferences-Datei anlegen möchten, empfehle ich wie schon gesagt einen Blick in man apt_preferences zu werfen oder sich das folgende fortgeschrittene Beispiel anzuschauen.
Raphael Hertzog bezeichnete vor sieben Monaten die Installation von Gnome 3 aus Debian Experimental in Testing als "apt-pinning for the brave". Das zu bewerten, liegt wie immer bei euch. 😉

Die trivialen Dinge über die keiner spricht

Was haben Raumschiff Enterprise Folgen und Blog-Artikel über Leben auf der Konsole gemeinsam?
Beide verschweigen gerne die trivialen Dinge des Lebens. Womöglich habt ihr euch auch schon einmal gefragt, wie Captain Picard und Co. es eigentlich mit den Sanitären Anlagen halten? Üblicherweise wird dieses nur allzu menschliche Detail in jeder Star Trek Folge geflissentlich ausgeblendet.
Posts zum Thema Linux und Konsole verhalten sich ähnlich. Man erfährt schnell, dass man mit einem zehn Jahre alten Laptop problemlos das Wetter der Erde in Echtzeit rendern kann, doch das "Wie kopiere ich eigentlich Texte im Terminal von A nach B" wird als selbstverständlich vorausgesetzt. Hier ist mein Versuch das Geheimnis um die Bedienung der Muscheln zu lüften.

GPM - General Purpose Mouse

Ich gebe zu, ich kann nicht alle Gewohnheiten ablegen, die sich in Jahren der Arbeit mit grafischen Oberflächen angesammelt haben. Instinktiv suchte ich deshalb nach einer Lösung wie man Texte mit der Maus markieren kann, um sie dann durch Kopieren und Einfügen an eine andere Stelle zu bewegen.
In der Regel erfüllt GPM diesen Zweck hervorragend. Bei gedrückter linker Maustaste markiert man den Text, wechselt zum Programm, in das man ihn einfügen möchte und drückt die rechte Maustaste. Mehr braucht es nicht um Wörter und Texte von A nach B zu kopieren. Vorausgesetzt natürlich man hat nur zwei Tasten zur Verfügung. Bei einer Drei-Tasten Maus ist die mittlere Taste die Einfüge-Taste.

Kopieren und Einfügen mit Screen

Wem die Maus suspekt erscheint, hat mit dem Terminalmultiplexer Screen (Tmux hat eine ähnliche Funktion) die Möglichkeit Texte mit der Tastatur in einen Buffer zu kopieren und auch wieder zum Vorschein zu bringen.

  1. STRG+A ESC startet den Kopiermodus. Ein danach erneut gedrücktes ESC bricht ihn ab. Im Copy Mode lässt sich wie im Vim Editor navigieren. h,j,k,l oder mit den Pfeiltasten. Mit g und G springt man zum Anfang und zum Ende.
  2. Space-Taste. Drückt man nach der STRG+A ESC Sequenz die Space-Taste markiert man somit den Anfang des Textes, den man kopieren möchte. Der Vorgang lässt sich durch einen weiteren Druck auf die Space-Taste beenden. Danach befindet sich die Kopie im Buffer.
  3. STRG+A ] Mit dieser Kombination wird schließlich der Text an der gewünschten Stelle wieder in Screen eingefügt.

Native Copy&Paste Funktionen der Konsolenprogramme

Die Notizbuch-Anwendung hnb z.B. lässt in Sachen Kopieren, Ausschneiden und Einfügen keine Wünsche offen. Dies funktioniert mit der bekannten Tastenkombination STRG+c, STRG+x und STRG+v.
Da man Kopieraufgaben hauptsächlich in Editoren benötigt, empfiehlt sich natürlich Vim. 😉 Mit vim -p datei1 datei2 datei3 usw. lassen sich mehrere Dateien gleichzeitig in verschiedenen Tabs öffnen. Zwischen diesen kann man im Kommandomodus mit gt oder gT navigieren. Im selben Modus lassen sich neue Tabs mit dem Befehl :tabnew öffnen.
Kopieren wird bei Vim yanking genannt. Startet man den Visuellen Modus mit v lässt sich der Text mit den gewohnten Bewegungstasten markieren und mit y kopieren und mit p einfügen. Yanking funktioniert auch im Kommandomodus z.B. mit yy für eine Zeile oder y3w für das Kopieren von 3 Wörtern. Der Löschen Befehl dd, d3w usw. lässt sich zugleich auch zum Ausschneiden benutzen.
Soweit zum Thema. Die man Seite zu Screen hat hier z.B. noch einiges zu Copy&Paste zu bieten. Momentan machen die vorgestellten Alternativen das Leben für mich auf der Konsole ein gutes Stück angenehmer.

Vim: Effizientes Editieren von Text als Gewohnheit

Es ist Zeit mal ein paar Worte über Vim zu verlieren. Wie ich an mancher Stelle schon mehr oder weniger angedeutet habe, ist Vim mittlerweile mein bevorzugter Editor geworden, wenn es um das Schreiben und Verändern neuer Texte geht. Das war nicht immer so. Genauer gesagt konnte ich anfangs wenig mit ihm anfangen, wobei sich hier die Erinnerungen mit Vi vermischen, der mir als Linuxeinsteiger immer empfohlen wurde, wenn es um das Ändern von Systemeinstellungen ging. Irgendwann gewöhnte ich mich schließlich an die Besonderheiten von Vim und gab schließlich nur noch intuitiv vim Dateiname ein, wenn ich ein Dokument bearbeiten wollte.
Ich denke die unterschiedliche Wahrnehmung von Vim in der Öffentlichkeit ergibt sich aus den verschiedenen Blickwinkeln der einerseits euphorischen Vimpropheten und den sogenannten Durchschnittsbenutzern, die lediglich ein paar Worte in einem Textdokument ändern möchten. Tatsächlich finden sich die größten Befürworter im Lager der fortgeschrittenen Technikfreaks, oft Programmierer und Poweruser, die einen großen Teil ihrer Zeit schon hinter dem Rechner verbracht haben und selbst schon nicht mehr merken, wenn sie Fachbegriffe so verwenden als seien sie mittlerweile in die Allgemeinsprache übergegangen.
Beide Standpunkte lassen sich zusammenführen. Das Problem bei Software wie Vim ist, die übrigens dieses Jahr schon ihren 20. Geburtstag gefeiert hat!, dass man oft nicht weiß, wie man sich ihr am besten nähern soll. Auf linuxundich.de wurde das Thema vor kurzem auch angesprochen, weswegen ich vor allem die Links in den Kommentaren und das sehr nützliche interaktive Webtutorial hier noch einmal vorstellen möchte.

Anfänger

Ich selbst würde mich als fortgeschrittenen Anfänger bezeichnen, weil ich bis letztes Jahr nicht mehr über Vim wusste als die Informationen, die in den folgenden Anfängertutorials vermittelt werden. In der Regel reichen diese Tipps und Tricks auch vollkommen aus, um Vim schon effektiv bedienen zu können, ohne auch nur eine Ahnung von den bücherfüllenden Features für Fortgeschrittene und Experten haben zu müssen.
Der erste Anlaufpunkt sollte der in Vim eingebaute Vimtutor sein, den man einfach durch Eingabe von vimtutor in der Kommandozeilte starten kann. In ungefährt 30 Minuten lässt sich diese deutschsprachige Schritt-für-Schritt Anleitung durcharbeiten, wonach man die Grundkonzepte von Vim kennengelernt hat. Als Alternative oder Ergänzung bietet sich das schon erwähnte interaktive Webtutorial an.

Fortgeschrittene

Vims überragende Eigenschaften erschließen sich oft nur für Programmierer und Poweruser, die täglich mit mehreren Dutzend Dateien und tausenden Zeilen Code arbeiten müssen. Um diese Verzückung verstehen zu können, sollte man sich zuerst einmal ein paar Videos zu Vim anschauen. Verheimlichen will ich dabei auch nicht, dass der größte Teil der Dokumentation nur in Englisch verfügbar ist, diese aber exzellent und umfassend ist. Einfach mal im Kommandomodus :help eingeben.

  • Derek Wyatt hat eine Serie von Screencasts erstellt, die einfache Konzepte und fortgeschrittene Techniken von Vim auf seine humorvolle Art vermitteln.
  • Auf vimcasts.org werden ebenfalls in mehreren ausgezeichneten Screencasts die Fähigkeiten von Vim demonstriert.
  • Immer einen Blick Wert ist das Vim Wiki und die darin befindlichen Referenzen zu anderen Vim Tutorials.
  • Da ich zu den Leuten gehöre, die immer noch gerne klassische Bücher lesen, kann ich auch vim 7 Ge-Packt von Reinhard Wobst empfehlen.
  • Was könnte besser sein als dem Vim-Meister Bram Moolenaar persönlich bei seiner Präsentation zu Vim "7 Habits for effective Text Editing 2.0" zu folgen?

Egal was andere über Vim erzählen, wenn dir dein bestehender Editor gefällt und er für dich funktioniert, solltest du dabei bleiben. Ansonsten empfehle ich Vim. 😉

Mehrere Dateien umbenennen mit Bash und Vim

Folgendes Problem: Viele, viele Dateien sollen umbenannt werden. Richtig praktisch für eine solche Aufgabe fand ich bisher nur das Programm Bulk-Renamer, welches Bestandteil des Dateimanagers Thunar ist. Sucht man im Internet weiter, findet man schnell weitere grafische Lösungsmöglichkeiten unter Linux.
Ich möchte die Anzahl solcher Zubehörprogramme möglichst klein halten und unabhängig von Desktopumgebungen oder Programmbibliotheken sein. Gerade ein solches Problem ruft förmlich nach einer schnellen, nicht-grafischen Lösung: Der Shell
Bei Debian und Ubuntu kann man standardmäßig auf die Bash zurückgreifen. Einen möglichen Ansatz zum mehrfachen Umbenennen von Dateien bietet eine Schleifenkonstruktion, die ich schon einmal in Zusammenhang mit dem massenhaften Umwandeln von Bild- und Videodateien in freie Formate vorgestellt habe.

#!/bin/bash
counter=123
for i in *.jpg; do
    mv -i "$i" "Sommer_Urlaub_$counter".jpg
    let counter+=1
done

Dieses kleine Skript muss nur noch abgespeichert und mit chmod+x ausführbar gemacht und in dem betreffenden Bilderverzeichnis ausgeführt werden. Dabei werden alle *.jpg Dateien der Reihe nach mit dem GNU Kommando mv in Sommer_Urlaub_123.jpg usw. umbenannt, wobei der Zähler bei 123 anfängt und dann am Ende der Schleife jeweils um 1 hochgezählt wird.

VIM - VI improved

Zuerst denkt man, wie kann ein Texteditor wie vim schon großartig beim Umbenennen von Dateien helfen? Ich muss zugeben, im Laufe der Zeit hat mich vim immer mehr begeistert und nachdem ich mir schon das Buch Vim 7 - Ge-Packt von Reinhard Wobst gekauft habe, stöbere ich auch ab und zu im Vim Wiki herum.
Gerade zum Thema "Mehrere Dateien umbenennen" gibt es schon einen englischen Eintrag namens Bulk rename files.
Um mehrere Dateien z.B. von Großschreibung zu Kleinschreibung zu transformieren, sendet man an vim einfach eine Liste mit allen in einem bestimmten Verzeichnis vorhandenen Dateinamen.

ls | vim -

Dadurch könnte es in Vim vielleicht so aussehen:

SOMMER_URLAUB_CIMG074.jpg
SOMMER_URLAUB_CIMG075.jpg
SOMMER_URLAUB_CIMG076.jpg
SOMMER_URLAUB_CIMG077.jpg
usw.

Um diese Dateinamen z.B alle in Kleinschreibung abzuändern, muss folgender Suche-und-Ersetze-Befehl in vims Kommandomodus eingegeben werden.

:%s/.*/mv -i "&" \L"&"/g

Ergebnis
mv -i "SOMMER_URLAUB_CIMG074.jpg" "sommer_urlaub_cimg074.jpg"
mv -i "SOMMER_URLAUB_CIMG075.jpg" "sommer_urlaub_cimg075.jpg"
mv -i "SOMMER_URLAUB_CIMG076.jpg" "sommer_urlaub_cimg076.jpg"
mv -i "SOMMER_URLAUB_CIMG077.jpg" "sommer_urlaub_cimg077.jpg"

Bisher wurden die Dateien vollkommen unberührt gelassen. Alles hat sich in Vim abgespielt. Mit der Taste "u" kann die Aktion rückgängig und mit STRG+R das Rückgängige rückgängig gemacht werden.
Wirklich ausgeführt wird die Umbenennung erst, wenn Zeile für Zeile an die Bash als Befehl übergeben wird.
Das lässt sich durch

:w !sh
oder
:%!bash

erreichen.
Auch in Vim lässt sich ein Zähler einbauen. Der allgemeine Ansatz scheint zu sein, eine separate Funktion zu schreiben, welche wiederum eine Zahl fortlaufend erhöht. Für meinen Geschmack habe ich dadurch in dem konkreten Beispiel gegenüber der for Schleife nichts gewonnen.
Warum ich Vim als Alternative angeführt habe, ist vielmehr der Vorteil, dass man alles in Ruhe vorher betrachten und prüfen kann, bevor man die Veränderung auf seine Dateien loslässt. Außerdem bietet Vim z.B. die praktische Möglichkeit mit dem visuellen Modus nur ein paar Dateien auszuwählen und den Befehl hierauf anzuwenden.
Dazu genügt es "v" zu drücken, mit den Cursortasten den Bereich zu selektieren, dann wieder in den Kommandomodus mit ":" wechseln und es erscheint automatisch schon

:'<,'>

Das ergänzt zu

:'<,'> !bash

und nur der ausgewählte Teil wird auch tatsächlich ausgeführt. Richtig interessant wird es aber erst mit Regulären Ausdrücken. Wer also z.B. nur den Buchstaben U, nach dem ersten Unterstrich groß oder klein schreiben möchte oder nur bestimmte Muster ersetzen möchte, kommt an den regular expressions nicht vorbei. Natürlich ist das ein Feature jeder guten Programmier- und Skriptsprache und nicht auf Vim beschränkt, welches in Sachen Reguläre Ausdrücke sowieso einen besonderen Weg gegangen ist.
Ich denke für einen so einfachen Fall bleibe ich weiterhin bei der Bash. Auch die Alternative rename sollte man sich anschauen. Wer aber bisher dachte, dass Texteditoren nur zum Ändern von Konfigurationsdateien taugen, kennt jetzt zumindest einen Tipp mehr aus dem umfangreichen Vim Wiki und es gibt dort noch viele, viele mehr. 🙂