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 18922 invoked from network); 5 May 2023 11:46:46 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 5 May 2023 11:46:46 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1683287206; b=Lnh7n2eHwEaJaBFw6qfqZoDh4VFE/sKfH9/NMXPNnJy1rPNB2tLnafwaSYDh66bD3gQPYCoIq/ PhLx5CtMOlc8Cg4pzMt/aFhXTbjgsVTxvTzP3zCyEuT500GsmgG7QOT5yNYMsKo83CLQjNldmj iAOfqUYAlCH1XRGIbuPU2jDsAydVdfyyrg2FOzXDuqPD02ikpZMYFQpLHsaSbadAAjNDytTluj p5D6/K22oguF7LVnqGc1hpDaOn5WHL0R8RJxuq3DtcvBiyszCl1CvMn0OhMCFkvVl/Omde/Q90 gv4FfSJAJZ3yAu9wuVKHrLwm7lTo0ZvUfpZucNIH6pJiMQ==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-lf1-f52.google.com) smtp.remote-ip=209.85.167.52; 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=1683287206; bh=kA0nueGj8Y+7DY4w0ps3ZuLPFTHFXQ6WYU3xhF5NyWw=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:Cc:To:From:DKIM-Signature: DKIM-Signature; b=HjZO/UONlQkkulWX1VFKfTnppxZjKngox6angK/YID4L0jgvPMH3UJZRE+SZFKjGTmvUOgtI8T 6G0sWcW37ig1iCZL30Q0FsZ7ZItVk+x+V+P68chnS1Yl/vUHwsrYfRSpR4RehK39NwZNkdk+Dp rGYqaJBG6sei5UDprFYLbTPVQXN6PjVJx4q0zLaC51Z4mOZJfiFx6EClksiwsTur2AoMWkk++O VoNnEWtV+sjETchbPVC/s4x5Bsd/v5osjShO46qclEl5PW6f6Lwp2Tc58dz0ktq4StK9xxOxt/ +R21OiQ8MRhI22GdUPZJV6lfzWIREF6koFltSu9q+eWUWw==; 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:References:In-Reply-To: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; bh=zt/nF0+OZSSzLQ4919vuoxm0B93Xfs6bT2rYcturbLs=; b=MYo6nveWVZS41rJWwTIt7nEMiL EOFegZaQNnhVHz44T2kj4b4vw8Q/iycEvMl/Vshivy3868lRjISaPXC6JeyfZuL+CFMUgaiKJzUXE 6wyf8YSgZbZTgDl9s87JoixqianayISdW4ptmXnK2z86ZnmPhyG1DYOC2Ccv2kXLkZkI9jOGlsJBL hRlT3NWV5XNrCrDqbrfw2zfuiUfBxkq11HI4T9eKNo6CWQuL+94TacIs3mfoEiQUMc94x7iPmkVS1 b5wVFu2Kj9O3HwolHsofz0ogZZch1Q/OKpZEMgzcEKAge5XhJmeZn3ArGGysl9tpjBRelXTUWNknT 2/snO5Lg==; Received: by zero.zsh.org with local id 1puttd-000N7J-VZ; Fri, 05 May 2023 11:46:46 +0000 Authentication-Results: zsh.org; iprev=pass (mail-lf1-f52.google.com) smtp.remote-ip=209.85.167.52; dkim=pass header.d=gmail.com header.s=20221208 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none Received: from mail-lf1-f52.google.com ([209.85.167.52]:40124) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1putsK-000MT9-1T; Fri, 05 May 2023 11:45:25 +0000 Received: by mail-lf1-f52.google.com with SMTP id 2adb3069b0e04-4f13cd0c4b3so294537e87.0 for ; Fri, 05 May 2023 04:45:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1683287123; x=1685879123; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zt/nF0+OZSSzLQ4919vuoxm0B93Xfs6bT2rYcturbLs=; b=o674J9+OHFDpQ1Ob1+HW8pXQzVhgQNww/mY7VFgCufPkedVZCxUSQXTRWPZDXCQI4W pBQT3qXo11Wo/zeBQ9A1NKPYm+X1K+Pkdco81F2cEj8tCFohzyLbrh4hUY61LNPWy3fU YTorlLsB1mQPxUvRbovJCPLiEe1nV0x1ua2YZ8Y4xnj7h8S8ixM3kzBr2+a3YRqLKsZY m6GwsI147n+SvltkydTXeRaZSLUmnzj/lztl8mz4JOT6hXEsbgzxc5jTKioumyoT0Gpk R9+Pasb/PVz96OIEWyrUzjgfTRwju+dRj2Dc0zuCyfi62cZlYmH6roblPDhm+JHA6JtZ uhjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683287123; x=1685879123; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zt/nF0+OZSSzLQ4919vuoxm0B93Xfs6bT2rYcturbLs=; b=EW+PGB9WEkQspVDIk2CUEuG3xX8OEEtybbPQDoOenD7RSYZjQAj5VikdH+sqRNGb7s iqxFllSZgJmB9GR7e+1Mf0D/8A1FFM0q7U9zP9PPqK3B20UXjgd7OSOjY9op7gPT+9SW L/Ox5plJdzjPBrQ/1xob/ExabZ3MDBKFvABgHniuhaotrC/GkCtOb+GzDXLVDDSQoAkm 6cK+ehHGJv78Dci+rR8MqovkH1pw8nUEAEULPDbHhm3V4kvBGGB+z35yU8arXQEHT9xH RnTFrteSN2wksUxPx/pNBXziG8dJ4zm6wHkfiqXDNJgPD7OZfYTdPRPjnikM79RyVPIL 2/vA== X-Gm-Message-State: AC+VfDyewZlTcTughAJ2e1pw4e8q6r0r3mptVgBytXlys+dGKB/IXV2S UbXFrEjzMgrgpPuorF9XxQIyc6JX5T20uA== X-Google-Smtp-Source: ACHHUZ6bd5ygBzhlX21/Zi55p43mOwpSsQ4RhJ6VoNMFN8dIK15LVRJwctG5yxwTaniW/6sR57O2fA== X-Received: by 2002:a2e:1f02:0:b0:2a6:142e:ee70 with SMTP id f2-20020a2e1f02000000b002a6142eee70mr350310ljf.4.1683287122814; Fri, 05 May 2023 04:45:22 -0700 (PDT) Received: from localhost.localdomain (178-55-136-176.bb.dnainternet.fi. [178.55.136.176]) by smtp.gmail.com with ESMTPSA id a16-20020a2e88d0000000b002a8b08882dbsm291085ljk.55.2023.05.05.04.45.22 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 05 May 2023 04:45:22 -0700 (PDT) From: Marlon Richert X-Google-Original-From: Marlon Richert To: zsh-workers@zsh.org Cc: Marlon Richert Subject: [PATCH 2/3] Make dynamic dir completion easier to implement Date: Fri, 5 May 2023 14:41:57 +0300 Message-Id: <20230505114154.76547-2-marlonrichert@users.noreply.github.com> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Seq: 51717 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: From: Marlon Richert In the pre-patch example, the recommended way of implementing this was as follows: _wanted dynamic-dirs expl 'dynamic directory' compadd -S\] ... However, this is problematic for the following reasons: - The proper place for handling _wanted or other tag logic is in the completion function _dynamic_directory_name, not in each dynamic dir name function separately. - The naming styles of the tag and group are not consistent with those used for non-dynamic named directories, namely 'named-directories' and 'named directory', respectively. - The example always inserted a `]` suffix, even if the suffix was already present on the command line, leading to a double `]]` on the command line. - Code addressing the points the above needed to be duplicated in each dynamic dir name function. This patch fixes these problems by - moving the completion logic from the example into _dynamic_directory_name, so that users don't have to duplicated this scaffolding for each dynamic dir name function, and - adds logic to _dynamic_directory_name for inserting the `]` suffix only when needed. --- .../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..e173dcb7f 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=1 + local func= + local tag=dynamically-named-directories + [[ -z $ISUFFIX ]] && + local suf=-S] -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 + _tags "$tag" + while _tags; do + while _next_label "$tag" expl "$descr"; do + expl+=( $suf ) + 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)