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:
parent
8abe1496fb
commit
2ed3b84fa6
2 changed files with 45 additions and 9 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue