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