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.

Ein individuelles dmenu erstellen

Das gute dmenu wurde zwar primär für die Verwendung mit dem Fenstermanager dwm entwickelt, es lässt sich aber auch mit anderen kombinieren. Zum ersten Mal habe ich das dieses Jahr bei Crunchbang beobachtet, das auf Debian Squeeze und den Openbox-Fenstermanager setzt.
Doch zuerst einmal, so sieht dmenu für gewöhnlich aus.


Indem man die Anfangsbuchstaben des gesuchten Programms eintippt und das Ganze mit Tab vervollständigt, bewegt man sich in rasender Geschwindigkeit durch alle installierten Anwendungen, die im eigenen $PATH installiert sind. Programme werden danach durch Enter gestartet, fertig. Kein Warten, sehr effizient, Gnome-Do oder gar Unity und die Gnome-Shell werden dadurch zum Ausführen von Programmen überflüssig.
Normalerweise benötige ich bei Openbox und vergleichbaren Fenstermanagern nur das Rechtsklickmenü und ein paar Tastenkürzel. Mit dem Skript dmenu-bind.sh von Gatti Paolo lässt sich aus dmenu aber ganz leicht eine übersichtliche Menüstruktur erstellen.
Der Aufbau ist einfach und leicht nachzuvollziehen. Unter die Menüpunkte wie z.B. web werden der Name des Menüpunkts und der auszuführende Befehl geschrieben.

chromium "chromium"

oder

vim "urxvtcd -e vim"
In dem Menü kann man danach wie gehabt mit den Pfeiltasten und der Enter-Taste navigieren. Das Skript lässt sich z.B. in ~/.config/dmenu/dmenu-bind.sh abspeichern und in ~/.config/openbox/rc.xml oder mit Hilfe von obmenu an eine Taste binden.

<keybind key="A-F3">
  <action name="Execute">
    <startupnotify>
      <enabled>true</enabled>
        <name>dmenu-bind</name>
    </startupnotify>
        <command>~/.config/dmenu/dmenu-bind.sh</command>
  </action>
</keybind>

Das angepasste dmenu kann nun mit Alt+F3 aufgerufen werden.


Das gesamte dmenu-bind.sh Skript sieht so aus.

#!/bin/bash
#       Custom dmenu-bind.sh
#
#       Copyright 2009, Gatti Paolo (lordkrandel at gmail dot com)
#       Distributed as public domain.
#       09.28.2009 -- First release
#       09.29.2009 -- Submenu support added
if [ "$1" == "" ]; then
    title="MainMenu"
    menu=(
#               labels            commands
#           Main =========================================
                web               "$0 web"
                system            "$0 system"
                tools             "$0 tools"
                settings          "$0 settings"
    )
else
    case $1 in
    web)
        title="web"
        menu=(
#           Web ==========================================
                firefox           "firefox"
                lostirc           "lostirc"
         )
    ;;
    tools)
        title="tools"
        menu=(
#           Tools ========================================
                gedit             "gedit"
                geditsudo         "gksudo gedit"
         )
    ;;
    system)
        title="system"
        menu=(
#           System =======================================
                home              "pcmanfm"
                tilda             "tilda"
                synaptic          "gksudo synaptic"
         )
    ;;
    settings)
        title="settings"
        menu=(
#           Settings =====================================
                volume            "$0 volume"
                dmenu             "gedit $0"
                obconf            "obconf"
         )
    ;;
    volume)
        title="Volume"
        menu=(
#           Volume controls ==============================
                0%                "amixer sset Master 0"
                50%               "amixer sset Master 50"
                70%               "amixer sset Master 70"
                100%              "amixer sset Master 100"
         )
    ;;
    esac
