zsh-workers
 help / color / mirror / code / Atom feed
From: Marlon <marlon.richert@gmail.com>
To: Bart Schaefer <schaefer@brasslantern.com>
Cc: Zsh hackers list <zsh-workers@zsh.org>
Subject: Re: [RFC][PATCH] `newuser` prompt theme
Date: Wed, 14 Apr 2021 08:45:11 +0300	[thread overview]
Message-ID: <873D08A9-F321-474A-8440-CCE7DCCBA529@gmail.com> (raw)
In-Reply-To: <CAH+w=7ZBsfiJwC-PYBvOVgrgGmC4RTYt9rRroGiqo_rzVSBJHQ@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 674 bytes --]

On 14 Apr 2021, at 08:17, Bart Schaefer <schaefer@brasslantern.com> wrote:
> 
> On Tue, Apr 13, 2021 at 10:09 PM Marlon Richert
> <marlon.richert@gmail.com> wrote:
>> 
>>> On 13 Apr 2021, at 23:45, Bart Schaefer <schaefer@brasslantern.com> wrote:
>>> 
>>> Is it possible to do that without the massive re-indent of the
>>> existing "case" branches?
>> 
>> Sure. The original indent was an odd number of spaces, though. I thought that didn’t fit the style guide/code conventions?
> 
> Possibly, but we prefer to keep functional changes separate from
> whitespace changes for semantic clarity.

OK, here’s the patch without the reindent. See attachment.


