Skip to content

Tip #8: Einfache Suche in der History mit den Pfeiltasten

Jörg wartete gestern bei unserem Stammtisch mit einem netten Schnipsel auf:


autoload -U history-search-end                                                  
zle -N history-beginning-search-backward-end history-search-end                 
zle -N history-beginning-search-forward-end history-search-end                  
bindkey “\e[A”  history-beginning-search-backward-end                           
bindkey “\e[B”  history-beginning-search-forward-end

Dieser Fünfzeiler sorgt dafür, dass man mit den Pfeil-Hoch- und -Runter-Tasten die History durchsuchen kann. Beispiel:


$ ls
$ less abc
$ vim xyz
$ ssh example.org
$ man zsh
$ less foo

Dies sei ein Ausschnitt der History. Nun gibt man l und Pfeil nach oben ein. Beim ersten Druck erscheint less foo, beim zweiten less abc und beim dritten ls. Die Eingabe von le und der Pfeiltaste würde hier nur die less-Befehle erscheinen lassen.

Ich finde das recht nützlich und habe das gleich mit in meine .zshrc aufgenommen.

Hitparade der Shellkommandos

ak und Tim machen es vor und ich muss es natürlich nachmachen. :-) Meine Top10 der meistgenutzten Shellkommandos:

jens@qbiathome:~/ > fc -ln 1|awk ‘{print $1}’ |sort|uniq -c | sort -rn |head -n 10
    597 ls
    454 rm
    440 svn
    279 ll
    277 screen
    274 ssh
    242 gpg
    224 man
    206 slrn
    195 less

Ich habe oben das Builtin fc der zsh genutzt. Man kann da auch, wie in die obigen Postings history oder gleich $HISTFILE nutzen.

Tip #7: Tastenbelegung wie beim Emacs nutzen

Heute gibt es mal wieder einen zsh-Tip und vielleicht schaffe ich es zukünftig etwas mehr davon zu schreiben.

Wenn ich mich mit neuen zsh-Nutzern unterhalte, höre ich oft von dem Problem, dass die Strg+A-Taste nur ein ^A einfügt. Ebenso passiert das mit Strg+E und anderen Tasten. Im Endeffekt heißt das, dass der Nutzer bisher das Emacs-Tastenschema genutzt hat und dies nun in der zsh auch wieder tun will. Falls aber nichts genaues eingestellt ist, liest die zsh die Umgebungsvariable EDITOR aus und stellt das Schema entsprechend dem dort gesetzten Standardeditor (oftmals vim) ein. Um das zu ändern kann man am Prompt bindkey -e emacs eingeben oder aber man trägt diese Zeile direkt in die .zshrc ein. Die Einstellung set -o emacs bewirkt das Gleiche.

Tip #6: Substitution von Verzeichnissen

Auf der Mailingliste der zsh-Nutzer lief mir heute ein netter Tip über den Weg:

Stelle dir vor, du befindest dich im Verzeichnis /var/www/user123/statistik/log/heute und willst nach /var/www/user134/statistik/log/heute wechseln, d.h. einfach in dasselbe Verzeichnis eines andren Nutzers. In der zsh geht das ganz einfach:

cd 123 134

Siehe da, du stehst im richtigen Verzeichnis.

Log vom zsh-Workshop

Wer ein wenig zsh lernen wollte, konnte vor kurzem ins IRC kommen. Dort gab es einen Workshop zur zsh. Wie auch Mika habe ich das nicht geschafft, mit hin zu kommen. Zum Glück gibt es ein IRC-Log vom Workshop (auch lokal) zum Nachlesen. Bei Gelegenheit werde ich mir das zu Gemüte führen und vielleicht den einen oder anderen nützlichen Tip draus basteln.

Tip #5: run-help

Zufälligerweise stiess ich gerade auf ein nettes Feature, welches mir bis dato unbekannt war: run-help.

In der Standardkonfiguration ist run-help einfach ein Alias auf man und macht nichts anderes als die Manpage des Arguments aufzurufen. Doch man kann das schnell ein wenig intelligenter machen:

unalias run-help
autoload run-help

Der alleinige Aufruf von run-help bringt nun:

kubijens@ppc210:~/ > run-help   
Here is a list of topics for which special help is available:

alias          compvalues     getln          rehash         unlimit
autoload       continue       getopts        return         unset
[...]

Wenn ihr das mit einem Argument aufruft, navigiert euch run-help an die jeweilige Stelle der zsh-Manpage. Das Kommando hat sich bei mir schnell als äußerst nützlich herausgestellt.

Tip #4: Globbing

Die zsh bringt einen äusserst mächtigen Mechanismus zum sog. Globbing, d.h. zur Ermittlung von Dateinamen, mit. Wie das funktioniert, will ich nun an einigen Beispielen demonstrieren:

Du hast in einem Projekt folgende Dateien angelegt:

kubijens@ppc210:~/TeXing/ > ls
file10.tex  file13.tex  file3.tex  file6.tex  file9.tex
file11.tex  file1.tex   file4.tex  file7.tex  Makefile
file12.tex  file2.tex   file5.tex  file8.tex  master.tex

Um vom Globbing der zsh zu profitieren, solltest du dies zuerst einschalten. Gib dazu die Zeile setopt extendedglob entweder direkt in die .zshrc oder in die Kommandozeile ein. Nun steht dir das erweiterte Globbing voll zur Verfügung.

Stell dir vor, du hast die obigen LaTeX-Dateien kompiliert. Dadurch sind dann eine Menge an .aux-, .log und .dvi-Dateien entstanden. Wenn du jetzt wissen willst, was außer den eigentichen LaTeX-Dateien denn sonst da ist, hilft das “^”. Dies neigert das ihm folgende Muster:

kubijens@ppc210:~/TeXing/ > ls ^*.tex
file10.aux  file12.aux  file1.aux  file3.aux  file5.aux  file7.aux  file9.aux
file10.dvi  file12.dvi  file1.dvi  file3.dvi  file5.dvi  file7.dvi  file9.dvi
file10.log  file12.log  file1.log  file3.log  file5.log  file7.log  file9.log
file11.aux  file13.aux  file2.aux  file4.aux  file6.aux  file8.aux  Makefile
file11.dvi  file13.dvi  file2.dvi  file4.dvi  file6.dvi  file8.dvi
file11.log  file13.log  file2.log  file4.log  file6.log  file8.log
kubijens@ppc210:~/TeXing/ > ls ^*.*  
Makefile

Eventuell kann es auch interessant sein, bestimmte Bereiche anzuzeigen:

kubijens@ppc210:~/TeXing/ > ls file<1-7>.tex 
file1.tex  file2.tex  file3.tex  file4.tex  file5.tex  file6.tex  file7.tex
kubijens@ppc210:~/TeXing/ > ls file<7->.tex
file10.tex  file11.tex  file12.tex  file13.tex  file7.tex  file8.tex  file9.tex

Richtig interessant wird es dann mit “**/”. Dieser veranlasst eine rekursive Suche. Dazu habe ich in der obigen Struktur drei Verzeichnisse mit jeweils weiteren Dateien angelegt:

kubijens@ppc210:~/TeXing/ > ls **/                                           
HTML/:
file10.html  file13.html  file3.html  file6.html  file9.html
file11.html  file1.html   file4.html  file7.html  file.html
file12.html  file2.html   file5.html  file8.html

PDF/:
file10.pdf  file12.pdf  file1.pdf  file3.pdf  file5.pdf  file7.pdf  file9.pdf
file11.pdf  file13.pdf  file2.pdf  file4.pdf  file6.pdf  file8.pdf  file.pdf

PS/:
file10.ps  file12.ps  file1.ps  file3.ps  file5.ps  file7.ps  file9.ps
file11.ps  file13.ps  file2.ps  file4.ps  file6.ps  file8.ps  file.ps
kubijens@ppc210:~/TeXing/ > ls **/file1*.*
file10.aux  file11.tex  file13.log        HTML/file11.html  PDF/file13.pdf
file10.dvi  file12.aux  file13.tex        HTML/file12.html  PDF/file1.pdf
file10.log  file12.dvi  file1.aux         HTML/file13.html  PS/file10.ps
file10.tex  file12.log  file1.dvi         HTML/file1.html   PS/file11.ps
file11.aux  file12.tex  file1.log         PDF/file10.pdf    PS/file12.ps
file11.dvi  file13.aux  file1.tex         PDF/file11.pdf    PS/file13.ps
file11.log  file13.dvi  HTML/file10.html  PDF/file12.pdf    PS/file1.ps

Ich denke, dass System ist einfach zu verstehen. Hinter dem Suchmuster kann man nun noch eine Art Vermerk machen und so die Treffer etwas einschränken. Ein Beispiel wäre, sich nur die Verzeichnisse anzeigen zu lassen. Hierzu musst du ls auch die Option -d mitgeben (-F für das Anhängen einen “/” an den Verzeichnisnamen kann u.U. auch sinnvoll sein):

kubijens@ppc210:~/TeXing/ > ls -d *(/)
HTML  PDF  PS Leer
kubijens@ppc210:~/TeXing/ > ls -dF *(/)
HTML/  PDF/  PS/ Leer/

Nur Verzeichnisse mit Inhalt anzeigen:

kubijens@ppc210:~/TeXing/ > ls -d *(F)
HTML  PDF  PS

Ausführbare Dateien (*) oder Einträge mit einem x-Bit (x) anzeigen:

kubijens@ppc210:~/TeXing/ > ls -d *(*)
file12.aux  file12.dvi  file12.log  file12.tex
kubijens@ppc210:~/TeXing/ > ls -d *(x)
file12.aux  file12.dvi  file12.log  file12.tex  HTML  Leer  PDF  PS

Es gibt hier noch zahlreiche weitere Parameter. Alle sind in der Manpage zshexpn im Abschnitt “Filename Generation” aufgeführt. Ich kann euch nur empfehlen, mal ein wenig damit herumzuspielen. Ihr werdet sehr schnell sehen, was für ein mächtiges Werkzeug ihr damit an der Hand habt.

Tip #3: Rechnen in der Shell

Hin und wieder muss ich mal etwas ausrechnen. Wenn nun Google mal nicht zur Hand ist und man auch Python nicht als Taschenrechner gebrauchen will, eignet sich immer noch die Zsh. Der bekannte Weg, um in der Shell zu rechnen ist: echo $AUSDRUCK | bc. Aber die Zsh hat ja Module. Unter anderem auch mathfunc. Dieses wird mittels zmodload zsh/mathfunc eingebunden und kann dann benutzt werden:
kubijens@qbiathome:~/ > echo $(( 1+2 ))
3
kubijens@qbiathome:~/ > echo $(( sin(1+2) ))
0.14112000805986721
kubijens@qbiathome:~/ > echo $(( sin(1+2) + sqrt(16) ))
4.14112000805986721
kubijens@qbiathome:~/ > (( a = sin(1+2) + sqrt(16) ))
kubijens@qbiathome:~/ > echo $(( ceil(a) ))
5.
kubijens@qbiathome:~/ > echo $(( rand48() ))
0.60922352992416506
kubijens@qbiathome:~/ > echo $(( rand48() ))
0.12633637755484983
Es existieren noch eine Vielzahl an weiteren Funktionen. Diese finden sich alle in der Handbuchseite zshmodules.

Tip #2: Durch Verzeichnisse navigieren

Eine Sache, ich bei der Zsh sehr mag, ist das schnelle Navigieren durch Verzeichnisse. Diverse Sachen helfen hierbei:
  1. setopt autocd - Dies sorgt dafür, dass man Verzeichnisse wechseln kann, ohne jedes Mal cd einzugeben. Einfach den Namen am Prompt eingegeben und schon steht man im gewünschten Verzeichnis
  2. Kurznamen für lange Verzeichnisse - Dies Zsh bietet sog. Named Directories. Hier kann man einem beliebigen Verzeichnis einen Kurznamen geben und dann einfach dahin wechseln. Beispiel: pydoc=/usr/share/doc/python-doc/html. Um zu wechseln, reicht die Eingabe cd ~pydoc. Einfach und schnell
  3. Verzeichnisse rotieren - Stell dir vor, du bist eine ganze Zeit zwischen verschiedenen Verzeichnissen gewechselt und möchtest nun den Weg zurück gehen. Was machst du? Ein Weg wäre, zwei Aliase zu nutzen: alias -- +=’pushd +1’; alias -- -=’pushd -0’. Nun kannst du mit + <ENTER> bzw. - <ENTER> einfach hin und her wechseln.
Hab ich noch was wichtiges vergessen?

Tip #1: Löschabfrage

Ist es euch schon öfters mal passiert, dass ihr versehentlich ein rm * eingegeben habt? Nach Murphys Gesetz war dann drei Sekunden später klar, dass ihr die Daten doch brauchen würdet. Die Zsh kann euch hier ein wenig schützen: Setzt einfach in eurer .zshrc die Option rmstarwait (setopt rmstarwait). Nun wird die Zsh bei der obigen Eingabe 10 Sekunden warten und euch dann fragen, ob ihr die Datei wirklich löschen möchtet.

zsh Tips

Ich hatte kürzlich eine Diskussion mit Mika, Sven und Maddi, ob man denn nicht einen regelmäßig erscheinenden zsh-Newsletter herausbringen sollte. Wir alle fanden die Idee zwar grundsätzlich gut. Doch keiner von uns hat so richtig Zeit, sich darum zu kümmern. Allerdings bin ich schon der Meinung, dass die zsh viel mehr Beachtung bekommen sollte. Daher habe ich eine neue Kategorie eingerichtet und werde versuchen, einzelne kleine Tips hier zu veröffentlichen. Solltest du einen Vorschlag für einen Tip haben, schreibe mir einfach eine E-Mail oder hinterlasse einen Kommentar. Wenn du bislang noch nichts von der zsh gehört hast, kannst du dir erste Infos auf: holen.
cronjob