Hi again Lucas,

On Thu, Apr 03, 2025 at 09:08:57PM +0200, Walter Alejandro Iglesias wrote:
> Hi Lucas,
> 
> On Thu, Apr 03, 2025 at 05:17:35PM +0000, Lucas Gabriel Vuotto wrote:
> > Hey Walter,
> > 
> > Thanks for the report.
> > 
> > On Thu, Apr 03, 2025 at 02:55:11PM +0200, Walter Alejandro Iglesias wrote:
> > > Using vi mode in ksh I noticed that the command endword (vi.c) gets
> > > staked when the last character in a word is a UTF-8 character.
> > > 
> > > To reproduce:
> > > 
> > > In the line bellow, using vi mode, first move your cursor to the first
> > > character, then hit "e" several times.  You'll see the cursor get
> > > stacked in the euro sign.
> > > 
> > >   $ word word€ word
> > >              ^ this is an euro sign.
> > 
> > It also happens with E command.
> > 
> > > The following diff is one of my intuitive C newbie solutions, some
> > > expert will surely find a better one.
> > 
> > The patch isn't correct: you're calling isspace (expects a character)
> > with the result of isu8cont (which is a boolean).
> 

This time I paid a little more attention :-).  Maybe I'm missing
something, but it seems to me that, in your patch, the skip_utf8_cont
variable is unnecessary.

Anyway, at first I'd also tried doing something similar to what you
suggested, I still think it doesn't require so much fuss.  Let's see if
I don't make any stupid mistakes with this new version of mine:


Index: vi.c
===================================================================
RCS file: /cvs/src/bin/ksh/vi.c,v
diff -u -p -r1.60 vi.c
--- vi.c        12 Mar 2021 02:10:25 -0000      1.60
+++ vi.c        5 Apr 2025 07:23:47 -0000
@@ -1195,8 +1195,11 @@ domove(int argcnt, const char *cmd, int 
                        return -1;
                ncursor = (*cmd == 'e' ? endword : Endword)(argcnt);
                if (!sub)
-                       while (isu8cont((unsigned char)es->cbuf[--ncursor]))
+                       while (isu8cont((unsigned char)es->cbuf[--ncursor])) {
+                               if (!isspace(es->cursor + 1))
+                                       break;
                                continue;
+                       }
                break;
 
        case 'f':


-- 
Walter

Reply via email to