ftblog

:: widerstand zwecklos ::
email jabber gpgkey
hackergotchi

September 23, 2005

Tooltime: zsh #4

Filed under: tooltime -- 23:29

zsh Completion - minimizing your typing effort

Zuerst einmal ein kleiner Einschub:
In Stephen 'caphuso' Rueger's irctalk über die zsh hat er am Anfang
kurz angegeben für wen die Z-Shell nichts ist. Also, wenn sich der Leser
in eine dieser Gruppen einordnen würde, sollte er doch evtl überlegen,
ob er nicht doch die Finger von der zsh lassen möchte:

(caphuso's talk ist englisch, ich übersetze hier nach bestem Wissen):
Die zsh ist nichts für dich, wenn
  1. du nur simple Dinge mit deiner Shell machst, weil du eigentlich
    ein gnome/kde/xfce User bist.
  2. du Angst vor komplexen Programmen hast,
    denn die zsh ist _sehr_ komplex
  3. du in einer Unicodeumgebung arbeitest, denn Unicode
    Unterstützung gibt es _noch_ nicht.
    [...] Im Moment wird daran gearbeitet [...]
    Aber es kann noch ein paar Monate dauern bis es soweit ist.

Ein Log des irctalks gibt es _hier_!

So, nun zur Completion, dem (für mich) zweiten Hauptfeature der zsh:

Per dafault sind bei der zsh etliche Completion Funktionen dabei, so dass
man eigentlich wunschlos sein könnte.... _könnte_ ;-)

Wenn man nun gerade begonnen hat, die Z-Shell zu nutzen, wird man
sagen "WTF?!? Die Completion ist bullshit. _Nichts_ wird kompletiert!"

Das liegt daran, dass die Completion noch garnicht aktiv ist.
Man packe folgendes in seine .zshrc:

### load completion system
  zmodload zsh/complist
  autoload -U compinit && compinit

Aha! Viel besser...

Um nun zu zeigen das es _sehr_ einfach ist dieses System an seine
Vorlieben anzupassen, gebe ich ein paar Beispiele die ich in meiner
Konfiguration benutze.

Was mich am Anfang an der zsh nervte, war das ich in den Completions
das '..' Verzeichnis nicht hatte. Um dem Problem beizukommen kann
man folgendes machen:

% zstyle ':completion:*' special-dirs ..
Easy. Schaut doch ganz simpel aus!

Weiter:
Ich nutze häufig die beiden Kommandozeilentools mpg123 und ogg123...
Wenn ich nun einen Song abspielen will, dann will ich in der Completion
für ogg123 nur oggs, und in der Completion für mpg123 nur mp3s haben.
Und das geht so:

% zstyle ':completion:*:*:mpg123:*' file-patterns '*.(mp3|MP3):mp3\\ files *(-/):directories'
% zstyle ':completion:*:*:ogg123:*' file-patterns '*.(ogg|OGG):ogg\\ files *(-/):directories'

Fertig! Schaut so ähnlich aus wie das erste Beispiel, aber nicht mehr
ganz so simpel. Was sollen die ganzen '*' zwischen den ':'. Und gibt's
noch was anderes als file-patterns, und wie funktioniert das letzte Argument
in den Anführungszeichen?

Tja, gehen wir die Sache systematisch an:
Die komplette Form des ersten zstyle Arguments lautet:

:completion:<func>:<completer>:<command>:<argument>:<tag>
<func> ist der Name der Funktion von der die Completion ausgerufen wird.
In den meisten Fällen ist das Argument leer, was bedeutet das es von der
Standard-Completion aufgerufen wird.

Bei <completer> geht es darum welches System die Completion verwendet.
Denn die zsh kann nicht nur einfache Kompletion, sondern auch Sachen
wie Rechtschreibprüfung. Für einfache Completion gibt es 'complete'.

<command> ist der Name des Kommandos (oder anderen Kontexts) für
das die Completion gilt.

<argument> ist in einfachen Completions leer; in komplexeren
Setups kann man hiermit spezielle Option/Argument-Paare konfigurieren.

