zshrc: Fix mistakes in grml_theme_add_token() help output
[grml-etc-core.git] / etc / zsh / zshrc
index 317c9c7..62ba2e2 100644 (file)
@@ -1408,7 +1408,7 @@ function prompt_grml-large_help () {
     The main difference is the default value of the \`items' style. In
     particular, this theme uses _two_ lines instead of one with the plain
     \`grml' theme. The rest behaves exactly the same. Here are the defaults
-    for \`grml-chroot':
+    for \`grml-large':
 
         - left: rc jobs history shell-level change-root time date newline user
                 at host path vcs percent
@@ -1440,7 +1440,8 @@ function prompt_grml-large_setup () {
 # matter by using zsh's `zstyle' mechanism.
 typeset -gA grml_prompt_pre_default \
             grml_prompt_post_default \
-            grml_prompt_token_default
+            grml_prompt_token_default \
+            grml_prompt_token_function
 
 grml_prompt_pre_default=(
     at                ''
@@ -1495,7 +1496,7 @@ grml_prompt_token_default=(
     jobs              '[%j running job(s)] '
     newline           $'\n'
     path              '%40<..<%~%<< '
-    percent           '% # '
+    percent           '%# '
     rc                '%(?..%? )'
     rc-always         '%?'
     sad-smiley        '%(?..:()'
@@ -1505,6 +1506,110 @@ grml_prompt_token_default=(
     vcs               '0'
 )
 
+function GRML_theme_add_token_usage () {
+    cat <<__EOF__
+  Usage: grml_theme_add_token <name> [-f|-i] <token/function> [<pre> <post>]
+
+    <name> is the name for the newly added token. If the \`-f' or \`-i' options
+    are used, <token/function> is the name of the function (see below for
+    details). Otherwise it is the literal token string to be used. <pre> and
+    <post> are optional.
+
+  Options:
+
+    -f <function>   Use a function named \`<function>' each time the token
+                    is to be expanded.
+
+    -i <function>   Use a function named \`<function>' to initialise the
+                    value of the token _once_ at runtime.
+
+    The functions are called with one argument: the token's new name. The
+    return value is expected in the \$REPLY parameter. The use of these
+    options is mutually exclusive.
+
+  Example:
+
+    To add a new token \`day' that expands to the current weekday in the
+    current locale in green foreground colour, use this:
+
+      grml_theme_add_token day '%D{%A}' '%F{green}' '%f'
+
+    Another example would be support for \$VIRTUAL_ENV:
+
+      function virtual_env_prompt () {
+        REPLY=\${VIRTUAL_ENV+\${VIRTUAL_ENV:t} }
+      }
+      grml_theme_add_token virtual-env -f virtual_env_prompt
+
+    After that, you will be able to use a changed \`items' style to
+    assemble your prompt.
+__EOF__
+}
+
+function grml_theme_add_token () {
+    emulate -L zsh
+    local name token pre post
+    local -i init funcall
+
+    if (( ARGC == 0 )); then
+        GRML_theme_add_token_usage
+        return 0
+    fi
+
+    init=0
+    funcall=0
+    pre=''
+    post=''
+    name=$1
+    shift
+    if [[ $1 == '-f' ]]; then
+        funcall=1
+        shift
+    elif [[ $1 == '-i' ]]; then
+        init=1
+        shift
+    fi
+
+    if (( ARGC == 0 )); then
+        printf '
+grml_theme_add_token: No token-string/function-name provided!\n\n'
+        GRML_theme_add_token_usage
+        return 1
+    fi
+    token=$1
+    shift
+    if (( ARGC != 0 && ARGC != 2 )); then
+        printf '
+grml_theme_add_token: <pre> and <post> need to by specified _both_!\n\n'
+        GRML_theme_add_token_usage
+        return 1
+    fi
+    if (( ARGC )); then
+        pre=$1
+        post=$2
+        shift 2
+    fi
+
+    if (( ${+grml_prompt_token_default[$name]} )); then
+        printf '
+grml_theme_add_token: Token `%s'\'' exists! Giving up!\n\n' $name
+        GRML_theme_add_token_usage
+        return 2
+    fi
+    if (( init )); then
+        $token $name
+        token=$REPLY
+    fi
+    grml_prompt_pre_default[$name]=$pre
+    grml_prompt_post_default[$name]=$post
+    if (( funcall )); then
+        grml_prompt_token_function[$name]=$token
+        grml_prompt_token_default[$name]=23
+    else
+        grml_prompt_token_default[$name]=$token
+    fi
+}
+
 function grml_typeset_and_wrap () {
     emulate -L zsh
     local target="$1"
@@ -1535,7 +1640,11 @@ function grml_prompt_addto () {
         zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" token new \
             || new=${grml_prompt_token_default[$it]}
         typeset -g "${target}=${(P)target}${apre}"
-        case $it in
+        if (( ${+grml_prompt_token_function[$it]} )); then
+            ${grml_prompt_token_function[$it]} $it
+            typeset -g "${target}=${(P)target}${REPLY}"
+        else
+            case $it in
             battery)
                 grml_typeset_and_wrap $target $new '' ''
                 ;;
@@ -1558,7 +1667,8 @@ function grml_prompt_addto () {
                 fi
                 ;;
             *) typeset -g "${target}=${(P)target}${new}" ;;
-        esac
+            esac
+        fi
         typeset -g "${target}=${(P)target}${apost}"
     done
 }
@@ -1729,7 +1839,7 @@ function grml_control_xterm_title () {
 }
 
 zrcautoload add-zsh-hook || add-zsh-hook () { :; }
-if [[ $NOPRECMD -gt 0 ]]; then
+if [[ $NOPRECMD -eq 0 ]]; then
     add-zsh-hook precmd grml_reset_screen_title
     add-zsh-hook precmd grml_vcs_to_screen_title
     add-zsh-hook preexec grml_maintain_name
@@ -1773,15 +1883,15 @@ fi
 
 # do we have GNU ls with color-support?
 if [[ "$TERM" != dumb ]]; then
-    #a1# execute \kbd{@a@}:\quad ls with colors
+    #a1# List files with colors (\kbd{ls -b -CF \ldots})
     alias ls='ls -b -CF '${ls_options:+"${ls_options[*]}"}
-    #a1# execute \kbd{@a@}:\quad list all files, with colors
+    #a1# List all files, with colors (\kbd{ls -la \ldots})
     alias la='ls -la '${ls_options:+"${ls_options[*]}"}
-    #a1# long colored list, without dotfiles (@a@)
+    #a1# List files with long colored list, without dotfiles (\kbd{ls -l \ldots})
     alias ll='ls -l '${ls_options:+"${ls_options[*]}"}
-    #a1# long colored list, human readable sizes (@a@)
+    #a1# List files with long colored list, human readable sizes (\kbd{ls -hAl \ldots})
     alias lh='ls -hAl '${ls_options:+"${ls_options[*]}"}
-    #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
+    #a1# List files with long colored list, append qualifier to filenames (\kbd{ls -lF \ldots})\\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
     alias l='ls -lF '${ls_options:+"${ls_options[*]}"}
 else
     alias ls='ls -b -CF'
@@ -2365,7 +2475,7 @@ alias help-zshglob=H-Glob
 HELP_LINES_PER_PAGE=20
 #v1# set location of help-zle cache file
 HELP_ZLE_CACHE_FILE=~/.cache/zsh_help_zle_lines.zsh
-#f1# helper function for help-zle, actually generates the help text
+# helper function for help-zle, actually generates the help text
 help_zle_parse_keybindings()
 {
     emulate -L zsh
@@ -2466,7 +2576,7 @@ help_zle_parse_keybindings()
 typeset -g help_zle_sln
 typeset -g -a help_zle_lines
 
-#f1# Provides (partially autogenerated) help on keybindings and the zsh line editor
+# Provides (partially autogenerated) help on keybindings and the zsh line editor
 help-zle()
 {
     emulate -L zsh
@@ -2480,8 +2590,8 @@ help-zle()
     help_zle_sln=$((help_zle_sln + HELP_LINES_PER_PAGE))
     zle -M "${(F)help_zle_lines[sln,help_zle_sln-1]}"
 }
-#k# display help for keybindings and ZLE (cycle pages with consecutive use)
-zle -N help-zle && bindkey '^xz' help-zle
+#k# display help for keybindings and ZLE
+zle -N help-zle && bindkey '^xz' help-zle # note: cycle pages with consecutive use of '^xz'
 
 # grep for running process, like: 'any vim'
 any() {
@@ -2621,6 +2731,7 @@ alias rmcdir='cd ..; rmdir $OLDPWD || cd $OLDPWD'
 
 #a2# ssh with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
 alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
+#a2# scp with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
 alias insecscp='scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
 
 # work around non utf8 capable software in utf environment via $LANG and luit