summaryrefslogtreecommitdiff
path: root/Functions
diff options
context:
space:
mode:
Diffstat (limited to 'Functions')
-rw-r--r--Functions/Misc/run-help-ip4
-rw-r--r--Functions/Misc/zed23
-rw-r--r--Functions/Prompts/prompt_bart_setup10
-rw-r--r--Functions/Prompts/prompt_default_setup7
-rw-r--r--Functions/Prompts/prompt_off_setup13
-rw-r--r--Functions/Prompts/prompt_restore_setup2
-rw-r--r--Functions/Prompts/prompt_walters_setup6
-rw-r--r--Functions/Prompts/promptinit120
-rw-r--r--Functions/VCS_Info/Backends/VCS_INFO_get_data_git41
-rw-r--r--Functions/VCS_Info/Backends/VCS_INFO_get_data_hg50
-rw-r--r--Functions/VCS_Info/VCS_INFO_patch2subject17
-rw-r--r--Functions/VCS_Info/VCS_INFO_quilt40
-rw-r--r--Functions/VCS_Info/VCS_INFO_set-patch-format79
-rw-r--r--Functions/VCS_Info/vcs_info1
-rw-r--r--Functions/Zle/bracketed-paste-magic44
-rw-r--r--Functions/Zle/insert-files4
-rw-r--r--Functions/Zle/insert-unicode-char4
-rw-r--r--Functions/Zle/url-quote-magic2
18 files changed, 288 insertions, 179 deletions
diff --git a/Functions/Misc/run-help-ip b/Functions/Misc/run-help-ip
index 740af52b5..8807f9ef1 100644
--- a/Functions/Misc/run-help-ip
+++ b/Functions/Misc/run-help-ip
@@ -19,8 +19,8 @@ while [[ $# != 0 && $1 == -* ]]; do
done
case $1 in
- (addr*) man ip-address ;;
- (addrlabel) man ip-addrlabel ;;
+ (addrl*) man ip-addrlabel ;;
+ (a*) man ip-address ;;
(l2*) man ip-l2tp ;;
(li*) man ip-link ;;
(ma*) man ip-maddress ;;
diff --git a/Functions/Misc/zed b/Functions/Misc/zed
index 77d392bc3..33bd1025b 100644
--- a/Functions/Misc/zed
+++ b/Functions/Misc/zed
@@ -39,6 +39,24 @@ local curcontext=zed:::
zstyle -m ":completion:zed:*" insert-tab '*' ||
zstyle ":completion:zed:*" insert-tab yes
+zmodload zsh/terminfo 2>/dev/null
+
+__zed_pg_up()
+{
+ integer count=$(( LINES / 2 - 1 ))
+ while (( count -- )); do
+ zle up-line
+ done
+}
+
+__zed_pg_down()
+{
+ integer count=$(( LINES / 2 - 1 ))
+ while (( count -- )); do
+ zle down-line
+ done
+}
+
if (( bind )) || ! bindkey -M zed >&/dev/null; then
# Make the zed keymap a copy of the current main.
bindkey -N zed main
@@ -54,6 +72,11 @@ if (( bind )) || ! bindkey -M zed >&/dev/null; then
bindkey -M zed '^x^w' accept-line
bindkey -M zed '^M' self-insert-unmeta
+ zle -N __zed_pg_up
+ zle -N __zed_pg_down
+ [[ ${+terminfo} = 1 && -n "$terminfo[kpp]" ]] && bindkey -M zed "$terminfo[kpp]" __zed_pg_up
+ [[ ${+terminfo} = 1 && -n "$terminfo[knp]" ]] && bindkey -M zed "$terminfo[knp]" __zed_pg_down
+
# Make zed-set-file-name available.
# Assume it's in fpath; there's no error at this point if it isn't
autoload -Uz zed-set-file-name
diff --git a/Functions/Prompts/prompt_bart_setup b/Functions/Prompts/prompt_bart_setup
index cb032de8a..6de412231 100644
--- a/Functions/Prompts/prompt_bart_setup
+++ b/Functions/Prompts/prompt_bart_setup
@@ -16,9 +16,13 @@ prompt_bart_help () {
blue, and the default foreground) are used if no arguments are
given. The defaults look best on a light background.
- The "off" token temporarily disables the theme; "on" restores it.
No background colors or hardwired cursor motion escapes are used,
and it is not necessary to setopt promptsubst.
+
+ The "off" token temporarily disables the theme; "on" restores it.
+ Note, this does NOT fully reset to the original prompt state, it
+ only hides/reveals the extra lines above the command line and
+ removes the supporting hooks.
EOF
[[ $(read -sek 1 "?${(%):-%S[press return]%s}") == [Qq] ]] &&
print -nP '\r%E' && return
@@ -183,7 +187,7 @@ prompt_bart_setup () {
add-zsh-hook -D preexec "prompt_*_preexec"
functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_bart_winch}"
[[ $prompt_theme[1] = bart ]] && PS1=${${(f)PS1}[-1]}
- return 1
+ return 1 # Prevent change of $prompt_theme
;;
(on|enable)
shift
@@ -224,6 +228,8 @@ prompt_bart_setup () {
add-zsh-hook precmd prompt_bart_precmd
add-zsh-hook preexec prompt_bart_preexec
+ prompt_cleanup \
+ 'functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_bart_winch}"'
functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_bart_winch}
prompt_bart_winch"
diff --git a/Functions/Prompts/prompt_default_setup b/Functions/Prompts/prompt_default_setup
new file mode 100644
index 000000000..aed74eb67
--- /dev/null
+++ b/Functions/Prompts/prompt_default_setup
@@ -0,0 +1,7 @@
+PS1='%m%# '
+PS2='%_> '
+PS3='?# '
+PS4='+%N:%i> '
+unset RPS1 RPS2 RPROMPT RPROMPT2
+
+prompt_opts=( cr percent sp )
diff --git a/Functions/Prompts/prompt_off_setup b/Functions/Prompts/prompt_off_setup
index f604b477f..e6d16bfd9 100644
--- a/Functions/Prompts/prompt_off_setup
+++ b/Functions/Prompts/prompt_off_setup
@@ -1,9 +1,10 @@
# Very simple prompt
-prompt_off_setup () {
- PS1="%# "
- PS2="> "
- prompt_opts=( cr percent )
-}
+prompt_default_setup 2>/dev/null
-prompt_off_setup "$@"
+PS1="%# "
+PS2="> "
+PS3='?# '
+PS4='+> '
+
+prompt_opts=( cr percent sp )
diff --git a/Functions/Prompts/prompt_restore_setup b/Functions/Prompts/prompt_restore_setup
new file mode 100644
index 000000000..54c4adbf9
--- /dev/null
+++ b/Functions/Prompts/prompt_restore_setup
@@ -0,0 +1,2 @@
+# Damn that was easy
+zstyle -t :prompt-theme cleanup
diff --git a/Functions/Prompts/prompt_walters_setup b/Functions/Prompts/prompt_walters_setup
index 7948254d8..9fea574d0 100644
--- a/Functions/Prompts/prompt_walters_setup
+++ b/Functions/Prompts/prompt_walters_setup
@@ -14,10 +14,10 @@ EOF
prompt_walters_setup () {
if [[ "$TERM" != "dumb" ]]; then
- PROMPT='%B%(?..[%?] )%b%n@%U%m%u> '
- RPROMPT="%F{${1:-green}}%~%f"
+ PS1='%B%(?..[%?] )%b%n@%U%m%u> '
+ RPS1="%F{${1:-green}}%~%f"
else
- PROMPT="%(?..[%?] )%n@%m:%~> "
+ PS1="%(?..[%?] )%n@%m:%~> "
fi
prompt_opts=(cr percent)
diff --git a/Functions/Prompts/promptinit b/Functions/Prompts/promptinit
index 587248997..e27b8779a 100644
--- a/Functions/Prompts/promptinit
+++ b/Functions/Prompts/promptinit
@@ -47,20 +47,36 @@ prompt_preview_safely() {
return
fi
- local -a psv; psv=($psvar); local -a +h psvar; psvar=($psv) # Ick
- local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1
- local -a precmd_functions preexec_functions
-
- # The next line is a bit ugly. It (perhaps unnecessarily)
- # runs the prompt theme setup function to ensure that if
- # the theme has a _preview function that it's been autoloaded.
- prompt_${1}_setup
-
- if typeset +f prompt_${1}_preview >&/dev/null; then
- prompt_${1}_preview "$@[2,-1]"
- else
- prompt_preview_theme "$@"
- fi
+ # This handles all the stuff from the default :prompt-theme cleanup
+ local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1 RPS2=$RPS2
+ local +h PROMPT=$PROMPT RPROMPT=$RPOMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR
+ local -a precmd_functions preexec_functions prompt_preview_cleanup
+ local -aLl +h zle_highlight
+
+ {
+ # Save and clear current restore-point if any
+ zstyle -g prompt_preview_cleanup :prompt-theme cleanup
+ {
+ zstyle -d :prompt-theme cleanup
+
+ # The next line is a bit ugly. It (perhaps unnecessarily)
+ # runs the prompt theme setup function to ensure that if
+ # the theme has a _preview function that it's been autoloaded.
+ prompt_${1}_setup
+
+ if typeset +f prompt_${1}_preview >&/dev/null; then
+ prompt_${1}_preview "$@[2,-1]"
+ else
+ prompt_preview_theme "$@"
+ fi
+ } always {
+ # Run any theme-specific cleanup, then reset restore point
+ zstyle -t :prompt-theme cleanup
+ }
+ } always {
+ (( $#prompt_preview_cleanup )) &&
+ zstyle -e :prompt-theme cleanup "${prompt_preview_cleanup[@]}"
+ }
}
set_prompt() {
@@ -84,9 +100,9 @@ Use prompt -h <theme> for help on specific themes.'
setopt localtraps
if [[ -z "$prompt_theme[1]" ]]; then
# Not using a prompt theme; save settings
- local -a psv; psv=($psvar); local -a +h psvar; psvar=($psv) # Ick
- local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1
- local precmd_functions preexec_functions
+ local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1 RPS2=$RPS2
+ local +h PROMPT=$PROMPT RPROMPT=$RPOMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR
+ local -a precmd_functions preexec_functions
else
trap 'prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"' 0
fi
@@ -104,11 +120,11 @@ Use prompt -h <theme> for help on specific themes.'
;;
h) if [[ -n "$2" && -n $prompt_themes[(r)$2] ]]; then
if functions prompt_$2_setup >/dev/null; then
- # The next line is a bit ugly. It (perhaps unnecessarily)
- # runs the prompt theme setup function to ensure that if
- # the theme has a _help function that it's been autoloaded.
- prompt_$2_setup
- fi
+ # The next line is a bit ugly. It (perhaps unnecessarily)
+ # runs the prompt theme setup function to ensure that if
+ # the theme has a _help function that it's been autoloaded.
+ prompt_$2_setup
+ fi
if functions prompt_$2_help >/dev/null; then
print "Help for $2 theme:\n"
prompt_$2_help
@@ -168,28 +184,74 @@ Use prompt -h <theme> for help on specific themes.'
esac
}
+prompt_cleanup () {
+ local -a cleanup_hooks
+ if zstyle -g cleanup_hooks :prompt-theme cleanup
+ then
+ cleanup_hooks+=(';' "$@")
+ zstyle -e :prompt-theme cleanup "${cleanup_hooks[@]}"
+ elif (( $+prompt_preview_cleanup == 0 ))
+ then
+ print -u2 "prompt_cleanup: no prompt theme active"
+ return 1
+ fi
+}
+
prompt () {
- local prompt_opts
+ local -a prompt_opts theme_active
+ zstyle -g theme_active :prompt-theme cleanup || {
+ # This is done here rather than in set_prompt so that it
+ # is safe and sane for set_prompt to setopt localoptions,
+ # which will be cleared before we arrive back here again.
+ # This is also why we pass around the prompt_opts array.
+ [[ -o promptbang ]] && prompt_opts+=(bang)
+ [[ -o promptcr ]] && prompt_opts+=(cr)
+ [[ -o promptpercent ]] && prompt_opts+=(percent)
+ [[ -o promptsp ]] && prompt_opts+=(sp)
+ [[ -o promptsubst ]] && prompt_opts+=(subst)
+ zstyle -e :prompt-theme cleanup \
+ 'zstyle -d :prompt-theme cleanup;' \
+ 'prompt_default_setup;' \
+ ${PS1+PS1="${(q)PS1}"} \
+ ${PS2+PS2="${(q)PS2}"} \
+ ${PS3+PS3="${(q)PS3}"} \
+ ${PS4+PS4="${(q)PS4}"} \
+ ${RPS1+RPS1="${(q)RPS1}"} \
+ ${RPS2+RPS2="${(q)RPS2}"} \
+ ${RPROMPT+RPROMPT="${(q)RPROMPT}"} \
+ ${RPROMPT2+RPROMPT2="${(q)RPROMPT2}"} \
+ ${PSVAR+PSVAR="${(q)PSVAR}"} \
+ "precmd_functions=(${(q)precmd_functions[@]})" \
+ "preexec_functions=(${(q)preexec_functions[@]})" \
+ "prompt_opts=( ${prompt_opts[*]} )" \
+ 'reply=(yes)'
+ }
set_prompt "$@"
- (( $#prompt_opts )) &&
- setopt noprompt{bang,cr,percent,subst} "prompt${^prompt_opts[@]}"
+ (( ${#prompt_opts} )) &&
+ setopt noprompt{bang,cr,percent,sp,subst} "prompt${^prompt_opts[@]}"
true
}
prompt_preview_theme () {
emulate -L zsh
- local -a psv; psv=($psvar); local -a +h psvar; psvar=($psv) # Ick
- local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1
- local precmd_functions preexec_functions prompt_opts
- local -aLl +h zle_highlight
+ # Check for proper state handling
+ (( $+prompt_preview_cleanup )) || {
+ prompt_preview_safely "$@"
+ return
+ }
+
+ # Minimal preview for prompts that don't supply one
+ local -a prompt_opts
print -n "$1 theme"
(( $#* > 1 )) && print -n " with parameters \`$*[2,-1]'"
print ":"
prompt_${1}_setup "$@[2,-1]"
+ (( ${#prompt_opts} )) &&
+ setopt noprompt{bang,cr,percent,sp,subst} "prompt${^prompt_opts[@]}"
[[ -n ${precmd_functions[(r)prompt_${1}_precmd]} ]] &&
prompt_${1}_precmd
[[ -o promptcr ]] && print -n $'\r'; :
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
index 63109aa46..f3dd95dcb 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
@@ -120,41 +120,15 @@ VCS_INFO_git_getbranch () {
}
VCS_INFO_git_handle_patches () {
- local git_applied_s git_unapplied_s gitmsg git_all
+ local git_applied_s git_unapplied_s gitmsg
git_patches_applied=(${(Oa)git_patches_applied})
git_patches_unapplied=(${(Oa)git_patches_unapplied})
- (( git_all = ${#git_patches_applied} + ${#git_patches_unapplied} ))
- if VCS_INFO_hook 'gen-applied-string' "${git_patches_applied[@]}"; then
- if (( ${#git_patches_applied} )); then
- git_applied_s=${git_patches_applied[1]}
- else
- git_applied_s=""
- fi
- else
- git_applied_s=${hook_com[applied-string]}
- fi
- hook_com=()
- if VCS_INFO_hook 'gen-unapplied-string' "${git_patches_unapplied[@]}"; then
- git_patches_unapplied=${#git_patches_unapplied}
- else
- git_patches_unapplied=${hook_com[unapplied-string]}
- fi
-
- if (( ${#git_patches_applied} )); then
- zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" patch-format gitmsg || gitmsg="%p (%n applied)"
- else
- zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" nopatch-format gitmsg || gitmsg="no patch applied"
- fi
- hook_com=( applied "${git_applied_s}" unapplied "${git_patches_unapplied}"
- applied-n ${#git_patches_applied} unapplied-n ${#git_patches_unapplied} all-n ${git_all} )
- if VCS_INFO_hook 'set-patch-format' "${gitmsg}"; then
- zformat -f gitmisc "${gitmsg}" "p:${hook_com[applied]}" "u:${hook_com[unapplied]}" \
- "n:${#git_patches_applied}" "c:${#git_patches_unapplied}" "a:${git_all}"
- else
- gitmisc=${hook_com[patch-replace]}
- fi
- hook_com=()
+ VCS_INFO_set-patch-format 'git_patches_applied' 'git_applied_s' \
+ 'git_patches_unapplied' 'git_unapplied_s' \
+ ":vcs_info:${vcs}:${usercontext}:${rrn}" gitmsg \
+ '' ''
+ gitmisc=$REPLY
}
gitdir=${vcs_comm[gitdir]}
@@ -182,7 +156,7 @@ if (( querystaged || queryunstaged )) && \
[[ "$(${vcs_comm[cmd]} rev-parse --is-inside-work-tree 2> /dev/null)" == 'true' ]] ; then
# Default: off - these are potentially expensive on big repositories
if (( queryunstaged )) ; then
- ${vcs_comm[cmd]} diff --no-ext-diff --ignore-submodules=dirty --quiet --exit-code ||
+ ${vcs_comm[cmd]} diff --no-ext-diff --ignore-submodules=dirty --quiet --exit-code 2> /dev/null ||
gitunstaged=1
fi
if (( querystaged )) ; then
@@ -205,6 +179,7 @@ local patchdir=${gitdir}/patches/${gitbranch}
if [[ -d $patchdir ]] && [[ -f $patchdir/applied ]] \
&& [[ -f $patchdir/unapplied ]]
then
+ # stgit
git_patches_applied=(${(f)"$(< "${patchdir}/applied")"})
git_patches_unapplied=(${(f)"$(< "${patchdir}/unapplied")"})
VCS_INFO_git_handle_patches
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
index 69b7db304..d4030125c 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
@@ -13,7 +13,7 @@ local hgbase bmfile branchfile rebasefile dirstatefile mqseriesfile \
hgbmstring hgmqstring applied_string unapplied_string guards_string
local -a hgid_args defrevformat defbranchformat \
- hgbmarks mqpatches mqseries mqguards mqunapplied hgmisc \
+ hgbmarks mqpatches mqguards mqunapplied hgmisc \
i_patchguards i_negguards i_posguards
local -A hook_com
@@ -175,9 +175,6 @@ if zstyle -T ":vcs_info:${vcs}:${usercontext}:${rrn}" get-mq \
# Skip commented lines
[[ ${i_patch} == [[:space:]]#"#"* ]] && continue
- # Keep list of all patches
- mqseries+=( $i_patch )
-
# Separate negative and positive guards to more easily find the
# intersection of active guards with patch guards
i_patchguards=( ${(s: :)i_patchguards} )
@@ -203,50 +200,21 @@ if zstyle -T ":vcs_info:${vcs}:${usercontext}:${rrn}" get-mq \
done < ${mqseriesfile}
fi
- if VCS_INFO_hook 'gen-applied-string' "${mqpatches[@]}"; then
- (( ${#mqpatches} )) && applied_string=${mqpatches[1]}
- else
- applied_string=${hook_com[applied-string]}
- fi
-
- hook_com=()
-
- if VCS_INFO_hook 'gen-unapplied-string' "${mqunapplied[@]}"; then
- unapplied_string=${#mqunapplied}
- else
- unapplied_string=${hook_com[unapplied-string]}
- fi
-
- hook_com=()
-
if VCS_INFO_hook 'gen-mqguards-string' "${mqguards[@]}"; then
guards_string=${(j:,:)mqguards}
+ # TODO: %-escape extra_zformats[g:...] value
else
guards_string=${hook_com[guards-string]}
fi
- if (( ${#mqpatches} )); then
- zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" patch-format \
- hgmqstring || hgmqstring="%p (%n applied)"
- else
- zstyle -s ":vcs_info:${vcs}:${usercontext}:${rrn}" nopatch-format \
- hgmqstring || hgmqstring="no patch applied"
- fi
-
- hook_com=( applied "${applied_string}" unapplied "${unapplied_string}"
- applied-n ${#mqpatches} unapplied-n ${#mqunapplied} all-n ${#mqseries}
- guards "${guards_string}" guards-n ${#mqguards} )
+ local -A extra_hook_com=( guards "${guards_string}" guards-n ${#mqguards} )
+ local -a extra_zformats=( "g:${extra_hook_com[guards]}" "G:${#mqguards}" )
- if VCS_INFO_hook 'set-patch-format' ${qstring}; then
- zformat -f hgmqstring "${hgmqstring}" \
- "p:${hook_com[applied]}" "u:${hook_com[unapplied]}" \
- "n:${#mqpatches}" "c:${#mqunapplied}" "a:${#mqseries}" \
- "g:${hook_com[guards]}" "G:${#mqguards}"
- else
- hgmqstring=${hook_com[patch-replace]}
- fi
-
- hook_com=()
+ VCS_INFO_set-patch-format 'mqpatches' 'applied_string' \
+ 'mqunapplied' 'unapplied_string' \
+ ":vcs_info:${vcs}:${usercontext}:${rrn}" hgmqstring \
+ extra_hook_com extra_zformats
+ hgmqstring=$REPLY
fi
diff --git a/Functions/VCS_Info/VCS_INFO_patch2subject b/Functions/VCS_Info/VCS_INFO_patch2subject
index 583467bc8..e222e8382 100644
--- a/Functions/VCS_Info/VCS_INFO_patch2subject
+++ b/Functions/VCS_Info/VCS_INFO_patch2subject
@@ -1,6 +1,7 @@
# This function takes as an argument a filename of a patch and sets $REPLY to
# a single-line "subject", or unsets it if no subject could be extracted.
{
+ setopt localoptions extendedglob
integer i
integer -r LIMIT=10
local -a lines
@@ -34,6 +35,22 @@
elif [[ ${lines[1]} == '# HG changeset patch' ]] && { needle=${${lines:#([#]*)}[1]}; [[ -n $needle ]] }; then
# Mercurial patch
REPLY=$needle
+ elif [[ ${lines[1]} == "commit "[0-9a-f](#c40) ]] &&
+ [[ ${lines[2]} == "Author:"* && ${lines[3]} == "Date:"* ]] &&
+ (( ! ${+lines[4]} )); then
+ # `git show` output.
+ #
+ # The log message is after the first blank line, so open() the file
+ # again. Also check whether the following line (second line of the
+ # log message itself) is empty.
+ {
+ repeat 4 { IFS= read -r }
+ IFS= read -r needle; needle=${needle#' '}
+ if IFS= read -r; REPLY=${REPLY#' '}; [[ -n $REPLY ]]; then
+ needle+='...'
+ fi
+ } < "$1"
+ REPLY=$needle
elif (( ${+lines[1]} )); then
# The first line of the file is not part of the diff.
REPLY=${lines[1]}
diff --git a/Functions/VCS_Info/VCS_INFO_quilt b/Functions/VCS_Info/VCS_INFO_quilt
index 4c61506cd..381b58489 100644
--- a/Functions/VCS_Info/VCS_INFO_quilt
+++ b/Functions/VCS_Info/VCS_INFO_quilt
@@ -91,7 +91,7 @@ function VCS_INFO_quilt() {
local patches pc tmp qstring root
local -i ret
local context
- local -a applied unapplied all applied_string unapplied_string quiltcommand quilt_env
+ local -a applied unapplied applied_string unapplied_string quiltcommand quilt_env
local -A hook_com
context=":vcs_info:${vcs}.quilt-${mode}:${usercontext}:${rrn}"
@@ -171,41 +171,15 @@ function VCS_INFO_quilt() {
}
fi
- all=( ${(Oa)applied} ${unapplied} )
-
- if VCS_INFO_hook 'gen-applied-string' "${applied[@]}"; then
- if (( ${#applied} )); then
- applied_string=${applied[1]}
- else
- applied_string=""
- fi
- else
- applied_string=${hook_com[applied-string]}
- fi
- hook_com=()
- if VCS_INFO_hook 'gen-unapplied-string' "${unapplied[@]}"; then
- unapplied_string="${#unapplied}"
- else
- unapplied_string=${hook_com[unapplied-string]}
- fi
-
- if (( ${#applied} )); then
- zstyle -s "${context}" patch-format qstring || qstring="%p (%n applied)"
- else
- zstyle -s "${context}" nopatch-format qstring || qstring="no patch applied"
- fi
- hook_com=( applied "${applied_string}" unapplied "${unapplied_string}"
- applied-n ${#applied} unapplied-n ${#unapplied} all-n ${#all} )
- if VCS_INFO_hook 'set-patch-format' ${qstring}; then
- zformat -f qstring "${qstring}" "p:${hook_com[applied]}" "u:${hook_com[unapplied]}" \
- "n:${#applied}" "c:${#unapplied}" "a:${#all}"
- else
- qstring=${hook_com[patch-replace]}
- fi
- hook_com=()
+ VCS_INFO_set-patch-format 'applied' 'applied_string' \
+ 'unapplied' 'unapplied_string' \
+ ${context} qstring \
+ '' ''
+ qstring=$REPLY
case ${mode} in
(standalone)
+ backend_misc[patches]=${qstring}
VCS_INFO_formats '' '' "${root}" '' '' '' "${qstring}"
VCS_INFO_set
;;
diff --git a/Functions/VCS_Info/VCS_INFO_set-patch-format b/Functions/VCS_Info/VCS_INFO_set-patch-format
new file mode 100644
index 000000000..cdf2d303e
--- /dev/null
+++ b/Functions/VCS_Info/VCS_INFO_set-patch-format
@@ -0,0 +1,79 @@
+# This function is the common guts of the gen-applied-string /
+# gen-unapplied-string / set-patch-format dance of several backends.
+#
+# Parameters:
+# $1 - name of an array parameter to be the argument to gen-applied-string
+# $2 - name of a parameter to store the applied-string in
+# $3 - name of an array parameter to be the argument to gen-unapplied-string
+# $4 - name of a parameter to store the unapplied-string in
+# $5 - context argument for use in zstyle getters
+# $6 - name of a parameter to store a patch-format format string in
+# $7 - name of an assoc parameter with extra $hook_com key-value pairs for the
+# set-patch-format hook invocation, or '' for none
+# $8 - name of an array parameter with extra arguments for the patch-format zformat call, or '' for empty
+#
+# The expanded patch-format string is returned in $REPLY.
+#
+# Output:
+# - $hook_com is overwritten and the keys 'applied', 'applied-n',
+# 'unapplied', 'unapplied-n', 'all-n' are set.
+{
+ local applied_needs_escaping='unknown'
+ local unapplied_needs_escaping='unknown'
+ if VCS_INFO_hook 'gen-applied-string' "${(@P)1}"; then
+ if (( ${(P)#1} )); then
+ REPLY=${(P)1[1]}
+ else
+ REPLY=""
+ fi
+ applied_needs_escaping='yes'
+ else
+ REPLY=${hook_com[applied-string]}
+ fi
+ : ${(P)2::=$REPLY}
+ hook_com=()
+
+ if VCS_INFO_hook 'gen-unapplied-string' "${(@P)3}"; then
+ REPLY=${(P)#3}
+ unapplied_needs_escaping='yes'
+ else
+ REPLY=${hook_com[unapplied-string]}
+ fi
+ : ${(P)4::=$REPLY}
+ hook_com=()
+
+ if (( ${(P)#1} )); then
+ zstyle -s "${5}" patch-format REPLY || REPLY="%p (%n applied)"
+ else
+ zstyle -s "${5}" nopatch-format REPLY || REPLY="no patch applied"
+ fi
+ : ${(P)6::=$REPLY}
+
+ hook_com=(
+ applied-n ${(P)#1}
+ applied "${(P)2}"
+ unapplied-n ${(P)#3}
+ unapplied "${(P)4}"
+ )
+ hook_com[all-n]=$(( ${hook_com[applied-n]} + ${hook_com[unapplied-n]} ))
+ hook_com+=( ${7:+"${(@kvP)7}"} )
+ if VCS_INFO_hook 'set-patch-format' "${(P)6}"; then
+ # Escape the value for use in $PS1
+ if [[ $applied_needs_escaping == 'yes' ]]; then
+ hook_com[applied]=${hook_com[applied]//'%'/%%}
+ fi
+ if [[ $unapplied_needs_escaping == 'yes' ]]; then
+ hook_com[unapplied]=${hook_com[unapplied]//'%'/%%}
+ fi
+
+ zformat -f REPLY "${(P)6}" "p:${hook_com[applied]}" "u:${hook_com[unapplied]}" \
+ "n:${hook_com[applied-n]}" "c:${hook_com[unapplied-n]}" \
+ "a:${hook_com[all-n]}" \
+ ${8:+"${(@P)8}"}
+ else
+ unset applied_needs_escaping unapplied_needs_escaping # the hook deals with escaping
+ REPLY=${hook_com[patch-replace]}
+ fi
+ hook_com=()
+
+}
diff --git a/Functions/VCS_Info/vcs_info b/Functions/VCS_Info/vcs_info
index 24ae98e52..4e9ac6c6a 100644
--- a/Functions/VCS_Info/vcs_info
+++ b/Functions/VCS_Info/vcs_info
@@ -21,6 +21,7 @@ static_functions=(
VCS_INFO_get_cmd
VCS_INFO_hexdump
VCS_INFO_hook
+ VCS_INFO_set-patch-format
VCS_INFO_maxexports
VCS_INFO_nvcsformats
VCS_INFO_patch2subject
diff --git a/Functions/Zle/bracketed-paste-magic b/Functions/Zle/bracketed-paste-magic
index c46f741d5..4baae823e 100644
--- a/Functions/Zle/bracketed-paste-magic
+++ b/Functions/Zle/bracketed-paste-magic
@@ -145,27 +145,26 @@ bracketed-paste-magic() {
done
fi
- # Save context, create a clean slate for the paste
- integer bpm_mark=$MARK bpm_cursor=$CURSOR bpm_region=$REGION_ACTIVE
- integer bpm_numeric=${NUMERIC:-1}
- local bpm_buffer=$BUFFER
- fc -p -a /dev/null 0 0
- BUFFER=
-
zstyle -a :bracketed-paste-magic inactive-keys bpm_inactive
if zstyle -s :bracketed-paste-magic active-widgets bpm_active '|'; then
- # There are active widgets. Reprocess $PASTED as keystrokes.
- NUMERIC=1
- zle -U - $PASTED
-
+ # Save context, create a clean slate for the paste
+ integer bpm_mark=$MARK bpm_region=$REGION_ACTIVE
+ integer bpm_numeric=${NUMERIC:-1}
+ integer bpm_limit=$UNDO_LIMIT_NO bpm_undo=$UNDO_CHANGE_NO
+ zle .split-undo
+ UNDO_LIMIT_NO=$UNDO_CHANGE_NO
+ BUFFER=
+ CURSOR=1
+ fc -p -a /dev/null 0 0
if [[ $bmp_keymap = vicmd ]]; then
zle -K viins
fi
+ # There are active widgets. Reprocess $PASTED as keystrokes.
+ NUMERIC=1
+ zle -U - $PASTED
+
# Just in case there are active undo widgets
- zle .split-undo
- integer bpm_limit=$UNDO_LIMIT_NO bpm_undo=$UNDO_CHANGE_NO
- UNDO_LIMIT_NO=$UNDO_CHANGE_NO
while [[ -n $PASTED ]] && zle .read-command; do
PASTED=${PASTED#$KEYS}
@@ -183,21 +182,16 @@ bracketed-paste-magic() {
done
PASTED=$BUFFER
- # Reset the undo state
+ # Restore state
+ zle -K $bpm_keymap
+ fc -P
+ MARK=$bpm_mark
+ REGION_ACTIVE=$bpm_region
+ NUMERIC=$bpm_numeric
zle .undo $bpm_undo
UNDO_LIMIT_NO=$bpm_limit
-
- zle -K $bpm_keymap
fi
- # Restore state
- BUFFER=$bpm_buffer
- MARK=$bpm_mark
- CURSOR=$bpm_cursor
- REGION_ACTIVE=$bpm_region
- NUMERIC=$bpm_numeric
- fc -P
-
# PASTED has been updated, run the paste-finish functions
if zstyle -a :bracketed-paste-magic paste-finish bpm_hooks; then
for bpm_func in $bpm_hooks; do
diff --git a/Functions/Zle/insert-files b/Functions/Zle/insert-files
index 10f90ed4a..2d13d82d2 100644
--- a/Functions/Zle/insert-files
+++ b/Functions/Zle/insert-files
@@ -12,7 +12,7 @@ setopt nobadpattern
local key str files
-files=( *(N) )
+files=( *(N:q) )
if (( $#files )); then
zle -R "files: ${str}_" "$files[@]"
else
@@ -26,7 +26,7 @@ while [[ '#key' -ne '#\\r' && '#key' -ne '#\\n' &&
else
str="$str$key"
fi
- eval "files=( \${~str}*(N) )"
+ eval "files=( \${~str}*(N:q) )"
if (( $#files )); then
zle -R "files: ${str}_" "$files[@]"
else
diff --git a/Functions/Zle/insert-unicode-char b/Functions/Zle/insert-unicode-char
index af9aad914..b943fb7f7 100644
--- a/Functions/Zle/insert-unicode-char
+++ b/Functions/Zle/insert-unicode-char
@@ -12,11 +12,11 @@ then
local -i 16 -Z 10 arg=$NUMERIC
# ...and use print to turn this into a Unicode character.
LBUFFER+="$(print -n "\U${arg##0x}")"
- _insert_unicode_ready=0
+ integer -g _insert_unicode_ready=0
else
# Set the base to 16...
zle argument-base 16
# ...wait for user to type hex keys then call this widget again.
zle universal-argument
- _insert_unicode_ready=1
+ integer -g _insert_unicode_ready=1
fi
diff --git a/Functions/Zle/url-quote-magic b/Functions/Zle/url-quote-magic
index 7ee281ea4..cb7bf727a 100644
--- a/Functions/Zle/url-quote-magic
+++ b/Functions/Zle/url-quote-magic
@@ -10,7 +10,7 @@
# As of zsh-5.1, the following may also be necessary in order to apply
# quoting to copy-pasted URLs:
-# autload -Uz bracketed-paste-magic
+# autoload -Uz bracketed-paste-magic
# zle -N bracketed-paste bracketed-paste-magic
# See also backward-extend-paste in bracketed-paste-magic source file.