<tag> beschreibt, um welche Form der Completion es sich handelt. Hiermit
kann man unterscheiden wenn es an einer Stelle in der Commandline
mehrere verschiedene Arten von Argumenten geben kann.

So, mit diesem Wissen sieht man das es sich bei den beiden Beispielen
um sehr einfache Beispiele handelt.

Wie der Name des Konfigurationskommandos (zstyle) zeigt, wird die
Completion der Z-Shell über sog. Styles konfiguriert.
Die Syntax von zstyle lautet:

zstyle <context> <style> <value...>
<context> habe ich oben schon beschrieben.

<style> ist ein vordefinierter (oder selbstdefinierter) Style (zb. file-patterns).

<value...> ist eine Argumentliste für den jeweiligen Style.

Das System ist so einfach wie mächtig. In zshcompsys(1) ist es recht
genau beschrieben (mit allen Standard Completern, Styles etc.).
Das obere Beispiel ist _sehr_ einfach und stellt auf keinen Fall
irgendeine Grenze für das System der zsh dar.
Für's Probieren gibt es noch einen hilfreichen Shortcut:
Wenn ich wissen will in welchen <context> ich mich an einer bestimmten Stelle
der Commandline befinde, drücke ich 'Control-x h'.

% man <Control-x h>

...und ich bekomme:
tags in context :completion::complete:man::
manuals (_man)

Again, _easy_.

Nun gibt es von der interaktiven Seite noch einige nützliche Erweiterungen
zur Completion, die das Arbeiten mit ihr noch etwas verbessern.

Zum Beispiel kann man sich die Completions in einer menuartigen Weise
anzeigen lassen, und darin sogar mit den Pfeiltasten navigieren:

% zstyle ':completion:*' menu yes select
Nun kann man die Ausgabe von ls(1) mittels $LS_COLORS einfärben.
Es wäre doch toll, wenn das auch mit der Liste der Completions
ginge. Und was soll ich sagen: Klar, geht das!

% zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
...you are ready to go...

Nun kann man nicht nur Dateinamen färben, nein, man kann so ziemlich _alles_
in einer Completion auch mit einer Farbe versehen.

Beispiele:

1. Hostnamen

% zstyle ':completion:*:*:*:*:hosts' list-colors '=*=47;30'
2. Usernamen, ja dieses Beispiel ist nach dem ersten leicht zu erraten :)

% zstyle ':completion:*:*:*:*:users' list-colors '=*=34;47'
3. Die Liste der pids für kill(1) einfärben, aber nur die pids

% zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'
So, wenn man nun mit der Completion rumprobiert dann sollte man sich nicht
auf Dateinamen beschränken. Versucht es mit allem möglichen: PIDs,
--optionen, Dateien, Paketnamen oder Host/Usernamen. Vieles funktioniert schon,
an fehlendem wird ständig gebastelt (und man kann auch selbst basteln).
Also: Wenn man was tippt, was zu lang ist, einfach mal <TAB> drücken,
und schauen ob's komplettiert wird, falls nicht kann man immer noch
zu Ende tippen...

Man könnte noch viel ausgiebiger (wie immer) über dieses Thema schreiben,
aber schliesslich soll das ganze ein knapper Einstieg in die Welt der
zsh sein. Auch an dieser Stelle sei abermals auf die sehr gute
Dokumentation der Z-Shell verwiesen, in diesem Fall die zshcompsys(1)
Manpage. Hilfreich sind auch Beispiele die unter anderem auch in der
zsh-lovers manpage stehen.

So, genug geschrieben für heute. Vielleicht gibt's ja wen der das hier liest
und dem's was bringt. Inhaltliche bzw. formale Unzulänglichkeiten oder
Verbesserungen kann man bitte für sich behalten ;-)

Wenn's echt schlimme Fehler sind und es gar nicht anders geht,
Meldung per jabber an mich: efftee@jabber.ccc.de

Powered by zblog
valid css | valid xhtml | utf-8 encoded | best viewed with anybrowser