From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 27476 invoked from network); 18 May 2023 20:45:38 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 18 May 2023 20:45:38 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1684442738; b=cMMagd8NPi9dLMcie8qWPRlLIb1Pyz64v2Vi9xRzPtyipV4UgRtv2NaU0YfPEb/zroqLtoJHCl Ce2LBgb8NGWxxVs0sTDwolLPi26shpswypM20Qan30QvCLbGmoJN5em8Yi4un6bh/TktZAz8gX pWozXTipQPlim4Jzqk72VB3pWiljegxngVmaGLk+CV+lrYubEdSTi2DMLdw7GOH7D2BXnrKuCW r84T56CS84Al45NcXKNYI+lfACwdCfahyeXe+S18QiftUuVfBip4UQKXJvR19AcraRDZ+13WQ+ yqZvZiRh4wTIbsZysxXmJSGhkfNN5EPG+hC12B+SRKqqHA==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-lj1-f176.google.com) smtp.remote-ip=209.85.208.176; dkim=pass header.d=gmail.com header.s=20221208 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20210803; t=1684442738; bh=2qxXrWvZM+Obu16QzkHDjNsaJAkG54Gs1DY2Y+BHBu4=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Content-Transfer-Encoding:MIME-Version:Message-ID:Date: Subject:Cc:To:From:DKIM-Signature:DKIM-Signature; b=BKqtvVqZHUAZBXEZldO9XGf6ij9rW00XqQzGH+rJl8z0A3wRM9xGoPsSYlbYxGSaVIbtNK1xCN B/IPSJZhwM1EAcL1PjuzYQ9mhWMjn48pRfzWl5XqObsD7IHN95TEyti2TF21OShBIgNpeNH3Uk yzoRMDeE9tUWAFAicwO6qCuRcC5AHVG3Ofzf8+6cSuJWHzRWgg/SOGj6Az45t4X3GjDx+eLsIq ykH5In0QZthUP0a4ZfPtsiDRq42/sKb8jl4RUccfmTmY/FI87+JbvpLptG35oGZ2IQH7K6VFvX 3hkPuOLiKpspnrVu+fq0VZEm+u8+vqw/vzIUKiuB09iIkA==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20210803; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Content-Transfer-Encoding: MIME-Version:Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References; bh=szrJCyyvehsk6eknGBIrEk9R8CtjhFfziureaXCRYkY=; b=SA5DJrfP/m83UsoGHS1sIZAZNO tGb0oJckDNVpyz3CxIYBHu8qYRGNuOgsZbqYiNTdU/UOV9AVONm0fRvBVpnEEkmtmkHRICzDmjZEa tmhCPkhmfgHaQ7cRyo+be5bTAFM/DIKlqacUAk4mTJ42WMXW/2hXhXjcje7j3LGk7YrzRwQkmfNgW /NJ7JtkdzHzM1OCwkSAWX0STzT/eX7xMPA1fMHb5XZMQnXsOTn+98HA8Wszn/a9glzYigSZNj1RPh FrtlioitYPMKyuyrfgblHYdnP0AldMiOeB58hXReeJnkMWLqR/7OSRB7JNREFnP2EBCW2C2OP1Siz 8fA+3kCg==; Received: by zero.zsh.org with local id 1pzkVF-000NIP-GY; Thu, 18 May 2023 20:45:37 +0000 Authentication-Results: zsh.org; iprev=pass (mail-lj1-f176.google.com) smtp.remote-ip=209.85.208.176; dkim=pass header.d=gmail.com header.s=20221208 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none Received: from mail-lj1-f176.google.com ([209.85.208.176]:40195) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1pzkUc-000N0n-3q; Thu, 18 May 2023 20:45:05 +0000 Received: by mail-lj1-f176.google.com with SMTP id 38308e7fff4ca-2aed75dbdddso3642231fa.1; Thu, 18 May 2023 13:44:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684442697; x=1687034697; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=szrJCyyvehsk6eknGBIrEk9R8CtjhFfziureaXCRYkY=; b=ruRQ5cHPF1Winiss5h6VOoIGa2+L8rjp4MYJ9KEhlx4hXBEYbyUT4t92cj0Px/t98b e2UpAbbN3xOPdewOOrtTAb8YoImmb2tAuzw62HsjpX23V0A9F60RfyNMMenPEGD2GWp6 vw9c6NOGJhQJrYJOXL6hN4w01j62nKmDNJqg17IhoOeJsZoz0Izl5ejhaBJjfVKSsy5k cnU3pLtpq4DV1vrPlhwSlqIfTAEzH6OXxT++0QGWJ8QCNcg6LM7RChNFGxpDFc2HbvbG IruHILsjJmmkgEKCDj/LsDnGlFgdF3ndurcA/XtluxnQMB6lZ7eqToatGrngF8qSXJih lIMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684442697; x=1687034697; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=szrJCyyvehsk6eknGBIrEk9R8CtjhFfziureaXCRYkY=; b=IU3ld0skV1Tc8jogr2qZcOkl9sKvsm90XSwWdVBgSODGpaoulzF2eLcaEHZr2OS4D/ UEudqKIbENpEbjAwgAJEh+iNH4B/bxwgKlQRLYTnngs4mDNK6mRxTHFcvsgG6e62hpSB y9QiWsZ+jkjjOvVp2XkAZH3/eIUP0OSbV+bkX2ddfBhdwLPD7gDhL7Xjz9OUWuFrrddw 7Un5IMIUW4NIe290nVHc5Qz7h7qlDcNvzpmjwFKwnFn90YdstwC3ObuaxvMOEa/SU+T1 UNujx1cGFaj3WcbUt3ZbM7CFL/+laNE50np9hwzAs2rLaI3Ky3bEsS7LNRifTrG12uip L/kA== X-Gm-Message-State: AC+VfDzFZKKhqotpVmX3FX8RUAT014HtWTw+lbHimy1bQ5dsc/BzHn9j 6kWbcuVvzH4fyf6enDNjb/frJpb1ilA= X-Google-Smtp-Source: ACHHUZ7AWym051jhD5UOfE9TD7Tm4s41pVi+JCTGGN/mecB5Uoa4FIEtGXMo8W1xUM47RibCdNXjvg== X-Received: by 2002:a05:651c:1315:b0:2af:1ac5:f714 with SMTP id u21-20020a05651c131500b002af1ac5f714mr1137520lja.3.1684442696310; Thu, 18 May 2023 13:44:56 -0700 (PDT) Received: from localhost.localdomain (176-93-107-108.bb.dnainternet.fi. [176.93.107.108]) by smtp.gmail.com with ESMTPSA id q27-20020ac246fb000000b004f1400630d3sm361197lfo.35.2023.05.18.13.44.55 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 18 May 2023 13:44:55 -0700 (PDT) From: Marlon Richert To: Oliver Kiddle Cc: zsh-workers@zsh.org Subject: Re: [PATCH 2/3] Make dynamic dir completion easier to implement Date: Thu, 18 May 2023 23:44:54 +0300 Message-Id: <20230518204454.35494-1-marlon.richert@gmail.com> X-Mailer: git-send-email 2.39.2 (Apple Git-143) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Seq: 51758 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Thanks for the feedback! Below is a new patch. --- This patch implements most of the logic needed to write a custom completion function for dynamic directory names into _dynamic_directory_name. This includes: - Default tag and group names - Correct logic for inserting `]` as a suffix - A completion tag loop This way, these don't need to be implemented and maintained for each such function individually. --- .../Zsh/Context/_dynamic_directory_name | 30 +++++++++---- Doc/Zsh/expn.yo | 44 +++++++------------ Test/Y01completion.ztst | 11 +++++ 3 files changed, 50 insertions(+), 35 deletions(-) diff --git a/Completion/Zsh/Context/_dynamic_directory_name b/Completion/Zsh/Context/_dynamic_directory_name index f449c3b12..5e0d73a8d 100644 --- a/Completion/Zsh/Context/_dynamic_directory_name +++ b/Completion/Zsh/Context/_dynamic_directory_name @@ -1,15 +1,29 @@ #autoload +local -a dirfuncs=( + ${(k)functions[zsh_directory_name]} + $zsh_directory_name_functions +) +local descr='dynamically named directory' -local func -integer ret=1 +if (( $#dirfuncs )); then + local -a expl + local -i ret + local func suf tag=dynamically-named-directories -if [[ -n $functions[zsh_directory_name] || \ - ${+zsh_directory_name_functions} -ne 0 ]] ; then - [[ -n $functions[zsh_directory_name] ]] && zsh_directory_name c && ret=0 - for func in $zsh_directory_name_functions; do - $func c && ret=0 + [[ $ISUFFIX != \]* ]] && + suf=-S] + + _tags "$tag" + while _tags; do + while _next_label "$tag" expl "$descr" $suf; do + for func in $dirfuncs; do + $func c && ret=0 + done + done + (( ret )) || break done return ret + else - _message 'dynamic directory name: implemented as zsh_directory_name c' + _message "${descr}: implement as zsh_directory_name c" fi diff --git a/Doc/Zsh/expn.yo b/Doc/Zsh/expn.yo index 19f5909ea..6f86d0c54 100644 --- a/Doc/Zsh/expn.yo +++ b/Doc/Zsh/expn.yo @@ -2066,34 +2066,24 @@ tt(/home/pws/perforce). In this simple case a static name for the directory would be just as effective. example(zsh_directory_name+LPAR()RPAR() { - emulate -L zsh - setopt extendedglob + emulate -L zsh -o extendedglob local -a match mbegin mend - if [[ $1 = d ]]; then - # turn the directory into a name - if [[ $2 = (#b)(/home/pws/perforce/)([^/]##)* ]]; then - typeset -ga reply - reply=(p:$match[2] $(( ${#match[1]} + ${#match[2]} )) ) - else - return 1 - fi - elif [[ $1 = n ]]; then - # turn the name into a directory - [[ $2 != (#b)p:(?*) ]] && return 1 - typeset -ga reply - reply=(/home/pws/perforce/$match[1]) - elif [[ $1 = c ]]; then - # complete names - local expl - local -a dirs - dirs=(/home/pws/perforce/*(/:t)) - dirs=(p:${^dirs}) - _wanted dynamic-dirs expl 'dynamic directory' compadd -S\] -a dirs - return - else - return 1 - fi - return 0 + local base=/home/pws/perforce + case $1 in + ( d ) # Turn the directory into a name. + [[ $2 == (#b)($base/)([^/]##)* ]] && + reply=( p:$match[2] $(( $#match[1] + $#match[2] )) ) + ;; + ( n ) # Turn the name into a directory. + [[ $2 == (#b)p:(?*) ]] && + reply=( $base/$match[1] ) + ;; + ( c ) # Complete names. + local -a dirs=( $base/*(/:t) ) + # Completion system populates $expl with flags for compadd. + compadd "$expl[@]" p:$^dirs + ;; + esac }) texinode(Static named directories)(`=' expansion)(Dynamic named directories)(Filename Expansion) diff --git a/Test/Y01completion.ztst b/Test/Y01completion.ztst index 51e246307..2524c43bd 100644 --- a/Test/Y01completion.ztst +++ b/Test/Y01completion.ztst @@ -93,6 +93,17 @@ >line: {: ~user2}{} >line: {: ~user1}{} + comptesteval 'zsh_directory_name() { compadd "$expl[@]" -- name1 name2 }' + comptest $': ~[\t\t\t\t' +0:dynamic directory names after ~[ +>line: {: ~[name}{} +>line: {: ~[name}{} +>DESCRIPTION:{dynamically named directory} +>NO:{name1} +>NO:{name2} +>line: {: ~[name1]}{} +>line: {: ~[name2]}{} + comptest $'echo ;:\C-b\C-b\t' 0:directories and files before separator >line: {echo }{;:} -- 2.39.2 (Apple Git-143)