Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] Fix WATCH/watch tying
- X-seq: zsh-workers 54377
- From: Philippe Altherr <philippe.altherr@xxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: [PATCH] Fix WATCH/watch tying
- Date: Mon, 20 Apr 2026 23:29:54 +0200
- Arc-authentication-results: i=1; mx.google.com; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=MGDHm+nYAMNhCwT/hwD0GQwoOpGpsm0Z3d566PNY5Hk=; fh=BgAYDYpL6Ne/A5nWEMVJiHiBtrz8Imz3uf26RDwgQX4=; b=fdZcRqRVh7j30QjNGZNGxPJEbDx/uBu1BDuPoIR4iqVdXt367eTIiU0xLEOFS0QWXd H6yMM0N1xBi4VQyrSQgxCTuzzhCh37HTN0SASw9e+CaTBckbQoeWltAL3HxMpsZ3DmVB BIHTcTtZrEjxj1DzvPAVczkHx252zoguufsQF6GWzOR94nedRdGG/BAMMaHbN4G6zOT0 Xe2f3qMgzm5WGaCehniQE6k2bderVEzyza2WWMMQyoemDq86gcq1zkaX/RtPilA8fzvx W8VGPuwz9GKguHb+Q1UM3shsdiAlVGUo8xarqPxdvXe8SnswjJr+UboaGwmQi8Ff0gSO A2GA==; darn=zsh.org
- Arc-seal: i=1; a=rsa-sha256; t=1776720606; cv=none; d=google.com; s=arc-20240605; b=N2Z8aS8cwzGavE+23pO7jhIEO+EBpGd8JGK/92WWT557B7x4zHtIlAel8N396NFCSx XAP/9wRkc8MbCkzepXdHbdlPIc4wITomwREx5c6Vvke9Pd2KOGex9ozzawM5x8NArgl6 DlzEh6q5Y/PG/eGEqoNZg4FK4Xk9ONxkgq7Trg+BXh8OyGWDCi+xSKanddNpEX4mfsG5 KtmhOadebqIl8wW1cDoFvhBferiy2LH0m0rx3jIcaBZhY2higtlq3UXu7HVhqMcJl5Ht gNMvOukeb3/6++CcWiV8x6F1CyIoG2lYN5KmMfCH/onOL9Jclz32CCPSkkLnf3M2bHsU dOGQ==
- Archived-at: <https://zsh.org/workers/54377>
- List-id: <zsh-workers.zsh.org>
The code that ties WATCH and watch never triggers. This patch replaces it with support for tied paramdef instances. The two commits on GitHib show the before and after state of the two parameters:
Philippe
diff --git a/Src/Modules/watch.c b/Src/Modules/watch.c
index bb27ab9db..f23819b25 100644
--- a/Src/Modules/watch.c
+++ b/Src/Modules/watch.c
@@ -695,8 +695,10 @@ static struct builtin bintab[] = {
};
static struct paramdef partab[] = {
- PARAMDEF("WATCH", PM_SCALAR|PM_SPECIAL, &watch, NULL),
- PARAMDEF("watch", PM_ARRAY|PM_SPECIAL, &watch, NULL),
+ PARAMDEF("WATCH", PM_SCALAR|PM_SPECIAL|PM_TIED, &watch,
+ NULL /* &colonarr_gsu (see setup_()) */),
+ PARAMDEF("watch", PM_ARRAY|PM_SPECIAL|PM_TIED, &watch,
+ NULL /* &vararray_gsu (see setup_() */),
};
static struct features module_features = {
@@ -739,15 +741,6 @@ boot_(UNUSED(Module m))
{
static char const * const default_watchfmt = DEFAULT_WATCHFMT;
- Param pma = (Param) paramtab->getnode(paramtab, "watch");
- Param pms = (Param) paramtab->getnode(paramtab, "WATCH");
- if (pma && pms && pma->u.arr == watch && pms->u.arr == watch) {
- /* only tie the two parameters if both were added */
- pma->ename = "WATCH";
- pms->ename = "watch";
- pma->node.flags |= PM_TIED;
- pms->node.flags |= PM_TIED;
- }
watch = mkarray(NULL);
/* These two parameters are only set to defaults if not set.
diff --git a/Src/module.c b/Src/module.c
index 659bc3544..4ca15e7e2 100644
--- a/Src/module.c
+++ b/Src/module.c
@@ -1085,6 +1085,9 @@ addparamdef(Paramdef d)
*/
switch (PM_TYPE(pm->node.flags)) {
case PM_SCALAR:
+ if (pm->node.flags & PM_TIED)
+ pm->ename = casemodify(pm->node.nam, CASMOD_LOWER);
+ /* fall-through */
case PM_NAMEREF:
pm->gsu.s = d->gsu ? (GsuScalar)d->gsu : &varscalar_gsu;
break;
@@ -1099,6 +1102,8 @@ addparamdef(Paramdef d)
break;
case PM_ARRAY:
+ if (pm->node.flags & PM_TIED)
+ pm->ename = casemodify(pm->node.nam, CASMOD_UPPER);
pm->gsu.a = d->gsu ? (GsuArray)d->gsu : &vararray_gsu;
break;
diff --git a/Test/V01zmodload.ztst b/Test/V01zmodload.ztst
index daf49cd72..ec55e0f95 100644
--- a/Test/V01zmodload.ztst
+++ b/Test/V01zmodload.ztst
@@ -236,6 +236,17 @@
fi
0d:Autoload a module via a math function
+ if [[ $mods[(r)zsh/watch] == zsh/watch ]]; then
+ zmodload -u zsh/watch
+ WATCH=foo:bar
+ typeset -p WATCH watch
+ else
+ ZTST_skip="zsh/watch module not available"
+ fi
+0:Autoload tied parameters
+>typeset -g -T WATCH watch=( foo bar )
+>typeset -g -aT WATCH watch=( foo bar )
+
# Test module aliases
zmodload -A example=zsh/example
Messages sorted by:
Reverse Date,
Date,
Thread,
Author