1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-27 16:50:58 +01:00

36266: preserve emulation and setopt context for init and finish functions, handle vi modes

This commit is contained in:
Barton E. Schaefer 2015-08-21 10:59:00 -07:00
parent 8abe1496fb
commit 2ed3b84fa6
2 changed files with 45 additions and 9 deletions

View file

@ -5,6 +5,9 @@
2015-08-21 Barton E. Schaefer <schaefer@zsh.org> 2015-08-21 Barton E. Schaefer <schaefer@zsh.org>
* 36266: Functions/Zle/bracketed-paste-magic: preserve emulation
and setopt context for init and finish functions, handle vi modes
* 36256: Src/builtin.c: local options should remain in effect * 36256: Src/builtin.c: local options should remain in effect
for "emulate -L" even if additional option settings are applied for "emulate -L" even if additional option settings are applied

View file

@ -40,7 +40,6 @@
# Also looked up in the context :bracketed-paste-magic, these styles # Also looked up in the context :bracketed-paste-magic, these styles
# each are a list of function names. They are executed in widget # each are a list of function names. They are executed in widget
# context but are called as functions (NOT as widgets with "zle name"). # context but are called as functions (NOT as widgets with "zle name").
# They also run in zsh emulation context set by bracketed-paste-magic.
# As with hooks, the functions are called in order until one of them # As with hooks, the functions are called in order until one of them
# returns a nonzero exit status. The parameter PASTED contains the # returns a nonzero exit status. The parameter PASTED contains the
# current state of the pasted text, other ZLE parameters are as usual. # current state of the pasted text, other ZLE parameters are as usual.
@ -68,7 +67,7 @@ zstyle -m :bracketed-paste-magic active-widgets '*' ||
# TODO: rewrite this using match-words-by-style # TODO: rewrite this using match-words-by-style
# #
backward-extend-paste() { backward-extend-paste() {
: emulate -LR zsh # Already set by bracketed-paste-magic emulate -L zsh
integer bep_mark=$MARK bep_region=$REGION_ACTIVE integer bep_mark=$MARK bep_region=$REGION_ACTIVE
if (( REGION_ACTIVE && MARK < CURSOR )); then if (( REGION_ACTIVE && MARK < CURSOR )); then
zle .exchange-point-and-mark zle .exchange-point-and-mark
@ -99,7 +98,7 @@ backward-extend-paste() {
# zstyle :bracketed-paste-magic:finish quote-style none # zstyle :bracketed-paste-magic:finish quote-style none
# #
quote-paste() { quote-paste() {
: emulate -LR zsh # Already set by bracketed-paste-magic emulate -L zsh
local qstyle local qstyle
# If there's a quoting style, be sure .bracketed-paste leaves it alone # If there's a quoting style, be sure .bracketed-paste leaves it alone
zstyle -s :bracketed-paste-magic:finish quote-style qstyle && NUMERIC=1 zstyle -s :bracketed-paste-magic:finish quote-style qstyle && NUMERIC=1
@ -117,16 +116,28 @@ quote-paste() {
# Now the actual function # Now the actual function
bracketed-paste-magic() { bracketed-paste-magic() {
emulate -LR zsh # Fast exit in the vi-mode cut-buffer context
if [[ "$LASTWIDGET" = *vi-set-buffer ]]; then
zle .bracketed-paste
return
fi
# Really necessary to go to this much effort?
local bpm_emulate="$(emulate)" bpm_opts="$-"
emulate -L zsh
local -a bpm_hooks bpm_inactive local -a bpm_hooks bpm_inactive
local PASTED bpm_func bpm_active local PASTED bpm_func bpm_active bpm_keymap=$KEYMAP
# Set PASTED and run the paste-init functions # Set PASTED and run the paste-init functions
zle .bracketed-paste PASTED zle .bracketed-paste PASTED
if zstyle -a :bracketed-paste-magic paste-init bpm_hooks; then if zstyle -a :bracketed-paste-magic paste-init bpm_hooks; then
for bpm_func in $bpm_hooks; do for bpm_func in $bpm_hooks; do
if (( $+functions[$bpm_func] )); then if (( $+functions[$bpm_func] )); then
function () {
emulate -L $bpm_emulate; set -$bpm_opts
$bpm_func || break $bpm_func || break
}
fi fi
done done
fi fi
@ -143,18 +154,37 @@ bracketed-paste-magic() {
# There are active widgets. Reprocess $PASTED as keystrokes. # There are active widgets. Reprocess $PASTED as keystrokes.
NUMERIC=1 NUMERIC=1
zle -U - $PASTED zle -U - $PASTED
if [[ $bmp_keymap = vicmd ]]; then
zle -K viins
fi
# 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 while [[ -n $PASTED ]] && zle .read-command; do
PASTED=${PASTED#$KEYS} PASTED=${PASTED#$KEYS}
if [[ $KEYS = ${(~j:|:)${(b)bpm_inactive}} ]]; then if [[ $KEYS = ${(~j:|:)${(b)bpm_inactive}} ]]; then
zle .self-insert-unmeta zle .self-insert-unmeta
else else
case $REPLY in case $REPLY in
(${~bpm_active}) zle $REPLY;; (${~bpm_active}) function () {
emulate -L $bpm_emulate; set -$bpm_opts
zle $REPLY
};;
(*) zle .self-insert-unmeta;; (*) zle .self-insert-unmeta;;
esac esac
fi fi
done done
PASTED=$BUFFER PASTED=$BUFFER
# Reset the undo state
zle undo $bpm_undo
UNDO_LIMIT_NO=$bpm_limit
zle -K $bpm_keymap
fi fi
# Restore state # Restore state
@ -169,7 +199,10 @@ bracketed-paste-magic() {
if zstyle -a :bracketed-paste-magic paste-finish bpm_hooks; then if zstyle -a :bracketed-paste-magic paste-finish bpm_hooks; then
for bpm_func in $bpm_hooks; do for bpm_func in $bpm_hooks; do
if (( $+functions[$bpm_func] )); then if (( $+functions[$bpm_func] )); then
function () {
emulate -L $bpm_emulate; set -$bpm_opts
$bpm_func || break $bpm_func || break
}
fi fi
done done
fi fi
@ -187,6 +220,6 @@ bracketed-paste-magic() {
} }
# Handle zsh autoloading conventions # Handle zsh autoloading conventions
if [[ $zsh_eval_context = *loadautofunc && ! -o kshautoload ]]; then if [[ "$zsh_eval_context" = *loadautofunc && ! -o kshautoload ]]; then
bracketed-paste-magic "$@" bracketed-paste-magic "$@"
fi fi