[-- Attachment #2: 0001-Add-newuser-prompt-theme.txt --]
[-- Type: text/plain, Size: 7814 bytes --]

From 86bffc40bdd3676e4f90b8604e68356799fd6e63 Mon Sep 17 00:00:00 2001
From: Marlon Richert <marlon.richert@gmail.com>
Date: Wed, 14 Apr 2021 08:39:51 +0300
Subject: [PATCH] Add `newuser` prompt theme

---
 Functions/Prompts/prompt_newuser_setup | 197 +++++++++++++++++++++++++
 Functions/Prompts/promptinit           |  14 +-
 2 files changed, 206 insertions(+), 5 deletions(-)
 create mode 100644 Functions/Prompts/prompt_newuser_setup

diff --git a/Functions/Prompts/prompt_newuser_setup b/Functions/Prompts/prompt_newuser_setup
new file mode 100644
index 000000000..a4167a8c8
--- /dev/null
+++ b/Functions/Prompts/prompt_newuser_setup
@@ -0,0 +1,197 @@
+autoload -Uz add-zle-hook-widget add-zsh-hook vcs_info
+readonly -gHA _prompt_newuser_formats=(
+    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'
+)
+readonly -ga sysexits=(
+    USAGE
+    DATAERR
+    NOINPUT
+    NOUSER
+    NOHOST
+    UNAVAILABLE
+    SOFTWARE
+    OSERR
+    OSFILE
+    CANTCREAT
+    IOERR
+    TEMPFAIL
+    PROTOCOL
+    NOPERM
+    CONFIG
+)
+
+prompt_newuser_help() {
+  print -r -- \
+"To customize your prompt, copy-paste any of the following to your .zshrc file
+and edit it in there:
+
+  # Start prompt:
+  zstyle ':prompt:*:start' left     ${(q+)_prompt_newuser_formats[start:left]}
+  zstyle ':prompt:*:start' right    ${(q+)_prompt_newuser_formats[start:right]}
+
+  # Prepended to left side of start prompt if we changed dirs:
+  zstyle ':prompt:*:start' chpwd    ${(q+)_prompt_newuser_formats[start:chpwd]}
+
+  # Replaces right side of start prompt when in a repo:
+  zstyle ':prompt:*:start' unstaged ${(q+)_prompt_newuser_formats[start:unstaged]}
+  zstyle ':prompt:*:start' staged   ${(q+)_prompt_newuser_formats[start:staged]}
+  zstyle ':prompt:*:start' branch   ${(q+)_prompt_newuser_formats[start:branch]}
+  zstyle ':prompt:*:start' action   ${(q+)_prompt_newuser_formats[start:action]}
+  zstyle ':prompt:*:start' repo     ${(q+)_prompt_newuser_formats[start:repo]}
+
+  # Continuation prompt:
+  zstyle ':prompt:*:cont' left    ${(q+)_prompt_newuser_formats[cont:left]}
+  zstyle ':prompt:*:cont' right   ${(q+)_prompt_newuser_formats[cont:right]}
+
+  # Used to indent left side of continuation prompt:
+  zstyle ':prompt:*:cont' indent  ${(q+)_prompt_newuser_formats[cont:indent]}
+
+For an explanation of the % codes, see
+http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html and the end of
+http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#vcs_005finfo-Configuration"
+}
+
+prompt_newuser_format() {
+  local ctx=$1 arg fmt out
+  shift
+  for arg; do
+    zstyle -s :prompt:newuser:$ctx $arg fmt ||
+        fmt="$_prompt_newuser_formats[${ctx}:$arg]"
+    out+="$fmt"
+  done
+  print -r -- "$out"
+}
+
+prompt_newuser_chpwd() {
+  emulate -L zsh
+  unset vcs_info_msg_0_
+  PS1="$( prompt_newuser_format start chpwd left )"
+}
+
+prompt_newuser_precmd() {
+  local exitstatus=$?
+  emulate -L zsh
+
+  psvar[1]=
+  case $exitstatus in
+    <128-> )
+      psvar[1]="SIG$signals[exitstatus-127] "
+      ;|
+    <64-78> )
+      psvar[1]="EX_$sysexits[exitstatus-63] "
+      ;|
+    <1-> )
+      psvar[1]+="($exitstatus)"
+  esac
+
+  if ! [[ -v vcs_info_msg_0_ ]]; then
+    zstyle ':vcs_info:*' check-for-staged-changes yes
+    vcs_info
+    if [[ -n $vcs_info_msg_0_ ]]; then
+      RPS1="$vcs_info_msg_0_"
+    else
+      RPS1="$( prompt_newuser_format start right )"
+    fi
+  fi
+}
+
+prompt_newuser_line-init() {
+  emulate -L zsh
+
+  case $CONTEXT in
+    start )
+      local -i fd=-1
+      exec {fd}< <(
+        zstyle ':vcs_info:*' check-for-changes yes
+        vcs_info
+        print -rNC1 -- "$PWD" "${vcs_info_msg_0_}"
+      )
+      zle -Fw "$fd" prompt_newuser_async
+      ;;
+    cont )
+      local fmt="$( prompt_newuser_format cont indent )"
+      local -a indent=( '%('{1..$(( COLUMNS / ${(m)#fmt} ))}"_,$fmt,)" )
+      PS2="${(j::)indent}$( prompt_newuser_format cont left )"
+      RPS2="$( prompt_newuser_format cont right )"
+      ;;
+  esac
+}
+
+prompt_newuser_async() {
+  emulate -L zsh
+  {
+    zle -F "$1"
+
+    [[ $2 != (|hup) ]] &&
+        return
+
+    () {
+      local pwd null
+      IFS=$'\0' read -ru "$1" pwd vcs_info_msg_0_ null
+
+      [[ $pwd == $PWD ]]
+    } "$@" || return
+
+    if [[ -n $vcs_info_msg_0_ ]]; then
+      RPS1="$vcs_info_msg_0_"
+    else
+      RPS1="$( prompt_newuser_format start right )"
+    fi
+    zle .reset-prompt
+
+  } always {
+    exec {1}<&-
+  }
+}
+
+prompt_newuser_line-finish() {
+  emulate -L zsh
+  PS1="$( prompt_newuser_format start left )"
+}
+
+prompt_newuser_setup() {
+  prompt_opts=( cr percent sp )
+
+  zstyle -e ':vcs_info:*' formats '
+    reply=( "%u%c$( prompt_newuser_format start branch repo )" )
+  '
+  zstyle -e ':vcs_info:*' actionformats '
+    reply=( "%u%c$( prompt_newuser_format start action repo )" )
+  '
+  zstyle -e ':vcs_info:*' stagedstr '
+    reply=( "$( prompt_newuser_format start staged )" )
+  '
+  zstyle -e ':vcs_info:*' unstagedstr '
+    reply=( "$( prompt_newuser_format start unstaged )" )
+  '
+  PS4=$'# ?=%(?,%F{green},%B%F{red}%S)%?%b%f%s e=%e %F{green}%1N%f:%I %(1_,%F{yellow}%K{black}%_%f%k ,)'
+  SPROMPT='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='%S%F{cyan}%#%s%f'
+  zle_highlight=(
+      isearch:fg=black,bg=yellow
+      special:fg=cyan,bold
+      region:bg=blue
+      suffix:bg=blue
+      paste:none
+  )
+  zle -N prompt_newuser_async
+
+  add-zsh-hook chpwd  prompt_newuser_chpwd
+  add-zsh-hook precmd prompt_newuser_precmd
+  add-zle-hook-widget line-init   prompt_newuser_line-init
+  add-zle-hook-widget line-finish prompt_newuser_line-finish
+
+  prompt_newuser_chpwd
+}
+
+prompt_newuser_setup "$@"
diff --git a/Functions/Prompts/promptinit b/Functions/Prompts/promptinit
index 37d69f100..b9d833c4b 100644
--- a/Functions/Prompts/promptinit
+++ b/Functions/Prompts/promptinit
@@ -14,6 +14,8 @@ prompt_themes=()
 promptinit () {
   emulate -L zsh
   setopt extendedglob
+  autoload -Uz add-zsh-hook add-zle-hook-widget
+
   local ppath='' name theme
   local -a match mbegin mend
 
@@ -32,9 +34,6 @@ promptinit () {
     fi
   done
 
-  # To manipulate precmd and preexec hooks...
-  autoload -Uz add-zsh-hook
-
   # Variables common to all prompt styles
   prompt_newline=$'\n%{\r%}'
 }
@@ -178,8 +177,13 @@ Use prompt -h <theme> for help on specific themes.'
 
        # Reset some commonly altered bits to the default
        local hook
-       for hook in chpwd precmd preexec periodic zshaddhistory zshexit; do
-         add-zsh-hook -D "${hook}" "prompt_*_${hook}"
+       for hook in chpwd precmd preexec periodic zshaddhistory zshexit \
+           zsh_directory_name; do
+         add-zsh-hook -D "$hook" "prompt_*_$hook"
+       done
+       for hook in isearch-exit isearch-update line-pre-redraw line-init \
+           line-finish history-line-set keymap-select; do
+         add-zle-hook-widget -D "$hook" "prompt_*_$hook"
        done
        typeset -ga zle_highlight=( ${zle_highlight:#default:*} )
        (( ${#zle_highlight} )) || unset zle_highlight
-- 
2.31.1


  reply	other threads:[~2021-04-14  5:45 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-13 19:41 Marlon
2021-04-13 20:31 ` Roman Perepelitsa
2021-04-13 20:44 ` Bart Schaefer
2021-04-14  5:09   ` Marlon Richert
2021-04-14  5:17     ` Bart Schaefer
2021-04-14  5:45       ` Marlon [this message]
2021-04-14 12:05         ` Daniel Shahaf
2021-04-14 13:17           ` Marlon
2021-04-14 14:09             ` Daniel Shahaf
2021-04-15  1:07               ` Bart Schaefer
2021-04-15  3:50               ` Marlon Richert
2021-04-15 20:27                 ` Daniel Shahaf
2021-04-15 23:42                 ` Daniel Shahaf
2021-04-15 11:11               ` Mikael Magnusson
2021-04-15 16:44                 ` vcs_info's global variables (was: Re: [RFC][PATCH] `newuser` prompt theme) Daniel Shahaf
2021-04-16 16:04                 ` [RFC][PATCH] `newuser` prompt theme Marlon
2021-04-16 17:13                   ` Daniel Shahaf
2021-04-16 19:19                     ` Marlon Richert
2021-04-16 19:30                       ` Daniel Shahaf
2021-04-19 16:46                         ` Marlon Richert
2021-05-02 17:18                           ` Lawrence Velázquez
2021-05-03  2:38                             ` Bart Schaefer
2021-05-03  4:11                               ` Lawrence Velázquez
2021-05-03 11:38                                 ` [PATCH] Add customizable `vcs` prompt theme (was Re: [RFC][PATCH] `newuser` prompt theme) Marlon Richert
2021-05-09 18:04                                   ` Lawrence Velázquez
2021-05-31  1:01                                     ` Lawrence Velázquez
2021-06-09 12:58                                       ` Marlon Richert
2021-06-09 13:22                                         ` Roman Perepelitsa
2021-06-09 18:06                                           ` Marlon Richert
2021-06-10  9:30                                             ` Roman Perepelitsa
2021-06-10 13:47                                               ` Marlon Richert
2021-06-10 14:01                                                 ` Marlon Richert
2021-06-10 17:45                                                 ` Roman Perepelitsa
2021-06-20 22:13                                                   ` Marlon Richert
2021-06-23 17:26                                                     ` Roman Perepelitsa
2022-08-08 10:12                                                       ` Marlon Richert
2022-08-08 10:17                                                         ` Roman Perepelitsa
2021-04-14 14:09             ` sysexits.h codes? (was: " Daniel Shahaf
2021-04-30 19:40               ` Marlon Richert
2021-04-30 21:16                 ` Daniel Shahaf
2021-04-30 21:34                   ` Bart Schaefer
2021-05-01 15:09                     ` Daniel Shahaf
2021-04-30 21:40                   ` Bart Schaefer
2021-05-01 13:39                   ` Marlon Richert
2021-05-01 14:43                     ` Daniel Shahaf
2021-05-03 11:36                       ` Marlon Richert
2021-05-03 16:04                         ` Daniel Shahaf
2021-05-04 11:13                           ` Marlon Richert
2021-05-21 11:38                             ` Marlon Richert
2021-04-14 15:30             ` [RFC][PATCH] `newuser` prompt theme Arseny Maslennikov
2021-04-14 18:52               ` Daniel Shahaf
2021-04-14 14:00           ` precmd hooks and $? Bart Schaefer
2021-04-14 15:18             ` docs patches for precmd hooks and $?, and vcs_info Daniel Shahaf
2021-04-15  2:35               ` Bart Schaefer
2021-04-15 16:17               ` Archives render attachments as first-class messages (was: docs patches for precmd hooks and $?, and vcs_info) Daniel Shahaf
2021-04-15 18:54           ` [RFC][PATCH] Reset ZLE hooks when changing prompt themes (was Re: [RFC][PATCH] `newuser` prompt theme) Marlon
2021-04-15 21:34             ` Daniel Shahaf
2021-04-16 22:34               ` Marlon Richert
2021-04-25 16:08                 ` Lawrence Velázquez
2021-05-02 17:03                   ` Lawrence Velázquez
2021-05-02 17:59                 ` Bart Schaefer
2021-05-05  6:10                   ` Marlon Richert
2021-05-16 15:27                     ` Lawrence Velázquez
2021-05-16 19:31                       ` Marlon Richert
2021-05-17  4:19                         ` Bart Schaefer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=873D08A9-F321-474A-8440-CCE7DCCBA529@gmail.com \
    --to=marlon.richert@gmail.com \
    --cc=schaefer@brasslantern.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).