Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Count only visible characters?

On Apr 9,  8:50pm, Peter Stephenson wrote:
} On Thu, 8 Apr 2010 22:38:05 +0000 (UTC)
} Seth House <seth@xxxxxxxxx> wrote:
} > Is there any way to count only visible characters?
} > 
} >     testing="%F{green}hello"
} >     echo ${(%)#testing}
} > 
} > The number I'm interested in is 5 not 14.

Incidentally, ${(%)#testing} doesn't do what you think it does.  # is
applied BEFORE (%), making (%) rather useless.

What you meant was ${#${(%)testing}}.

} That's correct, it isn't trivial using shell code.  (It's not *so* hard
} to strip the various highlighting codes and %{ ... %} sections if you
} want an exercise in shell programming.)

There's code to do part of this in Functions/Prompts/prompt_bart_setup,
in the prompt_bart_precmd function.  Search for "zero".  It doesn't
handle %{ %} pairs, though, just the other zero-width strings.

} However, the code to do this is already built into the shell itself,
} so making this available is a straightforward change.  Note you need
} the `#' inside the parentheses---the normal `#' is too long
} established for me to be keen on changing its meaning even in
} combination with `(%)'.

Hmm.  Might I suggest that this is of somewhat limited utility?  A
better approach might be to add an option that produces the string
with the zero-width characters removed, and then simply apply the old
normal '#' operator to that result.  Perhaps tripling the (%) flag
means this, e.g.

  print ${(%%%):-%F{red}hello%f there}
  hello there
  print ${#${(%%%):-%F{red}hello%f there}}

My one qualm about (%%%) is that (%%) does more expansion than (%)
and one might want e.g. to count the result of (%) without doing the
PROMPT_SUBST etc. expansion ...

I realize this isn't as straightforward as what you just patched.

A related suggestion that doesn't actually solve the problem of
terminal escapes:  Doubling the (V) flag could remove all special
characters from the result, rather than making them visible.  (That
should also have the effect of removing any fragmentary multibyte
characters, I think.)

Messages sorted by: Reverse Date, Date, Thread, Author