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 31501 invoked from network); 16 Apr 2021 19:19:40 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 16 Apr 2021 19:19:40 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20200801; t=1618600780; b=lZuwRgLTPkQTuJYfTyTdtC8tICfbINuUQ6ZtqRGKUXIdHDjqTp1a3gfpFBEFwVIajvpJZhEs1V yBIuS70eOkcSlmJzwvU3eqtyJ4xD7MeRzQ/uXFa/QM/OGCWUNm5/8sxYAQL4Bj7FYMCOLW6rRp iLWqHd5PNX8cCGzob6WcAI8BxiEHrxMdQuKvdMuM9bLYIZpx25DkctoIGvk6TFZ1e3RFIyo/JM oZw8issYXTgCnUuG2PR7mjZ7bKT7b04U0K3P8OTgei/Gfblhi+wFw3yjrBaSmPa38C8oh63SBo qHUGb+249If3H+w9YjH9RIBod0s6//fJ5y2P6aVvLI39Rw==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-lf1-f42.google.com) smtp.remote-ip=209.85.167.42; 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=1618600780; bh=XL9Fg1NraTnLtY2KUr2TIbiiINHGUKOR8ryUODVqR4o=; 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=o36QaIRkUmkxhTudvyyUVvSfx51yj7JLAzXJE8mRScROPelt64XNijts3lu8aFdv7HL3TK1vKn OtL4JuMawmOAfefZfg7mVp+0ji4M4ER2qoDyU9Q2fDy9kkIr87U2Jycf1DpJkUWNRHlCtBSfQ0 oX9WenWaABXkRQtvFazn9QMyzCpIrNAeQ/A0yg9t6ayPO5i8vHIQTNSEUezZWHmqfrlDAHLExG DQuOQ7NMDQ4bE4Kem3j20xpitJUZvZTDxHuCMftojrxmVzUVFPeZd4GbAk0mn3ndJr+OOSbqyi QWu78puZ6b8AFcJ55LP+p21oc/3xrErtLSrmGm5vC92Gdg==; 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=bIXPa2CjlzPQD7e2poodEmfMsea8QutmCz/xeEdjNog=; b=cm4s05PSQmyZxq+PAi2IsPCM72 7Em9GztaE75mNQJWvMM9Haedh9Ry3pTRTu0cwuThG6qKVQAWP33hNl5/t7Et3SMPYR646c08YmP0B v8W5zHl/5wuTey7U6J7+jLDs3OEBEuFsC2sdSw6+jtyYidtO4brlxqVYn23aXx5g2detLuj9q+xDn ywo6MZI+/NZs8BTJ1grKvAZ31sjakS4kulE4TD7ZKBd68xjs5Ja2oeiZsY/fy7CByto9etR8JQ2nn /D4YodXvpUASsPgAjTQxJDWxwzvcuUiWoGZYe9rEEfY7DMxifJvKEUxmRFT4vNoRLaTQzXefdeyGi 9iYv9kww==; Received: from authenticated user by zero.zsh.org with local id 1lXU08-000NTY-0x; Fri, 16 Apr 2021 19:19:36 +0000 Authentication-Results: zsh.org; iprev=pass (mail-lf1-f42.google.com) smtp.remote-ip=209.85.167.42; dkim=pass header.d=gmail.com header.s=20161025 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none Received: from mail-lf1-f42.google.com ([209.85.167.42]:40638) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1lXTzd-000Mwy-JB; Fri, 16 Apr 2021 19:19:06 +0000 Received: by mail-lf1-f42.google.com with SMTP id f17so39346524lfu.7 for ; Fri, 16 Apr 2021 12:19:05 -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=bIXPa2CjlzPQD7e2poodEmfMsea8QutmCz/xeEdjNog=; b=CboYbFvxUhimADW/AmyCMaVF6KaXQMERQJAsE47YAXw1kL5FHB8fzZuYN6u81fSDE+ w9VHm5OHxtqe90npNrReKVmXZ3/pTWh3m/Ml3sIi7ldhUaMQAM/0G0mIDgkRzoLdsKNw 2wIYcZADsMHqF600AJKTNQ2lWQ32bu0TC2jez0/J+OxUjEJjZOIN3Lv1rGwx+XtOyxLT gEEl5nNokxXyfB6CKZUH+KFI7Eev7NUo8rNqPM4zO4Y+chqKIAxAX1mwAM1rQj5yFebW LwUwQEaGPM92/rwYVU9a24OKX45BtR1z6vNvJFKgVBNNlxanD9ubGWuAlC2XY8jlhdd6 oRug== 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=bIXPa2CjlzPQD7e2poodEmfMsea8QutmCz/xeEdjNog=; b=dY2BpLPlYfdqYBKhEQ6BkXPRx/x1sE77yAP4bzYRp3jZJzbPTYgFe1DAsCJ/r3kd5K hLjxO9YsMBAzAhcILEp0ktYw4YNkGWmDLzd195tq/9XpvgCiizVdE072fVRQFFnxEmMT M2/uuiL/ZqtMN/7Ofzuo3P4vvRW61snTlSulTiWswKKnM5xhqOvwGnmNrqEkIGtexFph Ex4M9AHxnxngE13qvAKrt0FLx2sJ2aFl//XAP7ZM8wZTuydbIH7DAhCHAygCev+qE/YZ YYRVoFe33oHeQ3KQLR7CK1/gEnMc7ELd5+xh5BG7Q2OXoqCCF4cxM2i18DVUJOZQKu2F ugJg== X-Gm-Message-State: AOAM530uzlUzDWoFIu0W9hkC7rG/h4PCAsl48h7Ke1NziK/D+SWzjnwC ZNBCYfS/t358x+QjnkdatPBHMTAtQ3vCHQ== X-Google-Smtp-Source: ABdhPJy80fjQgDXhz3xIcdkt5K7javEVHoQJSiEQ78BlW1LahnAovdbAUOiUJOonQLiuLM/s284EoQ== X-Received: by 2002:a19:ca04:: with SMTP id a4mr4224838lfg.588.1618600744918; Fri, 16 Apr 2021 12:19:04 -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 h1sm1068238lfm.187.2021.04.16.12.19.03 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Apr 2021 12:19:04 -0700 (PDT) From: Marlon Richert Message-Id: <93FFDA3D-3C4A-414E-9220-1032ECE5B04C@gmail.com> Content-Type: multipart/mixed; boundary="Apple-Mail=_E644C560-29E1-4311-B58E-40C603C4878C" Mime-Version: 1.0 (Mac OS X Mail 14.0 \(3654.60.0.2.21\)) Subject: Re: [RFC][PATCH] `newuser` prompt theme Date: Fri, 16 Apr 2021 22:19:03 +0300 In-Reply-To: <20210416171321.GC4535@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> X-Mailer: Apple Mail (2.3654.60.0.2.21) X-Seq: 48604 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=_E644C560-29E1-4311-B58E-40C603C4878C Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On 16 Apr 2021, at 20:13, Daniel Shahaf = wrote: >=20 > Marlon wrote on Fri, Apr 16, 2021 at 19:04:06 +0300: >> Question for Daniel: If you=E2=80=99re going to add sysexits(3) to = PRINT_EXIT_VALUE anyway (workers/48564), should I just get rid of = prompt_vcs_precmd()? Or do you think it still adds value? >=20 > IMO keep that function. We can always simplify that function if and = when > sysexits(3) PRINT_EXIT_VALUE support is added. >=20 > You seem to have sent the patch three times, nested. Which one should > be reviewed? Whoops! Here=E2=80=99s the patch again, but this time just once. --Apple-Mail=_E644C560-29E1-4311-B58E-40C603C4878C 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 f11694bc0260de5d4572fdacb0f41fc748bd7155 Mon Sep 17 00:00:00 2001 From: Marlon Richert Date: Thu, 15 Apr 2021 23:28:56 +0300 Subject: [PATCH] Add customizable `vcs` prompt theme --- Functions/Prompts/prompt_vcs_setup | 227 +++++++++++++++++++++++++++++ 1 file changed, 227 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..66f167f49 --- /dev/null +++ b/Functions/Prompts/prompt_vcs_setup @@ -0,0 +1,227 @@ +## +# 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-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=_E644C560-29E1-4311-B58E-40C603C4878C--