From: Oliver Kiddle <okiddle@yahoo.co.uk>
To: zsh-workers@zsh.org
Subject: Re: bug with camel case and delete-whole-word-match function
Date: Thu, 28 Jul 2016 01:05:46 +0200 [thread overview]
Message-ID: <83727.1469660746@hydra.kiddle.eu> (raw)
In-Reply-To: <20160727095421.5c919e22@pwslap01u.europe.root.pri>
Peter wrote:
> OK, we need to check that there actually is a word after the cursor, as
> we should also do before setting is-word-start.
Thanks. That now works nicely.
Attached patch adjusts select-word-match to take advantage of this.
I've also updated zstyle completion slightly for the word-style and
word-class styles. The documentation seems a bit confusing in the way it
mixes "normal" and "standard" and there might be an error there. I have
adjusted the word-context example for what looks like an error to me.
I've also now had a chance to experiment with select-word-match. I
had previously used select-bracketed for directory components and
lists using i/ a/ i, and a, etc. For things that are essentially
list separators, select-word-match works better because it can grab
the first and last components of a list and the a forms such as a/
will grab just one surrounding / rather than both. Unfortunately,
for the last component of a path, it'll grab the following whitespace
rather than the preceding slash but we can perhaps add a style for
patterns specifying preferred whitespace. That might have other
uses like prefering preceding whitespace over a following newline.
Oliver
diff --git a/Completion/Zsh/Command/_zstyle b/Completion/Zsh/Command/_zstyle
index 9a6d618..20ff47f 100644
--- a/Completion/Zsh/Command/_zstyle
+++ b/Completion/Zsh/Command/_zstyle
@@ -173,6 +173,7 @@ styles=(
url-seps e:
whence e:
word-chars e:
+ word-class e:
word-style e:word-style
word-context e:
@@ -241,11 +242,13 @@ while (( $#state )); do
case "$state[1]" in
(contexts)
if [[ ! -prefix :*: ]]; then
- _wanted contexts expl context compadd -P : -qS : completion vcs_info zftp
+ _wanted contexts expl context compadd -P : -qS : chpwd completion vcs_info zftp zle
elif compset -P :completion:; then
contexts=( functions _completers cmdorcont argument tag )
elif compset -P :vcs_info:; then
contexts=( vcs-string user-context repo-root-name )
+ elif compset -P :zle:; then
+ _wanted widgets expl widget _widgets -qS :
fi
if (( $#contexts )); then
for ostate in $contexts; do
@@ -521,7 +524,7 @@ while (( $#state )); do
;;
(word-style)
- _wanted word-styles expl 'word style' compadd normal shell space
+ _wanted word-styles expl 'word style' compadd {normal,specified,unspecified,shell,whitespace}-subword
;;
(vcs-string)
diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo
index 8db7395..00ed080 100644
--- a/Doc/Zsh/contrib.yo
+++ b/Doc/Zsh/contrib.yo
@@ -2105,7 +2105,7 @@ Here are some examples of use of the tt(word-context) style to extend
the context.
example(zstyle ':zle:*' word-context \
- "*/*" file "[[:space:]]" whitespace
+ "*/*" filename "[[:space:]]" whitespace
zstyle ':zle:transpose-words:whitespace' word-style shell
zstyle ':zle:transpose-words:filename' word-style normal
zstyle ':zle:transpose-words:filename' word-chars '')
diff --git a/Functions/Zle/select-word-match b/Functions/Zle/select-word-match
index 24620c9..8440852 100644
--- a/Functions/Zle/select-word-match
+++ b/Functions/Zle/select-word-match
@@ -12,7 +12,7 @@ emulate -L zsh
setopt extendedglob
local curcontext=:zle:$WIDGET
-local -a matched_words
+local -A matched_words
# Start and end of range of characters
integer pos1 pos2 num=${NUMERIC:-1}
local style word
@@ -28,10 +28,10 @@ while (( num-- )); do
if (( MARK > CURSOR )); then
# if cursor is at the start of the selection, just move back a word
match-words-by-style
- if [[ $style = i && -n $matched_words[3] ]]; then
- word=$matched_words[3]
+ if [[ $style = i && -n $matched_words[ws-before-cursor] ]]; then
+ word=$matched_words[ws-before-cursor]
else
- word=$matched_words[2]$matched_words[3]
+ word=$matched_words[word-before-cursor]$matched_words[ws-before-cursor]
fi
if [[ -n $word ]]; then
(( CURSOR -= ${#word} ))
@@ -43,41 +43,40 @@ while (( num-- )); do
(( CURSOR+1 == $#BUFFER )) && return 1
(( CURSOR++ ))
match-words-by-style
- if [[ -n $matched_words[4] ]]; then
+ if [[ -n $matched_words[ws-after-cursor] ]]; then
if [[ $style = i ]]; then
# just skip the whitespace
- word=$matched_words[4]
+ word=$matched_words[ws-after-cursor]
else
# skip the whitespace plus word
- word=$matched_words[4]$matched_words[5]
+ word=$matched_words[ws-after-cursor]$matched_words[word-after-cursor]
fi
else
if [[ $style = i ]]; then
# skip the word
- word=$matched_words[5]
+ word=$matched_words[word-after-cursor]
else
# skip word and following whitespace
- word=$matched_words[5]$matched_words[6]
+ word=$matched_words[word-after-cursor]$matched_words[ws-after-word]
fi
fi
(( CURSOR += ${#word} - 1 ))
else
match-words-by-style
- if [[ -n "${matched_words[3]}" ]]; then
- # There's whitespace before the cursor, so the word we are selecting
- # starts at the cursor position.
+ if (( ${matched_words[is-word-start]} )); then
+ # The word we are selecting starts at the cursor position.
pos1=$CURSOR
else
# No whitespace before us, so select any wordcharacters there.
- pos1="${#matched_words[1]}"
+ pos1="${#matched_words[start]}"
fi
- if [[ -n "${matched_words[4]}" ]]; then
- if [[ -n "${matched_words[3]}" ]] || (( CURSOR == 0 )); then
+ if [[ -n "${matched_words[ws-after-cursor]}" ]]; then
+ if [[ -n "${matched_words[ws-before-cursor]}" ]] || (( CURSOR == 0 )); then
# whitespace either side, select it
- (( pos1 = CURSOR - ${#matched_words[3]} ))
- (( pos2 = CURSOR + ${#matched_words[4]} ))
+ (( pos1 = CURSOR - ${#matched_words[ws-before-cursor]} ))
+ (( pos2 = CURSOR + ${#matched_words[ws-after-cursor]} ))
else
# There's whitespace at the cursor position, so only select
# up to the cursor position.
@@ -86,28 +85,28 @@ while (( num-- )); do
else
# No whitespace at the cursor position, so select the
# current character and any following wordcharacters.
- (( pos2 = CURSOR + ${#matched_words[5]} ))
+ (( pos2 = CURSOR + ${#matched_words[word-after-cursor]} ))
fi
if [[ $style = a ]]; then
- if [[ -n "${matched_words[4]}" && ( -n "${matched_words[3]}" || CURSOR -eq 0 ) ]]; then
+ if [[ -n "${matched_words[ws-after-cursor]}" && ( -n "${matched_words[ws-before-cursor]}" || CURSOR -eq 0 ) ]]; then
# in the middle of whitespace so grab a word
- if [[ -n "${matched_words[5]}" ]]; then
- (( pos2 += ${#matched_words[5]} )) # preferably the one after
+ if [[ -n "${matched_words[word-after-cursor]}" ]]; then
+ (( pos2 += ${#matched_words[word-after-cursor]} )) # preferably the one after
else
- (( pos1 -= ${#matched_words[2]} )) # otherwise the one before
+ (( pos1 -= ${#matched_words[word-before-cursor]} )) # otherwise the one before
fi
- elif [[ -n "${matched_words[6]}" ]]; then
- (( pos2 += ${#matched_words[6]} ))
- elif [[ -n "${matched_words[3]}" ]]; then
+ elif [[ -n "${matched_words[ws-after-word]}" ]]; then
+ (( pos2 += ${#matched_words[ws-after-word]} ))
+ elif [[ -n "${matched_words[ws-before-cursor]}" ]]; then
# couldn't grab whitespace forwards so try backwards
- (( pos1 -= ${#matched_words[3]} ))
+ (( pos1 -= ${#matched_words[ws-before-cursor]} ))
elif (( pos1 > 0 )); then
# There might have been whitespace before the word
(( CURSOR = pos1 ))
match-words-by-style
- if [[ -n "${matched_words[3]}" ]]; then
- (( pos1 -= ${#matched_words[3]} ))
+ if [[ -n "${matched_words[ws-before-cursor]}" ]]; then
+ (( pos1 -= ${#matched_words[ws-before-cursor]} ))
fi
fi
fi
next prev parent reply other threads:[~2016-07-27 23:12 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <588168129.3340906.1467709726474.JavaMail.yahoo.ref@mail.yahoo.com>
2016-07-05 9:08 ` Oliver Kiddle
2016-07-05 10:19 ` Peter Stephenson
2016-07-05 16:12 ` Bart Schaefer
2016-07-05 16:28 ` Peter Stephenson
2016-07-23 23:06 ` Oliver Kiddle
2016-07-24 19:44 ` Peter Stephenson
2016-07-26 13:52 ` Peter Stephenson
2016-07-26 18:22 ` Oliver Kiddle
2016-07-27 8:54 ` Peter Stephenson
2016-07-27 23:05 ` Oliver Kiddle [this message]
2016-07-26 15:51 ` Peter Stephenson
2016-07-26 16:00 ` Peter Stephenson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=83727.1469660746@hydra.kiddle.eu \
--to=okiddle@yahoo.co.uk \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).