From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 952 invoked by alias); 1 Jun 2017 14:15:44 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 41191 Received: (qmail 16395 invoked from network); 1 Jun 2017 14:15:44 -0000 X-Qmail-Scanner-Diagnostics: from mailout2.w1.samsung.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(210.118.77.12):SA:0(-5.0/5.0):. Processed in 2.428546 secs); 01 Jun 2017 14:15:44 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: p.stephenson@samsung.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at _spf.samsung.com designates 210.118.77.12 as permitted sender) X-AuditID: cbfec7f1-f796e6d00000116b-4a-59302183605c Date: Thu, 01 Jun 2017 15:15:28 +0100 From: Peter Stephenson To: "zsh-workers@zsh.org" Subject: Re: Zsh Bug Report: vi mode inner motions diw and ciw incorrect Message-id: <20170601151528.4d0aad32@pwslap01u.europe.root.pri> In-reply-to: <559FA8F10BF2244B9DA5E70F5B6BA9A00112A312C2@OPCHMS0002.comp.optiver.com> Organization: Samsung Cambridge Solution Centre X-Mailer: Claws Mail 3.7.9 (GTK+ 2.22.0; i386-redhat-linux-gnu) MIME-version: 1.0 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrHIsWRmVeSWpSXmKPExsWy7djP87rNigaRBi1rLC0ONj9kcmD0WHXw A1MAYxSXTUpqTmZZapG+XQJXxtmOXawFPYoVt3a/Ym5gfCbVxcjJISFgIvH+SyMrhC0mceHe erYuRi4OIYGljBK7pv9ngXB6mSRWf37KAtNxrrsRKrGMUeL+6d/sEM40Jonf598zQzinGSVW H/vNCuGcYZSYdmQFE0g/i4CqxKxXi8FmsQkYSkzdNJsRxBYR0Je4+OcWmC0s4CFx7NQfdhCb V8BeYt62L2AXcgqES/yb9hzM5geqv/r3ExPETfYSM6+cYYSoF5T4Mfke2HxmAR2Jbdses0PY 8hKb17wFu05C4D+bxLmHZ4Fe5QByZCU2HWCGmOMisejSY0YIW1ji1fEt7BC2jERnx0GoXf2M Ek+6fSHmzGCUOH1mBxtEwlqi7/ZFRohlfBKTtk1nhpjPK9HRJgRR4iFx5+gZaGg7Sqzf9oFl AqPiLCRnz0Jy9iwkZy9gZF7FKJJaWpybnlpspFecmFtcmpeul5yfu4kRmApO/zv+cQfj+xNW hxgFOBiVeHgtFAwihVgTy4orcw8xSnAwK4nwCkgChXhTEiurUovy44tKc1KLDzFKc7AoifNy nboWISSQnliSmp2aWpBaBJNl4uCUamDc29Rpql+puKb85JyNh5WFZx0++ir+0vX8lZNfLsqc 3f5NSuWTVNi9TYEVswNrDy2TVC1sy5z3e4Hxp/w1lj2+TOkzPE9XnO59UJCS9KeFJ2Ft7SP+ xeKT+i22q2stmpdzJPlHns7Uns7dtluPNL2o9OOc235ENsHh8bEGzzPr2jb9rbYxbX2kxFKc kWioxVxUnAgArXUgzQEDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGIsWRmVeSWpSXmKPExsVy+t/xa7rNigaRBu/myFgcbH7I5MDoserg B6YAxig3m4zUxJTUIoXUvOT8lMy8dFul0BA3XQslhbzE3FRbpQhd35AgJYWyxJxSIM/IAA04 OAe4Byvp2yW4ZZzt2MVa0KNYcWv3K+YGxmdSXYycHBICJhLnuhtZIGwxiQv31rN1MXJxCAks YZQ4dPIiC4Qzg0libuNDRgjnNKPEylNnmCGcM4wSM688YgPpZxFQlZj1ajHYLDYBQ4mpm2Yz gtgiAvoSF//cArOFBTwkjp36ww5i8wrYS8zb9oW1i5GDg1MgXOL5KiOImRuYJHZ8/wxWww/U e/XvJyaI++yBdp1hhOgVlPgx+R7YLmYBLYnN25pYIWx5ic1r3jKD2EIC6hI37u5mn8AoPAtJ yywkLbOQtCxgZF7FKJJaWpybnltsqFecmFtcmpeul5yfu4kRGEfbjv3cvIPx0sbgQ4wCHIxK PLwWCgaRQqyJZcWVuYcYJTiYlUR4BSSBQrwpiZVVqUX58UWlOanFhxhNgQEzkVlKNDkfGON5 JfGGJobmloZGxhYW5kZGSuK8JR+uhAsJpCeWpGanphakFsH0MXFwSjUw1vjbu5UXh8eY6r68 0O001Xp9eaJmYnw+7+71C61jbvVfODzDuu1q/mGTB9rWSxM89uZWl/8zOMvv4v2Lpcv7u72A 140np5s15h6752M31VaVg+Hdu7+qE35U/j+k8cHukePVf01frt94ICLF+IzB46Ac306hGmW+ 9wtuJTKyR36z1/23dkqGEktxRqKhFnNRcSIAZn/JSbkCAAA= X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170601141531eucas1p130272e0a07a8dccda976dfae56b38e90 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUb?= =?UTF-8?B?7IK87ISx7KCE7J6QG1ByaW5jaXBhbCBFbmdpbmVlciwgU29mdHdhcmU=?= X-Global-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUbU2Ft?= =?UTF-8?B?c3VuZyBFbGVjdHJvbmljcxtQcmluY2lwYWwgRW5naW5lZXIsIFNvZnR3YXJl?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDA1Q0QwNTAwNTg=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20170601131949epcas3p4cc5b421c6f39db39c5974e83c321f8e5 X-RootMTR: 20170601131949epcas3p4cc5b421c6f39db39c5974e83c321f8e5 References: <559FA8F10BF2244B9DA5E70F5B6BA9A00112A30093@OPCHMS0002.comp.optiver.com> <47CA014E-7DE7-4485-ACCE-F98F5C140376@kba.biglobe.ne.jp> <559FA8F10BF2244B9DA5E70F5B6BA9A00112A312C2@OPCHMS0002.comp.optiver.com> On Thu, 1 Jun 2017 13:19:02 +0000 John Kaczor wrote: > bindkey -M viopp iw > Outputs > "iw" select-in-word > > I cut down my zshrc to a minimal version that reproduces the issue. > It appears to only occur once I have sourced > zsh-history-substring-search.zsh. I cloned the latest version of this > plugin. Also, zsh 5.0.8 works as expected even when sourcing > zsh-history-substring-search.zsh, but zsh 5.3.1 does not. I don't know that function or where it comes from, but I can see one problem that's going to make things difficulty, namely it doesn't test for the equivalent "immortal" binding. (FAOD: this new test isn't needed for t_undefinedkey which is passed around specially internally.) pws diff --git a/Completion/Unix/Command/_sudo b/Completion/Unix/Command/_sudo index aa7a1a4..0b09ded 100644 --- a/Completion/Unix/Command/_sudo +++ b/Completion/Unix/Command/_sudo @@ -41,6 +41,8 @@ if [[ $service = sudoedit ]] || (( $words[(i)-e] < $words[(i)^(*sudo|-[^-]*)] )) args=( -A "-*" $args '!(-V --version -h --help)-e' '*:file:_files' ) else cmd="$words[1]" + local ext + (( ${words[(I)-[is]]} == 0 )) && ext=" -e" args+=( '(-e --edit 1 *)'{-e,--edit}'[edit files instead of running a command]' \ '(-s --shell)'{-s,--shell}'[run shell as the target user; a command may also be specified]' \ @@ -49,7 +51,7 @@ else '(-E --preserve-env -i --login -s --shell -e --edit)'{-E,--preserve-env}'[preserve user environment when running command]' \ '(-H --set-home -i --login -s --shell -e --edit)'{-H,--set-home}"[set HOME variable to target user's home dir]" \ '(-P --preserve-groups -i -login -s --shell -e --edit)'{-P,--preserve-groups}"[preserve group vector instead of setting to target's]" \ - '(-)1:command: _command_names -e' + "(-)1:command: _command_names$ext" '*::arguments:{ _comp_priv_prefix=( $cmd -n ${(kv)opt_args[(I)(-[ugHEP]|--(user|group|set-home|preserve-env|preserve-groups))]} ) ; _normal }' ) fi diff --git a/Src/Zle/textobjects.c b/Src/Zle/textobjects.c index 3db0781..bf83906 100644 --- a/Src/Zle/textobjects.c +++ b/Src/Zle/textobjects.c @@ -48,9 +48,10 @@ int selectword(UNUSED(char **args)) { int n = zmult; - int all = (bindk == t_selectaword || bindk == t_selectablankword); - int (*viclass)(ZLE_CHAR_T) = (bindk == t_selectaword || - bindk == t_selectinword) ? wordclass : blankwordclass; + int all = IS_THINGY(bindk, selectaword) || + IS_THINGY(bindk, selectablankword); + int (*viclass)(ZLE_CHAR_T) = (IS_THINGY(bindk, selectaword) || + IS_THINGY(bindk, selectinword)) ? wordclass : blankwordclass; int sclass = viclass(zleline[zlecs]); int doblanks = all && sclass; @@ -288,7 +289,7 @@ selectargument(UNUSED(char **args)) free(stringaszleline(linein, wstarts[wcur], &zlecs, &tmpsz, &mark)); free(linein); - if (bindk == t_selectinshellword) { + if (IS_THINGY(bindk, selectinshellword)) { ZLE_CHAR_T *match = ZWS("`\'\""); ZLE_CHAR_T *lmatch = ZWS("\'({"), *rmatch = ZWS("\')}"); ZLE_CHAR_T *ematch = match, *found; diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h index 8f92e56..07b3101 100644 --- a/Src/Zle/zle.h +++ b/Src/Zle/zle.h @@ -230,6 +230,13 @@ struct thingy { /* DISABLED is (1<<0) */ #define TH_IMMORTAL (1<<1) /* can't refer to a different widget */ +/* + * Check if bindk refers to named thingy (a set of bare characters), + * also checking the special .thingy widget. + */ +#define IS_THINGY(bindk, name) \ + ((bindk) == t_ ## name || (bindk) == t_D ## name) + /* command modifier prefixes */ struct modifier { diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c index 04eb706..2e96ac7 100644 --- a/Src/Zle/zle_keymap.c +++ b/Src/Zle/zle_keymap.c @@ -961,7 +961,7 @@ bin_bindkey_meta(char *name, char *kmname, Keymap km, UNUSED(char **argv), UNUSE m[0] = i; metafy(m, 1, META_NOALLOC); fn = keybind(km, m, &str); - if(fn == t_selfinsert || fn == t_undefinedkey) + if(IS_THINGY(fn, selfinsert) || fn == t_undefinedkey) bindkey(km, m, refthingy(Th(metabind[i - 128])), NULL); } return 0;