From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14479 invoked by alias); 3 Jun 2012 23:51:17 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 17132 Received: (qmail 22064 invoked from network); 3 Jun 2012 23:51:14 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 Received-SPF: neutral (ns1.primenet.com.au: 74.125.82.171 is neither permitted nor denied by SPF record at ntlworld.com) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-proxyuser-ip:date:from:to:subject:message-id:in-reply-to :references:x-mailer:mime-version:content-type :content-transfer-encoding:x-gm-message-state; bh=5DiaqtrbRsNjd4QIPknTJQoSias4GUq3ONdjvyt12dI=; b=OU7QL9W+zTqhfwpyFOP10mSOrzbH+JRwU8suAEuW8FPKRTJm32SOVi90YyAc/Pc1XD 3P5bwGRwGHy5wUQc5RrgCNryyiLoRur1S5WM0rtuSTvWcxGkwgYcpehzv0FGmeMRy7l7 esCgMvcMsNK5cQeNEv0+PK0s4uvoodA+eGKlBM7BuzVUtMR+I/sDgikNWm1eWpaOFygN 3Nwq9cq6zBvpn7GMPU2e3D4yzMMNxuBebaJLQbsPOVTEUp4DqyJJXoGJqBZZoA8uPOKA xXPxjRxAkqFdBunF2SlQixwHJ3uSgIO/YHUui6y+w66n8VyiJhuOZmXeEXtbSPhzYeAj 4E+g== X-ProxyUser-IP: 86.6.29.42 Date: Mon, 4 Jun 2012 00:45:04 +0100 From: Peter Stephenson To: zsh-users@zsh.org Subject: Re: Word-forward/word-backward as in bash / emacs Message-ID: <20120604004504.2cc53243@pws-pc.ntlworld.com> In-Reply-To: <4FCBE8A3.1050603@k-bx.com> References: <4FCBC8D3.3020905@k-bx.com> <20120603223629.31f92548@pws-pc.ntlworld.com> <4FCBE8A3.1050603@k-bx.com> X-Mailer: Claws Mail 3.8.0 (GTK+ 2.24.7; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQl3AxLPu4UzHuHCzK/Y7gfqDKa7fs2KNciYG33ERwnrgUiZ/cFApSVpn4im9Om/S34A37hI On Mon, 04 Jun 2012 01:43:47 +0300 Konstantine Rybnikov wrote: > Just tried your patch -- yes, looks like it works as expected. Thanks! Good, here's a more complete patch. Rather than second-guess what the user wants with the style, which isn't really how select-word-style works (it's designed to be explicit about setting things up), this just sets the style differently for bash compatibility, and the documentation notes you can override this by setting it in a more specific context (for a style, a longer pattern is considered more specific). Index: Doc/Zsh/contrib.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/contrib.yo,v retrieving revision 1.142 diff -p -u -r1.142 contrib.yo --- Doc/Zsh/contrib.yo 8 May 2012 16:50:26 -0000 1.142 +++ Doc/Zsh/contrib.yo 3 Jun 2012 23:39:22 -0000 @@ -1734,6 +1734,16 @@ context is examined and if it contains t the cursor is considered, else the word after cursor is considered. Some examples are given below. +The style tt(skip-whitespace-first) is only used with the +tt(forward-word) widget. If it is set to true, then tt(forward-word) +skips any non-word-characters, followed by any non-word-characters: +this is similar to the behaviour of other word-orientated widgets, +and also that used by other editors, however it differs from the +standard zsh behaviour. When using tt(select-word-style) the widget +is set in the context tt(:zle:*) to tt(true) if the word style is +tt(bash) and tt(false) otherwise. It may be overridden by setting it in +the more specific context tt(:zle:forward-word*). + Here are some examples of use of the styles, actually taken from the simplified interface in tt(select-word-style): Index: Functions/Zle/forward-word-match =================================================================== RCS file: /cvsroot/zsh/zsh/Functions/Zle/forward-word-match,v retrieving revision 1.3 diff -p -u -r1.3 forward-word-match --- Functions/Zle/forward-word-match 28 Jul 2010 13:33:59 -0000 1.3 +++ Functions/Zle/forward-word-match 3 Jun 2012 23:39:22 -0000 @@ -8,32 +8,36 @@ local -a matched_words integer count=${NUMERIC:-1} if (( count < 0 )); then - (( NUMERIC = -count )) - zle ${WIDGET/forward/backward} - return + (( NUMERIC = -count )) + zle ${WIDGET/forward/backward} + return fi while (( count-- )); do - - match-words-by-style - + match-words-by-style + + if zstyle -t $curcontext skip-whitespace-first; then + # Standard non-zsh behaviour: skip leading whitespace and the word. + word=$matched_words[4]$matched_words[5] + else + # Traditional zsh behaviour. # For some reason forward-word doesn't work like the other word # commands; it skips whitespace only after any matched word # characters. - if [[ -n $matched_words[4] ]]; then - # just skip the whitespace - word=$matched_words[4] + # just skip the whitespace + word=$matched_words[4] else - # skip the word and trailing whitespace - word=$matched_words[5]$matched_words[6] + # skip the word and trailing whitespace + word=$matched_words[5]$matched_words[6] fi + fi - if [[ -n $word ]]; then - (( CURSOR += ${#word} )) - else - return 1 - fi + if [[ -n $word ]]; then + (( CURSOR += ${#word} )) + else + return 1 + fi done return 0 Index: Functions/Zle/select-word-style =================================================================== RCS file: /cvsroot/zsh/zsh/Functions/Zle/select-word-style,v retrieving revision 1.4 diff -p -u -r1.4 select-word-style --- Functions/Zle/select-word-style 28 Jul 2010 13:33:59 -0000 1.4 +++ Functions/Zle/select-word-style 3 Jun 2012 23:39:22 -0000 @@ -4,71 +4,75 @@ setopt extendedglob local -a word_functions word_functions=(backward-kill-word backward-word - capitalize-word down-case-word - forward-word kill-word - transpose-words up-case-word) + capitalize-word down-case-word + forward-word kill-word + transpose-words up-case-word) [[ -z $1 ]] && autoload -Uz read-from-minibuffer -local REPLY detail f wordstyle +local REPLY detail f wordstyle teststyle if ! zle -l $word_functions[1]; then - for f in $word_functions; do - autoload -Uz $f-match - zle -N $f $f-match - done + for f in $word_functions; do + autoload -Uz $f-match + zle -N $f $f-match + done fi while true; do - - if [[ -n $WIDGET && -z $1 ]]; then - read-from-minibuffer -k1 "Word styles (hit return for more detail): + if [[ -n $WIDGET && -z $1 ]]; then + read-from-minibuffer -k1 "Word styles (hit return for more detail): (b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit (B), (N), (S), (W) as above with subword matching ${detail}? " || return 1 - else - REPLY=$1 - fi - - detail= + else + REPLY=$1 + fi + + detail= + + case $REPLY in + ([bB]*) + # bash style + wordstyle=standard + zstyle ':zle:*' word-chars '' + zstyle ':zle:*' skip-whitespace-first true + ;; + + ([nN]*) + # normal zsh style + wordstyle=standard + zstyle ':zle:*' word-chars "$WORDCHARS" + zstyle ':zle:*' skip-whitespace-first false + ;; + + ([sS]*) + # shell command arguments or special tokens + wordstyle=shell + zstyle ':zle:*' skip-whitespace-first false + ;; + + ([wW]*) + # whitespace-delimited + wordstyle=space + zstyle ':zle:*' skip-whitespace-first false + ;; + + (d*) + # default: could also return widgets to builtins here + wordstyle= + zstyle -d ':zle:*' word-chars + zstyle -d ':zle:*' skip-whitespace-first + ;; + + (q*) + # quit without setting + return 1 + ;; - case $REPLY in - ([bB]*) - # bash style - wordstyle=standard - zstyle ':zle:*' word-chars '' - ;; - - ([nN]*) - # normal zsh style - wordstyle=standard - zstyle ':zle:*' word-chars "$WORDCHARS" - ;; - - ([sS]*) - # shell command arguments or special tokens - wordstyle=shell - ;; - - ([wW]*) - # whitespace-delimited - wordstyle=space - ;; - - (d*) - # default: could also return widgets to builtins here - wordstyle= - zstyle -d ':zle:*' word-chars - ;; - - (q*) - # quit without setting - return 1 - ;; - - (*) - detail="\ + (*) + detail="\ (b)ash: Word characters are alphanumerics only (n)ormal: Word characters are alphanumerics plus \$WORDCHARS (s)hell: Words are command arguments using shell syntax @@ -76,21 +80,21 @@ ${detail}? " || return 1 (d)efault: Use default, no special handling (usually same as \`n') (q)uit: Quit without setting a new style " - if [[ -z $WIDGET || -n $1 ]]; then - print "Usage: $0 word-style + if [[ -z $WIDGET || -n $1 ]]; then + print "Usage: $0 word-style where word-style is one of the characters in parentheses: $detail" >&2 - return 1 - fi - continue - ;; - esac - - if [[ -n $wordstyle ]]; then - if [[ $REPLY = [[:upper:]]* ]]; then - wordstyle+=-subword - fi - zstyle ':zle:*' word-style $wordstyle + return 1 + fi + continue + ;; + esac + + if [[ -n $wordstyle ]]; then + if [[ $REPLY = [[:upper:]]* ]]; then + wordstyle+=-subword fi - return + zstyle ':zle:*' word-style $wordstyle + fi + return done -- Peter Stephenson Web page now at http://homepage.ntlworld.com/p.w.stephenson/