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, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 15525 invoked from network); 19 Apr 2021 16:47:53 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 19 Apr 2021 16:47:53 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20200801; t=1618850873; b=UnZ1Y8FmbbMdm8B6x/VBRAlfRJyTv6bwH5+W4rD/pFwCaV/DS53hrMHkyPuK0YoQod+gN2r+mV 9HKGqeSBQnNJtFlOFDI04QBWtMBsTkpHLLq+/i2Ad8oMQ1Kzy7ix8yGJMcYJ3pkkknHtQ8xjH1 Pvsr3Ne28kDMzg10go2ReYSKTQtvA6Qs3+15BwJFriq/TiUjHqhOSVp6Rzi9h2RQxfHQjPD1WP mjvxJecrRGzJDSi6x4XWKEFd8sm7K8KBctP2ucVBH3w654mS0XE34g6ccY6MJLStDYkrUP+Jwd Ln/ZAvoITsUA8946umR3Vui5LUQmDUPJQt4z9+CtdudJdg==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-ej1-f41.google.com) smtp.remote-ip=209.85.218.41; dkim=pass header.d=gmail.com header.s=20161025 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-20200801; t=1618850873; bh=8vHbiLIDSKhSGOu5AtJRfO5GP8jvuMK3cf6e4Fyss3Q=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:References:To:Cc:In-Reply-To:Date:Subject:MIME-Version: Content-Type:Message-ID:From:DKIM-Signature:DKIM-Signature; b=OiQ3JhTX52BExHvt3eWKkMA8sLImkaE0goVgLT+bIOqFu2mmvlkBdWKOECpmxYqm3iZoF+9dhm HGqkiJLU7OMa/2TPyWqSTzX820op1HpZ9vVY23O+kYYYd2PhQidPXJOr9+MwK9LSz946L7BZ7g yQnvpHBP4W/r7JTheT/mJor9y9fF/vGMTqFL2kbr+AUFJDVvL3izra7La8TA6roO6oA5MHOpDx P5oO7wodFYiESFHhwsDcIt8C9m2cqn9y+sSOc8/y+9S+JQq/AE4TOpeaXoeTzfD2PPo+1n46nZ NLAgEPKPy7IKAPNoz2LF5cHoi2ECFAiAKMrKszSd0/6zUg==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20200801; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:References:To:Cc:In-Reply-To:Date: Subject:Mime-Version:Content-Type:Message-Id:From:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID; bh=VtDmdB8GiL3QR84xZoUcTXb0d8mCecGlP2iG8lvwhLg=; b=zysQgrfOjEL1rEKqzYudtEIyy+ VZ3x2HYI9xXCyTpu0Kyv7xzN8RQ/KWxOnqEQpFoyeNzYxFF+Oj3yKDFX/WPwuf34wwqy8AKeam+og S/7I/0dUxzXSOsFEZKUM9xZ0Ncx003RMhNvtENeKgrfeNsswBXjZUy1FJWmYGOYYHIkVyhSoLcShu Q3pmxk87vLaiANjktEIKwwYWv2jqHzepZ99rXtGgYEmHxheqPLpWVUwwnby+4gp27nMcEnv2p/qf4 06O/8yVmkLRAev0fpjMaLRuQc5rZmI2NnSdijto07miIUL/WidB9v5utG+6dDpTsEvKmPvE4zkWj7 8971vHMA==; Received: from authenticated user by zero.zsh.org with local id 1lYX3t-0005zU-Gm; Mon, 19 Apr 2021 16:47:49 +0000 Authentication-Results: zsh.org; iprev=pass (mail-ej1-f41.google.com) smtp.remote-ip=209.85.218.41; dkim=pass header.d=gmail.com header.s=20161025 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none Received: from mail-ej1-f41.google.com ([209.85.218.41]:38611) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1lYX33-0005jp-MC; Mon, 19 Apr 2021 16:46:58 +0000 Received: by mail-ej1-f41.google.com with SMTP id r12so53990618ejr.5 for ; Mon, 19 Apr 2021 09:46:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:message-id:mime-version:subject:date:in-reply-to:cc:to :references; bh=VtDmdB8GiL3QR84xZoUcTXb0d8mCecGlP2iG8lvwhLg=; b=OUbgQfGLthYJFEBI4d/Sho+FZmiNm9wylAWAPwvQYYRHOyxnVdRw+LGkgSKQ7LHkcn AiboK6yM6OZo7Iin+hQa367EKhtTX4oaujjWVn0hhPT1vplvxe5smU179EQN61m31LIs DtiWFrI9smxWUW5HuHDxZH7GUO9dCnZwzrzL1g71V8thCeMyGWn37u6fOYShkiFyb+dB +SfVBZb/BP9OGGYjq3J0nQAkAa/RaQY6MPVv/QqGAMavhbHY6HaPgbXhLd9rJnjoXN3F CT0iV8guGCS43t0JozICGXe6z8vtOIqTj/rkuXqgnr50+jbMVDeQrZlVqqBEyRnlH1n6 WnYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:message-id:mime-version:subject:date :in-reply-to:cc:to:references; bh=VtDmdB8GiL3QR84xZoUcTXb0d8mCecGlP2iG8lvwhLg=; b=YIaD5eSKzroxoMTHGbJ/laZjSgcAiCEo7RKU2nMJg3d25NpKtDG+0q8Wwjm+DpR9tq jg5KTcvtsapLLjWbWqVrOtmd+2j+bDYE4abncyP0c1B4zeKZIeOkArDoU19M0iO3g/XZ uGWHsv3UlX5GYPrykEHgtCS1/jVMmDJY9YsCHQfRxIz3Bal1y3XXgGfoFhCx+qEaEgsa FvsBZiVkAj2YB33xFGctuPd+r00lHcPLA7mAX3Lq+IDs59dDewfA57Z60dAO9/5m9Y1t 36auHpEWetfo9RMMiG1vSABHn5qmsF6eZ5V4alqxQBny3FTLZjEtbmB6+dOzc89GlBwJ zKxQ== X-Gm-Message-State: AOAM530GLOfg8NfneCkFkNKcRuvOVKCRPvsVAhF/KFtICbZ4qu1deMJ6 X8WE8MDg1XTkSkYnAmi5DrO5DVt7NnKBtg== X-Google-Smtp-Source: ABdhPJwDxCGoNDtrAOUChsQTtGqjb1wOhYCsUnwMFwHkd554rXi502wER5jqNXFeHzBHrsafWXauzQ== X-Received: by 2002:a17:907:961d:: with SMTP id gb29mr16853227ejc.381.1618850816919; Mon, 19 Apr 2021 09:46:56 -0700 (PDT) Received: from [192.168.1.15] (hag-tkubng22-50df3e-132.dhcp.inet.fi. [80.223.62.132]) by smtp.gmail.com with ESMTPSA id h9sm9317413ejf.10.2021.04.19.09.46.55 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 19 Apr 2021 09:46:56 -0700 (PDT) From: Marlon Richert Message-Id: Content-Type: multipart/mixed; boundary="Apple-Mail=_EFFC6A05-9305-4D88-9982-A0BBCCCC0F1D" Mime-Version: 1.0 (Mac OS X Mail 14.0 \(3654.60.0.2.21\)) Subject: Re: [RFC][PATCH] `newuser` prompt theme Date: Mon, 19 Apr 2021 19:46:54 +0300 In-Reply-To: <20210416193037.GD15670@tarpaulin.shahaf.local2> Cc: Zsh hackers list To: Daniel Shahaf References: <7E71FA83-356E-448B-9726-02DF3FF5BD14@gmail.com> <873D08A9-F321-474A-8440-CCE7DCCBA529@gmail.com> <20210414120551.GA3882@tarpaulin.shahaf.local2> <6CEA4F3E-9A64-44E1-9121-FA9D5E053AB5@gmail.com> <20210414140909.GG3882@tarpaulin.shahaf.local2> <29E16F69-B09E-44BF-9009-1CF53053D4FC@gmail.com> <20210416171321.GC4535@tarpaulin.shahaf.local2> <93FFDA3D-3C4A-414E-9220-1032ECE5B04C@gmail.com> <20210416193037.GD15670@tarpaulin.shahaf.local2> X-Mailer: Apple Mail (2.3654.60.0.2.21) X-Seq: 48620 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: --Apple-Mail=_EFFC6A05-9305-4D88-9982-A0BBCCCC0F1D Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 On 16 Apr 2021, at 22:30, Daniel Shahaf wrote: >=20 >> +prompt_vcs_chpwd() { >> + exec {fd}< <( >> + # Fetch only staged changes at this point, for performance = reasons. >> + _prompt_vcs_zstyle ':vcs_info:*:prompt_vcs:*' = check-for-staged-changes yes >=20 > Should this set =C2=ABcheck-for-changes no=C2=BB, to override a = =C2=AByes=C2=BB that may > have been explicitly set on a less-specific context pattern? Yes, that would make sense. Added. See attachment. --Apple-Mail=_EFFC6A05-9305-4D88-9982-A0BBCCCC0F1D Content-Disposition: attachment; filename=0001-Add-customizable-vcs-prompt-theme.txt Content-Type: text/plain; x-unix-mode=0644; name="0001-Add-customizable-vcs-prompt-theme.txt" Content-Transfer-Encoding: quoted-printable =46rom 12867d2439f3c3f550190438b8b7cb53441bfc42 Mon Sep 17 00:00:00 2001 From: Marlon Richert Date: Mon, 19 Apr 2021 19:43:16 +0300 Subject: [PATCH] Add customizable `vcs` prompt theme --- Functions/Prompts/prompt_vcs_setup | 228 +++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 Functions/Prompts/prompt_vcs_setup diff --git a/Functions/Prompts/prompt_vcs_setup = b/Functions/Prompts/prompt_vcs_setup new file mode 100644 index 000000000..1ab73da2b --- /dev/null +++ b/Functions/Prompts/prompt_vcs_setup @@ -0,0 +1,228 @@ +## +# Prompt that can be customized through vcs_info +# + +autoload -Uz add-zle-hook-widget add-zsh-hook vcs_info + +# Standardized exit codes. See `man 3 sysexits`. +if [[ ${(t)sysexits} !=3D *readonly* ]]; then + # Avoid error in case this has been set already. + readonly -ga sysexits=3D( + USAGE + DATAERR + NOINPUT + NOUSER + NOHOST + UNAVAILABLE + SOFTWARE + OSERR + OSFILE + CANTCREAT + IOERR + TEMPFAIL + PROTOCOL + NOPERM + CONFIG + ) +fi + +# Prompt segments +readonly -gHA _prompt_vcs_defaults=3D( + start:chpwd $'\n%B%F{blue}%~%%b%f/\n' + start:left $'%%(?,%F{green},%F{red}%v%k\n%B%%S)%#%%b%f%%s ' + start:right '%B%F{blue}%n%b%f%k@%F{magenta}%m%f' + start:staged '%B%F{green}+%b%f' + start:unstaged '%B%F{red}*%b%f' + start:action '%B%F{red}%a%%b%f' + start:branch '%B%F{cyan}%b%%b%f' + start:repo '|%B%F{blue}%r%%b%f' + cont:indent ' ' + cont:left '' + cont:right '%F{red}%^%f' +) + +prompt_vcs_help() { + print -r -- \ +"This prompt theme can by customized by copy-pasting any of the code = below to +your .zshrc file and editing it there:' + + # For each of these, + # * the first string is used for \$PS1 after changing dirs, + # * the second string is used for \$PS1 otherwise, and + # * the third string is used for \$RPS1 and updated asynchronously. + # In these, %v expands to the name (if any) & number of the last exit = code. + zstyle ':vcs_info:*:prompt_vcs:*' nvcsformats \ + = "${${:-$_prompt_vcs_defaults[start:chpwd]$_prompt_vcs_defaults[start:left]= }//'%%'/%}" \ + "${_prompt_vcs_defaults[start:left]//'%%'/%}" \ + "${_prompt_vcs_defaults[start:right]//'%%'/%}" + zstyle ':vcs_info:*:prompt_vcs:*' formats \\ + = ${(q+):-$_prompt_vcs_defaults[start:chpwd]$_prompt_vcs_defaults[start:left= ]} \\ + ${(q+)_prompt_vcs_defaults[start:left]} \\ + = ${(q+):-%u%c$_prompt_vcs_defaults[start:branch]$_prompt_vcs_defaults[start= :repo]} + zstyle ':vcs_info:*:prompt_vcs:*' actionformats \\ + = ${(q+):-$_prompt_vcs_defaults[start:chpwd]$_prompt_vcs_defaults[start:left= ]} \\ + ${(q+)_prompt_vcs_defaults[start:left]} \\ + = ${(q+):-%u%c$_prompt_vcs_defaults[start:action]$_prompt_vcs_defaults[start= :repo]} + + # These set the values of %c and %u, respectively: + zstyle ':vcs_info:*:prompt_vcs:*' stagedstr = ${(q+)_prompt_vcs_defaults[start:staged]} + zstyle ':vcs_info:*:prompt_vcs:*' unstagedstr = ${(q+)_prompt_vcs_defaults[start:unstaged]} + +For more info on the config above, see +http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html and the = end of = +http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#vcs_005fin= fo-Configuration" +} + +# Sets a style if it hasn't been set yet. +_prompt_vcs_zstyle() { + local -a val + zstyle -g val "$1" "$2" + (( $#val )) || + zstyle "$@" +} + +_prompt_vcs_info() { + _prompt_vcs_zstyle ':vcs_info:*:prompt_vcs:*' max-exports 3 # Default = is 2. + + _prompt_vcs_zstyle ':vcs_info:*:prompt_vcs:*' nvcsformats \ + = "${${:-$_prompt_vcs_defaults[start:chpwd]$_prompt_vcs_defaults[start:left]= }//'%%'/%}" \ + "${_prompt_vcs_defaults[start:left]//'%%'/%}" \ + "${_prompt_vcs_defaults[start:right]//'%%'/%}" + _prompt_vcs_zstyle ':vcs_info:*:prompt_vcs:*' formats \ + = "$_prompt_vcs_defaults[start:chpwd]$_prompt_vcs_defaults[start:left]" \ + "$_prompt_vcs_defaults[start:left]" \ + = "%u%c$_prompt_vcs_defaults[start:branch]$_prompt_vcs_defaults[start:repo]"= + _prompt_vcs_zstyle ':vcs_info:*:prompt_vcs:*' actionformats \ + = "$_prompt_vcs_defaults[start:chpwd]$_prompt_vcs_defaults[start:left]" \ + "$_prompt_vcs_defaults[start:left]" \ + = "%u%c$_prompt_vcs_defaults[start:action]$_prompt_vcs_defaults[start:repo]"= + _prompt_vcs_zstyle ':vcs_info:*:prompt_vcs:*' stagedstr \ + "$_prompt_vcs_defaults[start:staged]" + _prompt_vcs_zstyle ':vcs_info:*:prompt_vcs:*' unstagedstr \ + "$_prompt_vcs_defaults[start:unstaged]" + + vcs_info prompt_vcs # Call with namespace. + + print -rNC1 -- \ + "${(q+)vcs_info_msg_0_}" "${(q+)vcs_info_msg_1_}" = "${(q+)vcs_info_msg_2_}" +} + +prompt_vcs_chpwd() { + emulate -L zsh + + local -i fd=3D-1; local -a reply + exec {fd}< <( + # Fetch only staged changes at this point, for performance reasons. + _prompt_vcs_zstyle ':vcs_info:*:prompt_vcs:*' check-for-changes no + _prompt_vcs_zstyle ':vcs_info:*:prompt_vcs:*' = check-for-staged-changes yes + _prompt_vcs_info + ) + IFS=3D$'\0' read -Aru "$fd" + typeset -ga _prompt_vcs_info_msg_=3D( "${(@Q)reply}" ) + exec {fd}<&- + + PS1=3D"$_prompt_vcs_info_msg_[1]" + RPS1=3D"$_prompt_vcs_info_msg_[3]" +} + +prompt_vcs_precmd() { + local exitstatus=3D$? # Exit status of last command + emulate -L zsh + + # Assign human-friendly exit status string to %v. + psvar[1]=3D + case $exitstatus in + ( <128-> ) + psvar[1]=3D"SIG$signals[exitstatus-127] " + ;| + ( <64-78> ) + psvar[1]=3D"EX_$sysexits[exitstatus-63] " + ;| + ( <1-> ) + psvar[1]+=3D"($exitstatus)" + ;; + # No need to show EX_OK. + esac +} + +prompt_vcs_line-init() { + emulate -L zsh + + case $CONTEXT in + start ) # (R)PS1 + # Asynchronously check for unstaged changes. Do this here & not = in + # precmd, so you can press Enter on an empty line to update VCS = info. + local -i fd=3D-1 + exec {fd}< <( + _prompt_vcs_zstyle ':vcs_info:*:prompt_vcs:*' check-for-changes = yes + _prompt_vcs_info + print -r -- "$PWD" + ) + + # Add callback. Needs to be a widget, so we can refresh the = prompt. + zle -Fw "$fd" prompt_vcs_fd-handler + ;; + cont ) # (R)PS2 + # Indent left continuation prompt for each open shell construct. + local fmt=3D"$_prompt_vcs_defaults[cont:indent]" + local -a indent=3D( '%('{1..$(( COLUMNS / ${(m)#fmt} = ))}"_,$fmt,)" ) + PS2=3D"${(j::)indent}$_prompt_vcs_defaults[cont:left]" + + RPS2=3D"$_prompt_vcs_defaults[cont:right]" + ;; + esac +} + +# Callback widget function for our async fetch of unstaged VCS changes +prompt_vcs_fd-handler() { + emulate -L zsh + + local -i fd=3D$1; local sig=3D$2; local -a reply + { + zle -F "$fd" # Detach ourselves, so we don't get called more than = once. + + [[ $sig !=3D (|hup) ]] && + return # Error occured + + IFS=3D$'\0' read -Aru "$fd" + + [[ $reply[-1] !=3D $PWD ]] && + return # Abort if the info is not for the current dir. + } always { + exec {fd}<&- + } + shift -p reply + typeset -ga _prompt_vcs_info_msg_=3D( "${(@Q)reply}" ) + RPS1=3D"$_prompt_vcs_info_msg_[3]" + zle .reset-prompt +} + +prompt_vcs_line-finish() { + emulate -L zsh + PS1=3D"$_prompt_vcs_info_msg_[2]" +} + +prompt_vcs_setup() { + prompt_opts=3D( cr percent sp ) # Tell promptinit which options to = set. + + PS4=3D$'# ?=3D%(?,%F{green},%B%F{red}%S)%?%b%f%s e=3D%e = %F{green}%1N%f:%I %(1_,%F{yellow}%K{black}%_%f%k ,)' + SPROMPT=3D'Correct %B%F{red}%U%R%b%f%u to %B%F{green}%r%b%f? = [%Sy%ses|%Sn%so|%Se%sdit|%Sa%sbort] ' + PROMPT_EOL_MARK=3D'%S%F{cyan}%#%s%f' + zle_highlight=3D( + isearch:fg=3Dblack,bg=3Dyellow + special:fg=3Dcyan,bold + region:bg=3Dblue + suffix:bg=3Dblue + paste:none + ) + + add-zsh-hook chpwd prompt_vcs_chpwd + add-zsh-hook precmd prompt_vcs_precmd + add-zle-hook-widget line-init prompt_vcs_line-init + add-zle-hook-widget line-finish prompt_vcs_line-finish + zle -N prompt_vcs_fd-handler # Callback widget for async VCS update. + + prompt_vcs_chpwd +} + +prompt_vcs_setup "$@" --=20 2.31.1 --Apple-Mail=_EFFC6A05-9305-4D88-9982-A0BBCCCC0F1D Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii --Apple-Mail=_EFFC6A05-9305-4D88-9982-A0BBCCCC0F1D--