Eine der wirklich starken Funktionen der tcsh ist die Vervollständigung. Standardmässig werden unter FreeBSD nur Verzeichnisse und Dateien vervollständigt. Gibt man ein Kommando, zum Beispiel ls, in die Shell ein, und drückt danach Ctrl + d, werden einem die verfügbaren Dateien und Verzeichnisse angezeigt. Nun kann man den Anfang eines Dateinamens eingeben und versuchen mit der Tabulatortaste den Dateinamen zu vervollständigen. Dies klappt nur, wenn nur noch ein Dateiname zu der Eingabe passt, treffen mehrere zu, so passiert nichts und man muss noch einen weiteren Teil des Namens eingeben. Man kann jederzeit mit Ctrl + d die Dateinamen anzeigen lassen, mit der die eingegebenen Zeichen vervollständigt werden können.
Mit der tcsh kann jedoch noch viel mehr vervollständigt werden. Folgende Zeilen können in der ~/.cshrc oder in der /etc/csh.cshrc eingefügt werden. Die folgenden Beispiele basieren auf der .tcshrc von Justin Randall. Die Zeilen für die Vervollständigungen in der cshrc müssen zwischen folgenden Zeilen stehen, damit Wildcards nicht interpretiert werden:
set noglob
<... Regeln für die Vervollständigungen ...>
unset noglob
Möchte man zum Beispiel, bei ssh <Host> den Host vervollständigen, so fügt man folgende Regel, die die /etc/hosts und ~/.ssh/known_hosts ausliest und damit den Host vervollständigt, in die cshrc hinzu. Auch werden mirror.switch.ch und ftp.freebsd.ch manuell zur Host-Liste hinzugefügt:
if ( -r /etc/hosts ) then
set hosts=(`awk '/^[1-9].*/ {print $2'} /etc/hosts`)
endif
if ( -r $HOME/.ssh/known_hosts ) then
set f=`cat $HOME/.ssh/known_hosts | cut -f 1 -d \ ` >& /dev/null
set hosts=($hosts $f)
unset f
endif
set hosts=($hosts mirror.switch.ch ftp.freebsd.ch)
complete ssh 'n/-l/u/' 'n/*/$hosts/'
Verwendet man mit dieser Regel die -l Option von ssh, um einen Benutzer anzugeben, so werden die Benutzer aus /etc/passwd zur Vervollständigung angeboten.
Ist die Variable $host gesetzt, so wie es in der obigen Regel gemacht wurde, so kann folgende Regel verwendet werden, um bei ping und traceroute den host zu vervollständigen:
complete {ping,traceroute} p/1/\$hosts/
Zur Vervollständigung von kill verwendet man folgende Regel:
complete kill 'c/-/S/' 'p/1/(-)//' 'c/%/j/' \
'n/*/`ps -U $LOGNAME | awk '"'"'{print $1}'"'"'`/'
Damit werden bei einem kill -<Signal> <PID> das Signal durch alle verfügbaren Signale und die PID durch alle PID's von Prozessen des aktuellen Benutzers vervollständigt.
Mit folgender Regel wird bei einem ifconfig die Schnittstelle durch alle verfügbaren Schnittstellen vervollständigt und auch ein paar öfters gebrauchte Optionen wie up, down und noch ein paar andere vervollständigt:
complete ifconfig 'p@1@`ifconfig -l`@' 'n/*/(range phase link netmask \
mtu up metric mediaopt down delete \
broadcast arp debug)/'
Sollen bei einem bunzip2 nur noch Dateien mit der Endung bz2 vervollständigt werden, benutzt man diese Regel:
complete bunzip2 'p/*/f:*.bz2/'
Sollen bei einem umount nur die gemounteten Partitionen zur Vervollständigung angeboten werden, so kann man folgende Regel verwenden:
complete umount c/-/"(a A f c)"/ \
n/*/'`mount | cut -d " " -f 3`'/
Möchte man selber Vervollständigungen erstellen, so findet man in der tcsh(1) eine detaillierte Anleitung.