From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29114 invoked from network); 27 Jul 2001 13:43:28 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 27 Jul 2001 13:43:28 -0000 Received: (qmail 9517 invoked by alias); 27 Jul 2001 13:43:16 -0000 Mailing-List: contact zsh-users-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 4058 Received: (qmail 9506 invoked from network); 27 Jul 2001 13:43:16 -0000 From: Sven Wischnowsky Date: Fri, 27 Jul 2001 15:42:22 +0200 (MET DST) Message-Id: <200107271342.PAA24170@beta.informatik.hu-berlin.de> To: zsh-users@sunsite.dk CC: Will Yardley Subject: Re: comptctl help In-Reply-To: <20010726165246.D5669@hq.newdream.net> Will Yardley wrote: > i was wondering if someone could give me a little help with a couple of my > compctls. i'd prefer not to use the menu configuration for these - i like > having it in a file, and i don't have a recent version of zsh on all of the > machines i use. Hm. > this works great for me, but if i try to cd into a hidden directory (say > .ssh / .netscape whatever) it won't autocomplete. presumably i need to add > .??*(-/) somehow but i haven't been able to figure out how to do 'or' for > this particular expression. i tried adding both separately with -g for each, > and i tried putting them between parenthesis with a pipe in between. sorry > for the dumb question. > > here's what i currently have. > > # cd, rmdir etc. only accept dirs as arguments > compctl -g '*(-/)' cd chdir dirs pushd rmdir Depending on your preference, use either: compctl -g '*(D-/)' cd ... or compctl -g '*(-/)' + -g '.*(-/)' cd ... > also, i have this for scp: > > # for scp or rcp we look for filenames or hostnames > > filehosts() { > local argc argv pref filenames hostnames > read -nc argc > read -Ac argv > > pref=$argv[$argc] > setopt nullglob If you set an option in a function, you'll also setopt localoptions on zsh version that support it. But in this case you could just use the glob qualifier `(N)', so... > filenames=( ${pref}* ) you could use (and this should also solve the other problem you have with this function): filenames=( ${pref}*(N-^/) ${pref}*/ ) > hostnames=( ${(M@)hosts:#${pref}*} ) > if [[ ${#filenames} -eq 0 && ${#hostnames} -eq 1 ]]; then > reply= reply=() would be nicer > else > reply=( $filenames $hostnames ) > fi > return > } > > compctl -K filehosts + -k hosts -S ':' + -u -S '@' \ > -x 'n[1,@]' -k hosts -S ':' - 'W[1,*:*]' -f -- rcp scp scp2 > > this works, but if i'm trying to copy a file that is in a different > directory, it completes the directory as if it's a file; ie if i'm trying to > copy: > junk/rfc2317.txt > and i type scp ju > it will complete to scp junk[space] > instead of junk/ > so that i can then tab complete the filename. > > it also doesn't work so well on older versions of zsh - sometimes it will > complete the username wrong or only give me some of the usernames as options. This isn't enough information to enable to help you. No way to get newer versions running there? Bye Sven -- Sven Wischnowsky wischnow@informatik.hu-berlin.de