fi
for (( count = 0 ; count < ${#menu[*]}; count++ )); do
#   build two arrays, one for labels, the other for commands
    temp=${menu[$count]}
    if (( $count < ${#menu[*]}-2 )); then
        temp+="n"
    fi
    if (( "$count" % 2 == "0" )); then
        menu_labels+=$temp
    else
        menu_commands+=$temp
    fi
done
select=`echo -e $menu_labels | dmenu -p $title -nb black -nf white -sb darkblue -sf white`
if [ "$select" != "" ]; then
#   fetch and clean the index of the selected label
    index=`echo -e "${menu_labels[*]}" | grep -xnm1 $select | sed 's/:.*//'`
#   get the command which has the same index
    part=`echo -e ${menu_commands[*]} | head -$index`
    exe=`echo -e "$part" | tail -1`
#   execute
    $exe &
fi

Die Shell austauschen: Der Wechsel von bash zu zsh

Als letzten Schritt zu meinem Konsolensetup mit Debian Squeeze auf dem Thinkpad 600, habe ich mich entschieden die Bash gegen zsh auszutauschen. In der Regel habe ich keine Probleme mit Bash und alles was ich brauche finde ich auch dort.
Mit dieser Einstellung kommt man natürlich nicht weiter, weswegen ich mir schon im Februar beim Ausprobieren von Grml vorgenommen habe die Zsh-Shell näher anzuschauen. Nicht von ungefähr sind deswegen Grmls .zshrc und .zshrc.local mein Ausgangspunkt um mehr über Zsh zu lernen.

wget -O .zshrc http://git.grml.org/f/grml-etc-core/etc/zsh/zshrc
wget -O .zshrc.local http://git.grml.org/f/grml-etc-core/etc/skel/.zshrc

Grml selbst hat Zsh zu einem Hauptbestandteil der eigenen Linuxdistribution erklärt und ein kleines Unterprojekt namens zsh-lovers geschaffen, damit Tipps und Tricks besser vermittelt werden können.
Da ich selbst noch am Anfang stehe, hier nur die auffallendsten Veränderungen bei Zsh, die einem sofort ins Auge springen.
Tab Completion. Die Autovervollständigung von Zsh ist um Längen besser als das bei Bash der Fall ist. Die Bash Completion ist wirklich gut, aber wenn man Zsh gesehen hat, möchte man am liebsten nichts anderes mehr haben. Zsh hat Menüs, in denen man mit den Pfeiltasten navigieren kann. Die Optionen von aptitude werden mit Erklärung übersichtlich angezeigt. Zsh zeigt zum Beispiel mit kill[Tab] die Prozesse an, die der jeweilige Nutzer beenden darf und ermöglicht es bequem mit den Pfeiltasten zwischen ihnen zu navigieren.
Autokorrektur. Tippfehler werden automatisch von zsh korrigiert. Aus atiptude wird aptitude.
Trotz dieser Verbesserungen fühlt sich Zsh nicht wie etwas vollkommen Neues zu Bash an. STRG+R oder STRG+L funktionieren genauso. Zsh lässt sich im Moment genauso wie die Bash benutzen, ohne dass ich hier eine große Veränderung spüre.

Zsh installallieren

    1. aptitude install zsh
    2. Die Login-Shell für jeden Benutzer mit dem Kommando chsh ändern und auf /bin/zsh verweisen.

Allgemein: chsh -s /bin/zsh USER

Nach dem Aus- und wieder Einloggen in tty hat man danach bei Debian und Ubuntu Zsh als neue Shell eingestellt. Mal schauen wie sie sich in der Zukunft schlagen wird. Im Moment macht Zsh auf jeden Fall Spaß und die Umstellung war nicht wirklich schwierig. Außerdem lassen sich nun problemlos Dateien mit Vim und Vils umändern. 🙂

WebM: Videos mit Mplayer und Debian Squeeze abspielen

Als ich mit dem Thinkpad 600 begann Youtube Videos gegen den Framebuffer abzuspielen und dabei mal wieder auf mein Elinks-Youtube-dl-Mplayer-Setup zurückgriff, stellte ich plötzlich fest, dass etwas mit Mplayer nicht stimmte.
Das Problem rückte erst jetzt in den Vordergrund, weil ich in den letzten Wochen diesen ressourcenschonenden Trick lediglich auf dem Inspiron 4000 mit Debian Sid angewendet hatte. Da der Thinkpad 600 aber mit Debian Stable angetrieben wird, nahm ich die Veränderung bei Youtube erst vor kurzem wahr. Die Rede ist von WebM.
Das WebM-Projekt ist ein von Mozilla, Opera, Adobe, Google und siebzig anderen Herstellern entwickeltes offenes Videoformat, welches zusammen mit Vorbis als Audio-Codec und dem VP8 Video-Codec der freie Webstandard zur Übertragung von Video- und Multimediaangeboten werden soll.
Das kleine Python-Skript youtube-dl lädt mittlerweile standardmäßig Youtube-Videos im WebM-Format herunter, das Mplayer in der aktuellen Version in Debian Stable aber nicht abspielen kann. Der entsprechende Patch erschien erst einige Wochen nach dem Freeze im Sommer 2010. Es gibt nun mehrere Möglichkeiten. Entweder man übersetzt Mplayer für seinen Computer selbst oder man greift auf bestehende Binärpakete von deb-multimedia.org zurück.
Die /etc/apt/sources.list muss um den folgenden Eintrag erweitert werden

deb http://www.deb-multimedia.org squeeze main non-free

Danach sollte zuerst der GPG-Schlüssel für das Archiv auf deb-multimedia.org heruntergeladen werden.

aptitude install deb-multimedia-keyring

Schließlich noch das alte Mplayer-Paket entfernen und das neue mplayer-nogui (empfehlenswert um Ressourcen zu sparen) oder Mplayer-Paket installieren. Danach lassen sich auch Videos im WebM-Format problemlos mit Debian Squeeze abspielen.
Update: Mittlerweile stehen auch aktuelle Backports von Mplayer in den offiziellen Repositorien von Debian zur Verfügung.

Probleme mit bash-completion und WebM lösen

Auch der Patch für die bash-completion, um WebM-Dateien per TAB-Taste zu vervollständigen, kam zu spät. Ich habe mich mal daran gewagt und das aktuelle Paket bash-completion in Debian Sid installiert. Entweder man schaltet Sid in der sources.list frei oder man lädt das Paket manuell von einem der Spiegelserver auf der zuletzt verlinkten Seite herunter. Nach der Installation lassen sich nun auch *.webm Dateien vervollständigen. Probleme habe ich durch den Mix mit Unstable noch nicht festgestellt. Wie immer auf eigene Gefahr anwenden. 😉

Surfraw: Eine gottgefällige Erweiterung zur Shell

Ungläubige brauchen erst gar nicht weiterzulesen, hier kommt Surfraw!

Was die Schöpfer über ihr Programm sagen

Surfraw – Shell Users’ Revolutionary Front Rage Against the World Wide Web
Surfraw bietet eine schnelle Unix-Kommandozeile zum Zugriff auf eine Vielzahl von beliebten WWW Suchmaschinen und andere mächtige Werkzeuge. Es holt google, altavista, dejanews, freshmeat, research index, slashdot und viele andere aus dem pockeninfizierten Reich des falschen Propheten der HTML-Formulare zurück und platziert diese Wunder dort, wo sie hingehören: tief in das Herz von Unix, als gottgefällige Erweiterungen zur Shell.

Surfraw ist eine Anwendung, die ich nicht mit vielen Screenshots präsentieren kann, die mir aber seit ihrer Entdeckung jeden Tag besser gefällt. Abgesehen vom ausgeprägten Humor der Entwickler hat diese in Bash programmierte Schnittstelle ins World Wide Web einiges zu bieten.

Installation

aptitude install -R surfraw

Der -R Schalter ist sinnvoll, damit das zusätzliche Paket surfraw-extra nicht automatisch mitinstalliert wird. Die im Paket surfraw angebotenen elvis reichen in der Regel vollkommen aus.

Wie es funktioniert

Was sind elvis? Der Name elvi ist eine Eigenkreation der Macher und lässt sich wohl auf einen Fan von Elvis Presley unter ihnen zurückführen. Im Prinzip steht elvi nur als Oberbegriff für die verschiedenen Suchmaschinen, die surfraw ansprechen kann. Eine Übersicht liefert:

surfraw -elvi

Möchte man z.B. direkt vom Terminal aus nach einem Youtube-Video des omnipräsenten (zumindest für amerikanische Youtube-Nutzer) Justin Bieber suchen genügt ein

surfraw youtube Justin Bieber

oder kürzer

sr youtube Justin Bieber

Noch besser wäre es auf das vorangestellte surfraw oder sr ganz zu verzichten, indem die elvis in den $PATH des Benutzers installiert werden. Das geht mit dem mitgelieferten surfraw-update-path. Als normaler Benutzer einfach folgendes ausführen

surfraw-update-path -add

Danach scheint die Suche nach Youtube-Videos im Terminal das Natürlichste auf der Welt zu sein.

youtube Justin Bieber

Surfraw verwendet den voreingestellten Browser zum Öffnen der Suchergebnisse. Je nach dem ob ich mich in einer grafischen oder rein konsolenbasierten Umgebung aufhalte, startet entweder Iceweasel, Midori oder elinks. Dieses Verhalten lässt sich global für alle Benutzer eines Systems überschreiben oder separat für jeden einzelnen festlegen.
Neben Youtube benutze ich Google, Ixquick, Duckduckgo und Wikipedia am häufigsten. Hat man das Terminal sowieso immer offen, bietet surfraw eine schnelle Möglichkeit eine Suche zu starten, ohne dabei zuerst den Browser zu öffnen und den Begriff in ein Suchfeld eingeben zu müssen. Insbesondere kann ich mir damit auch die Suche mit einem Smart Prefix in elinks ersparen, um Youtube Videos mit Hilfe von youtube-dl und mplayer abspielen zu können. 😉
Übrigens der Schöpfer von Surfraw war ein gewisser Julian Assange.

Die kleinen Dinge des Lebens

Das hier fällt vielleicht so ein bisschen unter Linuxtipps für Anfänger, dennoch stoße ich immer noch auf einige Kniffe, die ich nicht gekannt, nie gebraucht und nach denen ich zuerst auch nicht gesucht habe. Aber wie heißt es so schön: Wer suchet der findet.
Jeder kennt die praktische Fähigkeit einer guten Linux-Shell Befehle und Ausdrücke mit der TAB Taste zu vervollständigen. Außerdem möchte man sicher nicht die “History” Funktion vermissen. Mit den Pfeiltasten für hoch und runter, lassen sich die zuletzt eingetippten Kommandos wieder hervorholen.
Doch erst wenn man komplett auf grafische Werkzeuge beginnt zu verzichten und Kommandos im Terminal zu Dutzenden tippt, wird das Verlangen nach einer Suchfunktion immer größer.

Das gibt es natürlich schon lange für die Bash. Führt man die Tastenkombination STRG+R im Terminal aus, erscheint (reverse-i-search):
Nun genügt es die Anfangsbuchstaben des gesuchten Kommandos einzugeben und mit der Zeichenkette ssh erscheint dann der ssh oder sshfs Befehl, den man vor 100 Zeilen mal eingetippt hatte. Drückt man erneut STRG+R erscheinen weitere Befehle, auf die das eingegebene Muster passt. Mit der Enter Taste lässt sich das gefundene Kommando ausführen und mit ESC gelang man zur alten Eingabeaufforderung zurück. Wirklich simpel und äußerst nützlich.

Auch praktisch sind STRG+K, womit alles vom Cursor aus bis zum Ende der Zeile gelöscht wird oder STRG+U, womit alles in entgegengesetzter Richtung gelöscht wird. Mit STRG+A springt man zum Anfang und mit STRG+E zum Ende der Zeile und mit STRG+W werden einzelne Worte nach links gelöscht. Als Otto-Normal-Linuxbenutzer braucht man das meiste davon aber oft sowieso nicht. Doch wenn man erst einmal damit angefangen hat, möchte man es nicht mehr missen.

Apropos, mit Openbox wechsele ich mit STRG+ALT+Pfeiltaste links/rechts zwischen Arbeitsflächen hin und her. Das geht übrigens auch mit den schnöden TTY-Terminals. Mit STRG+ALT+F2 geht es auf die Konsole tty2 und mit ALT+Pfeiltaste links/rechts kann man ganz bequem und schnell, wie in einer grafischen Desktopumgebung, zwischen den Terminals wechseln.
Keine großen Neuigkeiten, aber die kleinen Dinge des Lebens machen es oft angenehm. 😉

Solarized: dircolors mit 256 Farben für rxvt-unicode

Seit zwei Monaten nutze ich Ethan Schoonovers Farbschema “Solarized” für meinen Terminalemulator rxvt-unicode und meinen bevorzugten Editor Vim. Ich bin seither sehr zufrieden mit dem neuen Aussehen des Terminals. Verzeichnisse und verschiedene Arten von Dateien werden dadurch einfach besser hervorgehoben. Am liebsten wäre mir aber anstatt der 16 ANSI Farben das komplette 256-Farben-Thema gewesen. Obwohl ich damals die richtige TERM-Variable in .Xdefaults gesetzt hatte, passierte leider rein gar nichts.
Doch dann geschah es.
Als ich vor ein paar Tagen aptitude search rxvt ausführte, entdeckte ich plötzlich das Paket rxvt-unicode-256color. Autsch und Sorry. 😳 Irgendwie muss mir entgangen sein, dass es mehrere Rxvt-Unicode-Pakete bei Debian gibt und stillschweigend hatte ich angenommen, dass man den 256-Farben-Modus in der .Xdefaults an- und ausschalten kann.
Hat man rxvt-unicode-256color erst einmal installiert und die Variable

urxvt*termName:        rxvt-unicode-256color

in der .Xdefaults gesetzt, muss man nichts weiter tun als die Datei dircolors.256dark von seebis git Repositorium herunterzuladen und wie im alten Beitrag beschrieben nach ~/.dir_colors kopieren und dann von ~/.profile mit dem eval Befehl aufzurufen. Danach sind dann die Farben der Dateien und Verzeichnisse mit 256 Farben solarisiert.

Auch die Farben in Vim sehen dann gegenüber der alten 16 Farben ANSI Version natürlich verändert aus.

Mir gefällt Solarized als Farbthema weiterhin ausgezeichnet gut und wer nicht so auf dunkle Themen steht, sollte sich auch einmal die helle Version von Solarized anschauen, auf die sich spielend leicht in jedem Editor umstellen lässt.

Der Stromeditor sed und ein kleines Skript namens vils

Vor zwei Monaten hatte ich kurz zwei Methoden abseits grafischer Programme vorgestellt, wie man mit Hilfe der Bash und dem Texteditor VIM mehrere Dateien umbenennen kann. Als ich wenige Wochen später mit einem Freund über das gleiche Thema sprach und dabei die eher ungewöhnliche VIM Methode vorstellte, musste ich mir sagen lassen: “Mit einem Texteditor? Das ist ja umständlich. Warum hast du nicht sed benutzt?” 😐 Pah, gibt es denn keine Sonderpunkte mehr für kreative Lösungen. 😉
Mein Ziel mit der Kategorie “Leben auf der Konsole” ist weniger, Abhandlungen über Programmiersprachen und gute Praxistipps für Systemadministratoren zu schreiben. Ich glaube letztere würden sich sowieso langweilen, während andere alle Vorurteile über den typischen Linuxnutzer bestätigt sähen. Ich widme dem Ganzen trotzdem gerne ab und zu meine Aufmerksamkeit, weil sehr viele Probleme sich mit Linux auf unterschiedliche Weise schon von Haus aus lösen lassen. Außerdem habe ich mit der Zeit festgestellt, dass einfache Lösungen, Eleganz und Effektivität sich bei Konsolenanwendungen nicht zwangsläufig ausschließen müssen, eher das Gegenteil ist der Fall.
Bei GNU sed verhält es sich ähnlich. Es gibt schon tonnenweise gute Informationen im Internet. Als Lektüre empfehle ich z.B. sed, awk und reguläre Ausdrücke.
Um das alte Beispiel mit dem Umwandeln von Groß- in Kleinschreibung aufzugreifen, das lässt sich mit sed so lösen:
Als Testlauf

for DATEI in *.jpg ; do NEUEDATEI=`echo $DATEI | sed -e 's/(.*)/L1/'` ; echo "$DATEI wird umbenannt in $NEUEDATEI" ; done

Und so gehts richtig

for DATEI in *.jpg ; do NEUEDATEI=`echo $DATEI | sed -e 's/(.*)/L1/'` ; mv "$DATEI" $NEUEDATEI ; done

Mehr Beispiele gibt es auch hier und hier. Wie der letzte Link zeigt, gibt es tatsächlich mehr als nur eine Möglichkeit Dateinamen von Groß- nach Kleinschreibung oder umgekehrt zu ändern.
Jeder kann nun für sich entscheiden, ob die VIM-Methode oder sed einfacher war. Bei wenigen Dateien verschwende ich auf so etwas sowieso keine Anstrengungen und ändere es schnell per Hand. Wenn aber Tausende von Dateien geändert werden müssen, lohnt sich der Blick auf sed und eine simple Schleifenkonstruktion.
In meinem alten Beitrag hat andre noch auf ein kleines Skript namens vils hingewiesen, welches es auch direkt für Arch Linux in AUR und für FreeBSD oder direkt als Download zu geben scheint. Ruft man vils auf, werden automatisch alle Dateinamen in einem Verzeichnis im Editor der Wahl angezeigt. Dort können sie verändert werden und werden nach dem Abspeichern im Editor exakt so umbenannt. Das Skript nimmt einem also das ls | vim - und das Hinzufügen von Shell Befehlen wie mv innerhalb von vim ab. Leider scheint es nur für die zsh Shell zu funktionieren, ist aber eine praktische Sache, wenn man oft Dateien umändern muss und dafür gerne einen vielseitigen Texteditor wie Vim benutzt.
Fazit: Es gibt wie so oft immer mehr als eine Lösung für das gleiche Problem.

Solarized: Massage für die geplagten Augen

Ab und an bin ich auf der Suche nach einer neuen Idee um das Terminal ein wenig zu verändern. Diese Woche bin ich an einer interessanten Farbpalette namens Solarized hängen geblieben. Ethan Schoonover hat ein, wie ich finde, elegantes Thema gefunden, welches unter anderem die Farbgestaltung diverser Terminalemulatoren und die Syntaxhervorhebung von Editoren optimiert.

Farben in Vim ändern

Als Farbschema in Vim habe ich z.B. bis vor kurzem desert genutzt und nun erst einmal auf Solarized umgestellt. Das Thema schafft es mit geringem Kontrast sowohl auf dunklem als auch auf hellem Hintergrund zu überzeugen.
Die Installation war nicht besonders schwer.

  1. Auf der Homepage von Ethan Schoonover die gezippte Datei solarized.zip herunterladen.
  2. Im Ordner vim-colors-solarized die Datei solarized.vim nach ~/.vim/colors kopieren.
  3. ~/.vimrc editieren:

    syntax enable
    set background=dark
    colorscheme solarized

Für einen hellen Hintergrund das dark einfach durch light ersetzen. Es gibt noch ein paar optionale Einstellungen, die aber gut dokumentiert sind.

Farbpalette in rxvt-unicode auf solarized anpassen

Normalerweise stelle ich keine großen Anforderungen an einen Terminalemulator (na gut vielleicht ein paar ;)), außer dass er schnell reagieren muss, wenig Ressourcen verbraucht und flexibel anpassbar ist. Hier kommt dann rxvt-unicode oder kurz urxvt ins Spiel.
Im Solarized-Ordner Xresources müssen die dort stehenden Farbwerte entweder in die Datei Xresources oder in die Xdefaults im Home Verzeichnis kopiert werden.
Nach diesen Schritten sieht eine Python Datei in Vim nun so aus.

dircolors in urxvt anpassen

Die Farben der Verzeichnisse und Dateien sahen mit dem GNU Befehl ls noch nicht “solarized” aus. Dank huyz git repository und ausführlicher Anleitung hat sich mein Terminal nun von den Standardfarben weiterentwickelt.
Aus einem nicht nachvollziehbaren Grund konnte ich die 256 Farben Version nicht nutzen (*hust* hier steht warum), obwohl die TERM Variable auf “rxvt-unicode-256color” gesetzt worden war. Die Farben waren komplett falsch. Das ANSI-Universal Thema hingegen funktionierte.

  1. Die entsprechende Datei bei seebi oder huyz git repository herunterladen.
  2. Die Datei dircolors.ansi-universal kann z.B nach ~/.dir_colors kopiert werden.
  3. Den Befehl eval `dircolors $HOME/.dir_colors` in die Datei ~/.profile einfügen.

Dann den Terminal neustarten und man sollte ähnliche (leider keine 256 Farben) Terminal-Screenshots wie bei huyz sehen.

Fazit

Solarized gefällt mir zur Zeit ziemlich gut. Die Vim-Konfiguration ist sehr angenehm für die Augen und verschiedene Syntax wird deutlich hervorgehoben. Einzelne Konsolenanwendungen funktionieren aber noch nicht perfekt mit meiner momentanen Konfiguration und solarized. So gibt es bei manchen Htop-Themen auch mal gar nichts zu lesen auf Grund unpassender Kontraste zwischen verschiedenen Schriftfarben. Da Solarized noch im Beta Stadium ist kann ich nicht 100% sagen, ob es an dem Thema liegt oder falscher Einstellungen meinerseits. Wahrscheinlich eher letzteres.
Tiefergehende Diskussionen zu diesem Thema gibt es auch hier. Als Erinnerung für mich: Um die Terminus Schriftart unter Debian für urxvt einzurichten muss das Paket xfonts-terminus installiert werden und in der .Xdefaults folgender Eintrag stehen:

urxvt*font: xft:Terminus:pixelsize=14

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. 🙂