Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
"drop-in replacement" and transpose-words-match
- X-seq: zsh-workers 37570
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: "drop-in replacement" and transpose-words-match
- Date: Mon, 11 Jan 2016 23:32:59 -0800
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=from:message-id:date:to:subject:mime-version:content-type; bh=bQDOH2Ivmeaob+rTc9EuMq3UnJIDJIk5KM1OpR13tdY=; b=Wr7rzwlAGsWX2Z8c3qjzw9tpn/8pBj3HxS8ekGi6R0MhZkbAnOJLmWceki3AmqSS5O CKWN3LeIIT6nAyMZrmGDzERz7rNCObitRC6dUCE/zt7WB3WP0pI7+MxhUdMNSddUAdbG ccSKi5C+mTYWWhqlpa3G9Nc+cMZmjIvhMEO0NK0NIoIBtNbcq8lOgVqNXTXWcHJcR00c wRE4Ali3XEEz76eduTJ6R4Jq8w7BL0kH2R4VChoM7f/RLfeAGbQqoyYFMiX7qu8tbWQu f0VHykJryDB0k4sT83uxg/gmHI3e4J/H0pW/Uk1e47LzCH3Y08Z3jG5Wrss1FTEpuu3y HoHA==
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
Of the eight match-words-by-style functions, transpose-words-match is the
only one that is not really a drop-in, because it adopts the paradigm of
match-words-by-style where a cursor in the middle of a word splits that
word (treating the LBUFFER part as "word before the cursor" and RBUFFER
part as "word after the cursor").
There are some useful things about this behavior, e.g., "skip-chars 1"
where you can make "fooXbar" swap as "barXfoo", but there are also some
drawbacks -- cases where transpose-words would do something but -match
does nothing or does something very different. So how about this: if
the skip-chars style is set (even to zero), then keep the cursor where
it is and split the word, otherwise act like the builtin. The subword
flavor of word-style can similarly be checked.
Also, it looks to me as though transpose-words-match assumes zsh emulation
but (unlike e.g. select-word-style) never declares it. Also "skip" is a
local in match-words-by-style, it doesn't help to declare it here.
This still isn't perfect -- if you are on or immediately after a space
in the middle of a quoted string, for example, you'll swap around that
space. I haven't decided on the best way to deal with that. But this
works much better if you are at the end of a line and invoke transpose:
it swaps the two words to the left, like the builtin.
diff --git a/Functions/Zle/transpose-words-match b/Functions/Zle/transpose-words-match
index c1db310..4d2ac71 100644
--- a/Functions/Zle/transpose-words-match
+++ b/Functions/Zle/transpose-words-match
@@ -11,14 +11,23 @@
# on X would be turned into `barXfoo' with the cursor still on the X,
# regardless of what the character X is.
+emulate -L zsh
autoload -Uz match-words-by-style
-local curcontext=":zle:$WIDGET" skip
+local curcontext=":zle:$WIDGET"
local -a matched_words
integer count=${NUMERIC:-1} neg
(( count < 0 )) && (( count = -count, neg = 1 ))
+if [[ $WIDGET == transpose-words ]]; then
+ # default is to be a drop-in replacement, check styles for change
+ zstyle -m $curcontext skip-chars \* ||
+ zstyle -m $curcontext word-style '*subword*' ||
+ { [[ $LBUFFER[-1] != [[:space:]] && $RBUFFER[1] != [[:space:]] ||
+ -z ${RBUFFER//[[:space:]]/} ]] && zle backward-word }
+fi
+
while (( count-- > 0 )); do
match-words-by-style
Messages sorted by:
Reverse Date,
Date,
Thread,
Author