From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17267 invoked from network); 6 Mar 2006 13:10:25 -0000 X-Spam-Checker-Version: SpamAssassin 3.1.0 (2005-09-13) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00, FORGED_RCVD_HELO autolearn=ham version=3.1.0 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 6 Mar 2006 13:10:25 -0000 Received: (qmail 56264 invoked from network); 6 Mar 2006 13:10:19 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 6 Mar 2006 13:10:19 -0000 Received: (qmail 21444 invoked by alias); 6 Mar 2006 13:10:17 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 22328 Received: (qmail 21435 invoked from network); 6 Mar 2006 13:10:16 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 6 Mar 2006 13:10:16 -0000 Received: (qmail 55934 invoked from network); 6 Mar 2006 13:10:16 -0000 Received: from cluster-c.mailcontrol.com (168.143.177.190) by a.mx.sunsite.dk with SMTP; 6 Mar 2006 13:10:14 -0000 Received: from exchange03.csr.com (uuk202166.uk.customer.alter.net [62.189.241.194] (may be forged)) by rly19c.srv.mailcontrol.com (MailControl) with ESMTP id k26DA3tV018441 for ; Mon, 6 Mar 2006 13:10:04 GMT Received: from csr.com ([10.103.143.38]) by exchange03.csr.com with Microsoft SMTPSVC(5.0.2195.6713); Mon, 6 Mar 2006 13:10:03 +0000 To: zsh-workers@sunsite.dk (Zsh hackers list) Subject: PATCH: list-files style for "ls -l" completion listings Date: Mon, 06 Mar 2006 13:09:46 +0000 From: Peter Stephenson Message-ID: X-OriginalArrivalTime: 06 Mar 2006 13:10:03.0151 (UTC) FILETIME=[47D411F0:01C6411F] Content-Type: text/plain MIME-Version: 1.0 X-Scanned-By: MailControl A-06-00-04 (www.mailcontrol.com) on 10.67.0.129 Here are the bare bones of a way of getting more information about file listings. Setting the list-files style allows you to have files listed as for "ls -L" instead of "ls" or "ls -F". The style can take a number so list=10 means show in long format only if listing but not inserting and only if there are no more than 10 matches. Note I had to add an option -o to compadd: the problem was that if you gave a display string it was always used for sorting the matches to be displayed, and the result wasn't sensible in ls -l format with the file name at the end. (If there's a better letter than -o tell me.) (The result still seems to respect the file-sort style, which amazes me a bit.) This is still very basic: - I have chickened out of adding the framework to _path_files in all but the simplest cases where the files are add as a simple array. If anyone thought they understodd _path_files they could do better. This definitely needs fixing (any occurrence of "compadd -Qf" should handle file-list in the same way). - The determination of "insert" or "list" context is very basic and there's probably useful information somewhere in $compstate, if I knew what. More generally, the value of file-list could possibly be more configurable. - Customization of the ls -l output format wouldn't be too hard. Actually, as always, I'm hoping someone else is going to improve it for me, but I don't suppose they are. Index: Completion/Unix/Type/_list_files =================================================================== RCS file: Completion/Unix/Type/_list_files diff -N Completion/Unix/Type/_list_files --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ Completion/Unix/Type/_list_files 6 Mar 2006 12:59:49 -0000 @@ -0,0 +1,60 @@ +#autoload + +# arguments: +# name of parameter containing file matches +# directory prefix +# Sets array reply to result for caller. + +local stat f elt what +local -a stylevals +integer ok + +reply=() + +zmodload -i zsh/stat 2>/dev/null || return 1 + +zstyle -a ":completion:${curcontext}:" file-list stylevals || return 1 + +# TODO: more flexible way of handling the following? e.g. use $compstate? +case $WIDGETSTYLE in + (*complete*) + what=insert + ;; + + (*) + what=list + ;; +esac + +for elt in $stylevals; do + case $elt in + (($what|all|true|1|yes)=<->) + # use long format if no more than the given number of matches + (( ${(P)#1} <= ${elt##*=} )) && (( ok = 1 )) + break + ;; + + ($what|all|true|1|yes) + # always use long format + (( ok = 1 )) + break + ;; + esac +done + +(( ok )) || return 1 + +for f in ${(P)1}; do + if [[ ! -e "${2:+$2/}$f" ]]; then + reply+=("${2:+$2/}$f") + continue + fi + + # Borrowed from Functions/Example/zls + stat -s -H stat -F "%b %e %H:%M" - "${2:+$2/}$f" >/dev/null 2>&1 + + reply+=("$stat[mode] ${(l:3:)stat[nlink]} ${(r:8:)stat[uid]} \ + ${(r:8:)stat[gid]} ${(l:8:)stat[size]} $stat[mtime] $f") +done + +return 0 Index: Completion/Unix/Type/_path_files =================================================================== RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_path_files,v retrieving revision 1.24 diff -u -r1.24 _path_files --- Completion/Unix/Type/_path_files 27 Apr 2004 17:00:23 -0000 1.24 +++ Completion/Unix/Type/_path_files 6 Mar 2006 12:59:50 -0000 @@ -7,6 +7,7 @@ local tmp1 tmp2 tmp3 tmp4 i orig eorig pre suf tpre tsuf opre osuf cpre local pats haspats ignore pfx pfxsfx sopt gopt opt sdirs ignpar cfopt listsfx local nm=$compstate[nmatches] menu matcher mopts sort match mid accex fake +local reply listopts typeset -U prepaths exppaths @@ -539,6 +540,8 @@ ( -n "$_comp_correct" || -z "$compstate[pattern_match]" || "$SUFFIX" != */* || "${SUFFIX#*/}" = (|*[^\\])[][*?#~^\|\<\>]* ) ]] }; then + # We have not been told to insert the match, so we are + # listing, or something. (( tmp4 )) && zstyle -t ":completion:${curcontext}:paths" ambiguous && compstate[to_end]= if [[ "$tmp3" = */* ]]; then @@ -554,12 +557,16 @@ - "${(@)^tmp1%%/*}/${tmp3#*/}" fi else + _list_files tmp1 "$prepath$realpath$testpath" + (( ${#reply} )) && listopts=(-d reply -l -o) compadd -Qf "$mopts[@]" -p "$linepath$tmp2" \ -W "$prepath$realpath$testpath" \ "$pfxsfx[@]" -M "r:|/=* r:|=*" \ + $listopts \ -a tmp1 fi else + # We are inserting the match into the command line. if [[ "$tmp3" = */* ]]; then tmp4=( -Qf "$mopts[@]" -p "$linepath$tmp2" -W "$prepath$realpath$testpath" @@ -576,9 +583,12 @@ done fi else + _list_files tmp1 "$prepath$realpath$testpath" + (( ${#reply} )) && listopts=(-d reply -l -o) compadd -Qf "$mopts[@]" -p "$linepath$tmp2" \ -W "$prepath$realpath$testpath" \ "$pfxsfx[@]" -M "r:|/=* r:|=*" \ + $listopts \ -a tmp1 fi fi @@ -668,8 +678,11 @@ compadd -Qf -W "$prepath$realpath" "$pfxsfx[@]" "$mopts[@]" \ -M "r:|/=* r:|=*" - "$linepath$tmp4${(@)^tmp1}" else + # Not a pattern match + _list_files tmp1 "$prepath$realpath$testpath" + (( ${#reply} )) && listopts=(-d reply -l -o) compadd -Qf -p "$linepath$tmp4" -W "$prepath$realpath$testpath" \ - "$pfxsfx[@]" "$mopts[@]" -M "r:|/=* r:|=*" -a tmp1 + "$pfxsfx[@]" "$mopts[@]" -M "r:|/=* r:|=*" $listopts -a tmp1 fi fi fi Index: Doc/Zsh/compsys.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/compsys.yo,v retrieving revision 1.184 diff -u -r1.184 compsys.yo --- Doc/Zsh/compsys.yo 6 Mar 2006 11:36:03 -0000 1.184 +++ Doc/Zsh/compsys.yo 6 Mar 2006 12:59:54 -0000 @@ -1263,6 +1263,30 @@ required in the particular context. Names for which no type is specified will always be completed. ) +kindex(file-list, completion style) +item(tt(file-list))( +This style controls with files completed using the standard builtin +mechanism are to be listed with a long list similar to tt(ls -l) +(although note that this feature actually uses the shell module +tt(zsh/stat) for file information). + +The style may either be set to a true value (or `tt(all)'), or +one of the values tt(insert) or tt(list), indicating that files +are to be listed in long format in all circumstances, or when +attempting to insert a file name, or when listing file names +without attempting to insert one. + +More generally, the value may be an array of any of the above values, +optionally followed by tt(=)var(num). If var(num) is present it +gives the maximum number of matches for which long listing style +will be used. For example, + +example(zstyle ':completion:*' file-list list=20 insert=10) + +specifies that long format will be used when listing up to 20 files +or inserting a file with up to 10 matches, else short format will +be used. +) kindex(file-patterns, completion style) item(tt(file-patterns))( This is used by the standard function for completing filenames, Index: Doc/Zsh/compwid.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/compwid.yo,v retrieving revision 1.37 diff -u -r1.37 compwid.yo --- Doc/Zsh/compwid.yo 24 Apr 2005 18:38:04 -0000 1.37 +++ Doc/Zsh/compwid.yo 6 Mar 2006 12:59:55 -0000 @@ -436,7 +436,7 @@ startitem() findex(compadd) cindex(completion widgets, adding specified matches) -xitem(tt(compadd) [ tt(-akqQfenUl12C) ] [ tt(-F) var(array) ]) +xitem(tt(compadd) [ tt(-akqQfenUld12C) ] [ tt(-F) var(array) ]) xitem([ tt(-P) var(prefix) ] [ tt(-S) var(suffix) ]) xitem([ tt(-p) var(hidden-prefix) ] [ tt(-s) var(hidden-suffix) ]) xitem([ tt(-i) var(ignored-prefix) ] [ tt(-I) var(ignored-suffix) ]) @@ -530,6 +530,12 @@ option. If it is given, the display strings are listed one per line, not arrayed in columns. ) +item(tt(-o))( +This option only has an effect if used together with the tt(-d) +option. If it is given, the order of the output is determined by the +match strings; otherwise it is determined by the display strings +(i.e. the strings given by the tt(-d) option). +) item(tt(-J) var(name))( Gives the name of the group of matches the words should be stored in. ) Index: Src/Zle/comp.h =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Zle/comp.h,v retrieving revision 1.14 diff -u -r1.14 comp.h --- Src/Zle/comp.h 21 May 2002 08:07:51 -0000 1.14 +++ Src/Zle/comp.h 6 Mar 2006 12:59:55 -0000 @@ -131,6 +131,7 @@ #define CMF_FMULT (1<<12) /* first of multiple equal strings */ #define CMF_ALL (1<<13) /* a match representing all other matches */ #define CMF_DUMMY (1<<14) /* unselectable dummy match */ +#define CMF_MORDER (1<<15) /* order by matches, not display strings */ /* Stuff for completion matcher control. */ Index: Src/Zle/compcore.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Zle/compcore.c,v retrieving revision 1.82 diff -u -r1.82 compcore.c --- Src/Zle/compcore.c 20 Feb 2006 05:51:49 -0000 1.82 +++ Src/Zle/compcore.c 6 Mar 2006 12:59:56 -0000 @@ -2735,7 +2735,7 @@ static int matchcmp(Cmatch *a, Cmatch *b) { - if ((*a)->disp) { + if ((*a)->disp && !((*a)->flags & CMF_MORDER)) { if ((*b)->disp) { if ((*a)->flags & CMF_DISPLINE) { if ((*b)->flags & CMF_DISPLINE) @@ -2751,7 +2751,7 @@ } return -1; } - if ((*b)->disp) + if ((*b)->disp && !((*b)->flags & CMF_MORDER)) return 1; return strbpcmp(&((*a)->str), &((*b)->str)); Index: Src/Zle/complete.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Zle/complete.c,v retrieving revision 1.30 diff -u -r1.30 complete.c --- Src/Zle/complete.c 18 Aug 2005 18:15:45 -0000 1.30 +++ Src/Zle/complete.c 6 Mar 2006 12:59:57 -0000 @@ -569,6 +569,9 @@ case 'l': dat.flags |= CMF_DISPLINE; break; + case 'o': + dat.flags |= CMF_MORDER; + break; case 'E': if (p[1]) { dat.dummies = atoi(p + 1); -- Peter Stephenson Software Engineer CSR PLC, Churchill House, Cambridge Business Park, Cowley Road Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070 To access the latest news from CSR copy this link into a web browser: http://www.csr.com/email_sig.php