Re: zsh: expansion bei scp

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Wed, 26 Sep 2007 15:46:11 +0200 (CEST)

Hendrik Bunke wrote:
> kleine Frage am Rande. Auf Arbeit sitze ich an einem
> Ubuntu-Rechner und stelle zu meiner Überraschung fest, dass die
> zsh hier die filename-expansion auch bei scp-Kommandos
> beherrscht.

Du meinst, die remote-Namen werden komplettiert (Expansion
ist etwas anderes als Completion)? Das kann man einrich-
ten, wenn man will. Funktionieren kann das natürlich nur,
wenn Du z.B. per ssh-agent auf den Remote-host kommst, da
Du sicherlich nicht bei jedem Drücken der Tab-Taste ein
Passwort oder eine Passphrase eingeben möchtest.

> Das ist natürlich überaus praktisch. Nur leider
> funktioniert das bei meinen FreeBSD-Rechnern nicht.

Dann hast Du's auf dem freeBSD-Rechner nicht konfiguriert.
Von allein tut das die zsh ja nicht; das hat nichts mit
dem Betriebssystem zu tun.

Wenn Du alle Standard-Completions haben willst, die die
zsh so mitbringt (dazu gehört auch ssh und scp), gib die
folgenden beiden Zeilen ein:

    autoload compinit
    compinit

bzw. schreib diese Zeilen in Deine ~/.zshrc, damit es
automatisch für jede interaktive Shell ausgeführt wird.

Einige dieser Completions sind allerdings nicht besonders
portabel programmiert. Zum Beispiel funktioniert die für
man(1) bei mir nicht. Ich habe stattdessen folgendes in
meiner ~/.zshrc, um Manpages zu komplettieren:

    _WHATISFILES=$(
        for i in ${=$(manpath 2>/dev/null):gs/:/ /}; do
            if [[ -f $i/whatis ]]; then
                echo "$i/whatis"
            fi
        done
    )
    _list_mans() {
        set -A reply $(
            awk '{
                for (i = 1; i <= NF; i++)
                    if ($i ~ "^'"$1"'.*\\(") {
                        word = $i
                        sub(/\(.*/, "", word)
                        print word
                    }
            }' $_WHATISFILES </dev/null
        )
    }
    if [[ -n "$_WHATISFILES" ]]; then
        compctl -K _list_mans man _man_wrap
    fi

Und folgender Trick ermöglicht es, dass man die übliche
Syntax für Sections verwenden kann, d.h. man kann
»man exit(3)« eingeben (stat »man 3 exit«).

    _man_wrap()
    {
        setopt localoptions
        unsetopt ksharrays
        local i=1
        while [[ $i -le $# ]]; do
            if [[ "${argv[$i]}" == *"("[0-9nl]*")" ]]; then
                argv[$i]=("${${1##*\(}%\)}" "${1%%\(*}")
            fi
            i=$(( $i + 1 ))
        done
        command man "$@"
    }
    alias man='noglob _man_wrap'

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M.
Handelsregister: Registergericht Muenchen, HRA 74606,  Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün-
chen, HRB 125758,  Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart
FreeBSD-Dienstleistungen, -Produkte und mehr:  http://www.secnetix.de/bsd
"I have stopped reading Stephen King novels.
Now I just read C code instead."
        -- Richard A. O'Keefe
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Wed 26 Sep 2007 - 15:47:32 CEST

search this site