mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-24 17:00:32 +02:00
users/15738: better cursor positioning in modify-current-argument
This commit is contained in:
parent
f5b07d4868
commit
2c31feef4d
2 changed files with 39 additions and 10 deletions
|
|
@ -1,3 +1,8 @@
|
||||||
|
2011-02-11 Peter Stephenson <p.w.stephenson@ntlworld.com>
|
||||||
|
|
||||||
|
* users/15738: Functions/Zle/modify-current-argument: better
|
||||||
|
positioning of the cursor after the operation.
|
||||||
|
|
||||||
2011-02-11 Frank Terbeck <ft@bewatermyfriend.org>
|
2011-02-11 Frank Terbeck <ft@bewatermyfriend.org>
|
||||||
|
|
||||||
* Lennart Weller: 28739:
|
* Lennart Weller: 28739:
|
||||||
|
|
@ -14187,5 +14192,5 @@
|
||||||
|
|
||||||
*****************************************************
|
*****************************************************
|
||||||
* This is used by the shell to define $ZSH_PATCHLEVEL
|
* This is used by the shell to define $ZSH_PATCHLEVEL
|
||||||
* $Revision: 1.5194 $
|
* $Revision: 1.5195 $
|
||||||
*****************************************************
|
*****************************************************
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
setopt localoptions noksharrays multibyte
|
setopt localoptions noksharrays multibyte
|
||||||
|
|
||||||
local -a reply
|
local -a reply
|
||||||
integer REPLY REPLY2
|
integer REPLY REPLY2 fromend endoffset
|
||||||
|
|
||||||
autoload -Uz split-shell-arguments
|
autoload -Uz split-shell-arguments
|
||||||
split-shell-arguments
|
split-shell-arguments
|
||||||
|
|
@ -30,6 +30,13 @@ if (( REPLY & 1 )); then
|
||||||
(( REPLY2 = ${#reply[REPLY]} + 1 ))
|
(( REPLY2 = ${#reply[REPLY]} + 1 ))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Work out offset from end of string
|
||||||
|
(( fromend = $REPLY2 - ${#reply[REPLY]} - 1 ))
|
||||||
|
if (( fromend >= -1 )); then
|
||||||
|
# Cursor is near the end of the word, we'll try to keep it there.
|
||||||
|
endoffset=1
|
||||||
|
fi
|
||||||
|
|
||||||
# Length of all characters before current.
|
# Length of all characters before current.
|
||||||
# Force use of character (not index) counting and join without IFS.
|
# Force use of character (not index) counting and join without IFS.
|
||||||
integer wordoff="${(cj..)#reply[1,REPLY-1]}"
|
integer wordoff="${(cj..)#reply[1,REPLY-1]}"
|
||||||
|
|
@ -37,15 +44,32 @@ integer wordoff="${(cj..)#reply[1,REPLY-1]}"
|
||||||
# Replacement for current word. This could do anything to ${reply[REPLY]}.
|
# Replacement for current word. This could do anything to ${reply[REPLY]}.
|
||||||
local ARG="${reply[REPLY]}" repl
|
local ARG="${reply[REPLY]}" repl
|
||||||
eval repl=\"$1\"
|
eval repl=\"$1\"
|
||||||
|
|
||||||
|
if (( !endoffset )) && [[ ${repl[fromend,-1]} = ${ARG[fromend,-1]} ]]; then
|
||||||
|
# If the part of the string from here to the end hasn't changed,
|
||||||
|
# leave the cursor this distance from the end instead of the beginning.
|
||||||
|
endoffset=1
|
||||||
|
fi
|
||||||
|
|
||||||
# New line: all words before and after current word, with
|
# New line: all words before and after current word, with
|
||||||
# no additional spaces since we've already got the whitespace
|
# no additional spaces since we've already got the whitespace
|
||||||
# and the replacement word in the middle.
|
# and the replacement word in the middle.
|
||||||
BUFFER="${(j..)reply[1,REPLY-1]}${repl}${(j..)reply[REPLY+1,-1]}"
|
local left="${(j..)reply[1,REPLY-1]}${repl}"
|
||||||
|
local right="${(j..)reply[REPLY+1,-1]}"
|
||||||
|
|
||||||
# Keep cursor at same position in replaced word.
|
if [[ endoffset -ne 0 && ${#repl} -ne 0 ]]; then
|
||||||
# Redundant here, but useful if $repl changes the length.
|
# Place cursor relative to end.
|
||||||
# Limit to the next position after the end of the word.
|
LBUFFER="$left"
|
||||||
integer repmax=$(( ${#repl} + 1 ))
|
RBUFFER="$right"
|
||||||
# Remember CURSOR starts from offset 0 for some reason, so
|
(( CURSOR += fromend ))
|
||||||
# subtract 1 from positions.
|
else
|
||||||
(( CURSOR = wordoff + (REPLY2 > repmax ? repmax : REPLY2) - 1 ))
|
BUFFER="$left$right"
|
||||||
|
|
||||||
|
# Keep cursor at same position in replaced word.
|
||||||
|
# Redundant here, but useful if $repl changes the length.
|
||||||
|
# Limit to the next position after the end of the word.
|
||||||
|
integer repmax=$(( ${#repl} + 1 ))
|
||||||
|
# Remember CURSOR starts from offset 0 for some reason, so
|
||||||
|
# subtract 1 from positions.
|
||||||
|
(( CURSOR = wordoff + (REPLY2 > repmax ? repmax : REPLY2) - 1 ))
|
||||||
|
fi
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue