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

Re: Use of left- and right-padding with a variable padding char



On 7/24/21, Zach Riggle <zachriggle@xxxxxxxxx> wrote:
> As always, thank you all so much for your time.  It's genuinely
> appreciated.
>
> I want to define a function "center", which takes $1="Some String" and
> $2="-" or some other default padding value.
>
> The Zsh manual on expansion says that I can do something like this,
> which works well and as intended:
>
>     function center() {
>         local text="${1:-hellworld}"
>         local -i columns=${COLUMNS:-$(tput cols)}
>         columns=$(( columns/2 ))
>         echo ${(l:${columns}::=:::r:${columns}::=:::)text}
>     }
>
> This works very well, and correctly centers "${text}" across the width
> of the terminal, with "=" padding on both sides.  Perfect.
>
> However, I also want to make the padding character ("=" in the above
> example) be variable.
>
> The following does NOT work as intended, and I'm not sure why.  My
> understanding is that variable expansion is inside-out, so it SHOULD
> work.
>
>     function center() {
>         local text="${1:-hellworld}"
>         local pad="${2:-=}"
>         local -i columns=${COLUMNS:-$(tput cols)}
>         columns=$(( columns/2 ))
>         echo ${(l:${columns}::${pad}:::r:${columns}::${pad}:::)text}
>     }
>     center "hello" "_"
>
> The value in $1 is correctly centered, but it is padded with the
> LITERAL value '${pad}', rather than the expansion of ${pad}.
>
> I expect there's some documentation that I haven't read yet, any tips
> would be useful.

Add p and drop the braces, as in
  echo ${(pl:${columns}::$pad:::r:${columns}::$pad:::)text}


       p      Recognize  the  same  escape  sequences as the print
              builtin in string arguments to any of the flags described
              below that follow  this  argument.

              Alternatively,  with  this  option string arguments
              may be in the form $var in which case the value of
              the  variable  is  substituted.   Note this  form  is
              strict;  the  string argument does not undergo general
              parameter expansion.



-- 
Mikael Magnusson




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