Running latest snapshot.

Acording to vi(1):

    [count] }
             Move forward count paragraphs.

[...]

     paragraphs, para [IPLPPPQPP LIpplpipbpBlBdPpLpIt]
             vi only.  Define additional paragraph boundaries for the { and }
             commands.

The bug:

Using the move forward with paragraphs separated by tags (those in
'para' options) as in the example below doesn't move the cursor to the
right place.

Example:

Open with vi(1) a file conaining the following lines.  Put your cursor
at the '1' or in the empty line right above, and try using '}' (move to
next paragraph) with different number prefixes (placing again the cursor
at "1" each time).

1

2

3

4

5

6

There it works as expected.  Now repeat the same on this lines (keeping
paragraphs option untouched):

.PP
1
.PP
2
.PP
3
.PP
4
.PP
5
.PP
6

The prefixes in this case will move your cursor to "prefix + prefix - 1"
paragraphs.  This is:

- 2 will move your cursor to 3
- 3 will move your cursor to 5
- 4 to 7
- 5 to 9

and so on.

Finally, repeat the same steps on this lines:

.PP 1
.PP 2
.PP 3
.PP 4
.PP 5
.PP 6
.PP 7
.PP 8

Now the cursor will go "prefix *= 2"

It behaves in the same fashion moving to previous paragraphs.

I took a look to this file:

/usr/src/usr.bin/vi/vi/v_paragraph.c

But I wasn't able to understand what it does.  Especially this part:

        /*
         * If we start in text, we want to switch states
         * (2 * N - 1) times, in non-text, (2 * N) times.
         */
        cnt = F_ISSET(vp, VC_C1SET) ? vp->count : 1;
        cnt *= 2;
        if (len == 0 || v_isempty(p, len))
                pstate = P_INBLANK;
        else {
                --cnt;
                pstate = P_INTEXT;
        }


-- 
Walter

Reply via email to