zsh-users
 help / color / mirror / code / Atom feed
* Shortened bit branch in prompt
@ 2021-02-10 12:05 Dominik Vogt
  2021-02-10 12:45 ` Peter Stephenson
  2021-02-11  1:43 ` Bart Schaefer
  0 siblings, 2 replies; 4+ messages in thread
From: Dominik Vogt @ 2021-02-10 12:05 UTC (permalink / raw)
  To: Zsh Users

I have this function to put the name of the current git branch in
the shell prompt if the working directory is inside a git tree:

--
__git_ps1 () {
	local b="$(
		git symbolic-ref -q HEAD 2> /dev/null ||
		{ [[ $? == 1 ]] && printf '*none*'} )"
	if [[ -n "$b" ]]
	then
		printf " (%s)" "${${b##refs/heads/}:0:25}"  <---------------
	fi
}
--

Since a customer uses absurdly long branch names, it uses only the
first 25 characters of the name.

I want to change that so

 * If the branch name is max. 25 characters, print it umodified.
 * If the branch ame is loger, print

     <first 17 characters>...<last five characters>

   E.g. if the branch name is abcdefghijklmnopqrstuvwxyz0123456789,
   the prompt should have

     abcdefghijklmnopq...56789

Of course this should be done with zsh functionality only.

Ciao

Dominik ^_^  ^_^

--

Dominik Vogt


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Shortened bit branch in prompt
  2021-02-10 12:05 Shortened bit branch in prompt Dominik Vogt
@ 2021-02-10 12:45 ` Peter Stephenson
  2021-02-10 15:40   ` Dominik Vogt
  2021-02-11  1:43 ` Bart Schaefer
  1 sibling, 1 reply; 4+ messages in thread
From: Peter Stephenson @ 2021-02-10 12:45 UTC (permalink / raw)
  To: Zsh Users

> On 10 February 2021 at 12:05 Dominik Vogt <dominik.vogt@gmx.de> wrote:
> I want to change that so
> 
>  * If the branch name is max. 25 characters, print it umodified.
>  * If the branch ame is loger, print
> 
>      <first 17 characters>...<last five characters>
> 
>    E.g. if the branch name is abcdefghijklmnopqrstuvwxyz0123456789,
>    the prompt should have
> 
>      abcdefghijklmnopq...56789
> 
> Of course this should be done with zsh functionality only.

It's possible to be completely general about printing a variable substitution
based on the length, in this case of variable "foo":

print ${${${${${:-$(( ${#foo} > 25 ))}##1}:-Printed if long}##0}:-Printed if short}

Those arbitrary chunks are subject to further expansion, so put the expressions
you need there --- in particular, $foo, ${foo[1.17]}...${foo[-5,-1]}, I haven't
put those in myself just for the sake of clarity of what's going on.

There are probably ways of shortening this, but by the standards of the squiggle
factory that's arguably quite readable.  (Only arguably.)

pws


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Shortened bit branch in prompt
  2021-02-10 12:45 ` Peter Stephenson
@ 2021-02-10 15:40   ` Dominik Vogt
  0 siblings, 0 replies; 4+ messages in thread
From: Dominik Vogt @ 2021-02-10 15:40 UTC (permalink / raw)
  To: zsh-users

On Wed, Feb 10, 2021 at 12:45:13PM +0000, Peter Stephenson wrote:
> > On 10 February 2021 at 12:05 Dominik Vogt <dominik.vogt@gmx.de> wrote:
> > I want to change that so
> >
> >  * If the branch name is max. 25 characters, print it umodified.
> >  * If the branch ame is loger, print
> >
> >      <first 17 characters>...<last five characters>
> >
> >    E.g. if the branch name is abcdefghijklmnopqrstuvwxyz0123456789,
> >    the prompt should have
> >
> >      abcdefghijklmnopq...56789
> >
> > Of course this should be done with zsh functionality only.
>
> It's possible to be completely general about printing a variable substitution
> based on the length, in this case of variable "foo":
>
> print ${${${${${:-$(( ${#foo} > 25 ))}##1}:-Printed if long}##0}:-Printed if short}
>
> Those arbitrary chunks are subject to further expansion, so put the expressions
> you need there --- in particular, $foo, ${foo[1.17]}...${foo[-5,-1]}, I haven't
> put those in myself just for the sake of clarity of what's going on.

Okay, that's past my abilities of reading expansions ...  I've
done it with a bit of builtin scripting instead, using the $b[n,m]
syntax that I didn't know yet.

__git_ps1 () {
	local b

	b="$(git symbolic-ref -q HEAD 2> /dev/null)"
	case "$?" in
		128) return ;;
		0) ;;
		*) b='*none*' ;;
	esac
	b="${b##refs/heads/}"
	test ${#b} -gt 25 && b="$b[1,17]...$b[-5,-1]"
	test ${#b} -gt 0 && printf " (%s)" "$b"
}

Thanks for the help!

Ciao

Dominik ^_^  ^_^

--

Dominik Vogt


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Shortened bit branch in prompt
  2021-02-10 12:05 Shortened bit branch in prompt Dominik Vogt
  2021-02-10 12:45 ` Peter Stephenson
@ 2021-02-11  1:43 ` Bart Schaefer
  1 sibling, 0 replies; 4+ messages in thread
From: Bart Schaefer @ 2021-02-11  1:43 UTC (permalink / raw)
  To: dominik.vogt, Zsh Users

On Wed, Feb 10, 2021 at 4:05 AM Dominik Vogt <dominik.vogt@gmx.de> wrote:
>
>  * If the branch name is max. 25 characters, print it umodified.
>  * If the branch ame is loger, print
>
>      <first 17 characters>...<last five characters>

Could you do this using the %> and %< prompt expansion escapes?

x=abcdefghijklmnopqrstuvwxyz0123456789
print -r -- ${(%):-%20>...>$x%>>%5<<$x%<<}

That still needs a conditional to determine (( $#x > 25 )).  Perhaps then:

setopt extendedglob
pat="(${(l:20::?:):-})?*(${(l:5::?:):-})"
print -r -- ${x/(#b)${~pat}/${match[1]}...${match[2]}}

I don't recall whether ${(*)...} to temporarily turn on extended
globbing is very common in the wild, yet.


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-02-11  1:44 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-10 12:05 Shortened bit branch in prompt Dominik Vogt
2021-02-10 12:45 ` Peter Stephenson
2021-02-10 15:40   ` Dominik Vogt
2021-02-11  1:43 ` Bart Schaefer

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).