Thanks for your other response. Not sure whether my message below came through.
It seems I'm going to have to do a bit more work on the list of changes that comes through. In the example, I think I actually need to collapse the two changes into a single one with added = 2. Then do a pass over the resulting list getting the lines based on the current buffer. Which I think brings us back to the non-overlapping changes question I think. Because the second change overlaps with the first, which is what causes my logic to fail. Is that about right? On Wed, 22 May 2019 at 16:07, Paul Jolly <[email protected]> wrote: > > Thanks for your patience with this! > > > So the first list are the lines in the buffer? > > Yes, correct. > > > > ['const x = ``'] [{'lnum': 1, 'col': 11, 'added': 0, 'end': 2}, {'lnum': > > > 1, 'col': 12, 'added': 0, 'end': 2}] > > > > Here you type the first backtick, and the plugin adds the second > > backtick. > > Yup, this looked right to me. > > > > ['const x = `', '', '`'] [{'lnum': 1, 'col': 12, 'added': 1, 'end': 2}, > > > {'lnum': 2, 'col': 1, 'added': 1, 'end': 2}] > > > > Here you type Enter twice. The first time the existing line is split, > > so you get lnum = 1 and end = 2. The second time a line is inserted, so > > you get lnum = 2 and end = 2. You get two entries with "added" equal to > > one, thus two lines have been added, that is also correct. > > The problem (or likely my misunderstanding) is that I get both of > these in the same callback, i.e. they both see the buffer in the state > shown, hence neither "sees" the change in line 3. > > To provide this in context (perhaps what I should have done from the start). > > What I'm doing in response to these callbacks is gathering the > affected lines, adding them to each of the changes, and passing on the > lots to govim (to save roundtrips). > > for l:change in a:changes > if l:change.added < 0 > let l:change.type = "deleted" > else > if l:change.lnum != l:change.end > let l:change.type = "changed" > let l:change.lines = getbufline(a:bufnr, l:change.lnum, > l:change.end-1+l:change.added) > elseif l:change.added > 0 > let l:change.type = "inserted" > let l:change.lines = getbufline(a:bufnr, l:change.lnum, > l:change.lnum+l:change.added-1) > endif > endif > endfor > > Or for the second entry in the change list, do I need to move lnum > "forward" by the number of lines added before? > > > Perhaps it's confusing that when a line is inserted, the "lnum" is the > > line above which it is inserted. Imagine doing "O" on a line. Doing > > "o" on the previous line has the same effect, thus you get the same line > > numbers. > > I _think_ I have this one sorted ;-) But depending on your answer > above that might also prove to be a wrong assumption! > > Thanks again, > > > Paul -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/CACoUkn7V4Xx%2B9gURJQyPEJ0zS-2xYKsj65Znr4Vd6ii5L8Yd5w%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
