===========================================================
Description:
===========================================================

a) The buffer number 3 contains the following three lines
(the two first lines are 28 chars long, including the newline):

123456789012345678901234567
                   t ={*} 1
FIN


b) Send the following netbeans functions
(purpose: try to insert a 'u' line in front of the 't' line
and replace the '*' by a '=' in the 't' line):

3:remove/91 28 28
3:insert/92 28 "                   u ={*} 1\n"
3:insert/93 56 "                   t ={=} 1\n"


c) After completion of the functions, the buffer content is
(note the '1' standing at first column on line 4):

123456789012345678901234567
                   u ={*} 1
                   t ={=} 1
1                  t ={*} 1
FIN


d) The vim log traces say:

FUN 91: (3) remove 28 28
    FIRST POS: line 2, col 0
    LAST POS: line 2, col 27
    NEW LINE 2: 1                  t ={*} 1
REP 91: <none>
FUN 92: (3) insert <text>
REP 92: <none>
FUN 93: (3) insert <text>
REP 93: <none>

===========================================================

I think the problem is that the remove function does not handle the case
where the 'FIRST POS' and 'LAST POS' include the whole line that must be
removed entirely. It tries to do a ml_replace() in all the cases where
'FIRST POS' and 'LAST POS' are on the same line.

The workaround used currently by clewn is to insert a newline just
before the line to remove, and to remove the two lines in one shot.

The following patch fixes this problem. However it is not complete as it
does not handle the case where the section to delete is muli-lines and
starts with a partial line. The original code does not handle this case
either.


===========================================================
1373a1374
>           linenr_T lnum_of_next;
1425a1427,1433
>               /* get the position of the next character after the deleted 
> section */
>               pos = off2pos(buf->bufp, off + count);
>               if (!pos)
>                   lnum_of_next = last.lnum;
>               else
>                   lnum_of_next = pos->lnum;
>
1427c1435,1436
<               if (first.lnum == last.lnum && first.col != last.col)
---
>               if (first.lnum == last.lnum && first.col != last.col
>                       && (first.col != 0 || lnum_of_next == last.lnum))
1436c1445,1446
<               if (first.lnum < last.lnum)
---
>               if (first.lnum < last.lnum
>                       || (first.col == 0 && lnum_of_next != last.lnum))
===========================================================

Xavier

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui