diff options
Diffstat (limited to 'data/vim/patches/8.1.1332')
-rw-r--r-- | data/vim/patches/8.1.1332 | 622 |
1 files changed, 0 insertions, 622 deletions
diff --git a/data/vim/patches/8.1.1332 b/data/vim/patches/8.1.1332 deleted file mode 100644 index 7771e86c3..000000000 --- a/data/vim/patches/8.1.1332 +++ /dev/null @@ -1,622 +0,0 @@ -To: vim_dev@googlegroups.com -Subject: Patch 8.1.1332 -Fcc: outbox -From: Bram Moolenaar <Bram@moolenaar.net> -Mime-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit ------------- - -Patch 8.1.1332 -Problem: Cannot flush change listeners without also redrawing. The line - numbers in the list of changes may become invalid. -Solution: Add listener_flush(). Invoke listeners before adding a change - that makes line numbers invalid. -Files: src/evalfunc.c, src/change.c, src/proto/change.pro, - src/screen.c, runtime/doc/eval.txt, src/testdir/test_listener.vim - - -*** ../vim-8.1.1331/src/evalfunc.c 2019-05-12 13:07:10.563191431 +0200 ---- src/evalfunc.c 2019-05-14 18:48:29.245329088 +0200 -*************** -*** 768,773 **** ---- 768,774 ---- - {"lispindent", 1, 1, f_lispindent}, - {"list2str", 1, 2, f_list2str}, - {"listener_add", 1, 2, f_listener_add}, -+ {"listener_flush", 0, 1, f_listener_flush}, - {"listener_remove", 1, 1, f_listener_remove}, - {"localtime", 0, 0, f_localtime}, - #ifdef FEAT_FLOAT -*** ../vim-8.1.1331/src/change.c 2019-05-11 21:14:02.332269584 +0200 ---- src/change.c 2019-05-14 20:20:30.221554995 +0200 -*************** -*** 169,174 **** ---- 169,214 ---- - - if (curbuf->b_listener == NULL) - return; -+ -+ // If the new change is going to change the line numbers in already listed -+ // changes, then flush. -+ if (recorded_changes != NULL && xtra != 0) -+ { -+ listitem_T *li; -+ linenr_T nr; -+ -+ for (li = recorded_changes->lv_first; li != NULL; li = li->li_next) -+ { -+ nr = (linenr_T)dict_get_number( -+ li->li_tv.vval.v_dict, (char_u *)"lnum"); -+ if (nr >= lnum || nr > lnume) -+ { -+ if (li->li_next == NULL && lnum == nr -+ && col + 1 == (colnr_T)dict_get_number( -+ li->li_tv.vval.v_dict, (char_u *)"col")) -+ { -+ dictitem_T *di; -+ -+ // Same start point and nothing is following, entries can -+ // be merged. -+ di = dict_find(li->li_tv.vval.v_dict, (char_u *)"end", -1); -+ nr = tv_get_number(&di->di_tv); -+ if (lnume > nr) -+ di->di_tv.vval.v_number = lnume; -+ di = dict_find(li->li_tv.vval.v_dict, -+ (char_u *)"added", -1); -+ di->di_tv.vval.v_number += xtra; -+ return; -+ } -+ -+ // the current change is going to make the line number in the -+ // older change invalid, flush now -+ invoke_listeners(curbuf); -+ break; -+ } -+ } -+ } -+ - if (recorded_changes == NULL) - { - recorded_changes = list_alloc(); -*************** -*** 231,236 **** ---- 271,293 ---- - } - - /* -+ * listener_flush() function -+ */ -+ void -+ f_listener_flush(typval_T *argvars, typval_T *rettv UNUSED) -+ { -+ buf_T *buf = curbuf; -+ -+ if (argvars[0].v_type != VAR_UNKNOWN) -+ { -+ buf = get_buf_arg(&argvars[0]); -+ if (buf == NULL) -+ return; -+ } -+ invoke_listeners(buf); -+ } -+ -+ /* - * listener_remove() function - */ - void -*************** -*** 264,288 **** - * listener_add(). - */ - void -! invoke_listeners(void) - { - listener_T *lnr; - typval_T rettv; - int dummy; -! typval_T argv[2]; - -! if (recorded_changes == NULL) // nothing changed - return; -- argv[0].v_type = VAR_LIST; -- argv[0].vval.v_list = recorded_changes; - -! for (lnr = curbuf->b_listener; lnr != NULL; lnr = lnr->lr_next) - { - call_func(lnr->lr_callback, -1, &rettv, -! 1, argv, NULL, 0L, 0L, &dummy, TRUE, lnr->lr_partial, NULL); - clear_tv(&rettv); - } - - list_unref(recorded_changes); - recorded_changes = NULL; - } ---- 321,376 ---- - * listener_add(). - */ - void -! invoke_listeners(buf_T *buf) - { - listener_T *lnr; - typval_T rettv; - int dummy; -! typval_T argv[6]; -! listitem_T *li; -! linenr_T start = MAXLNUM; -! linenr_T end = 0; -! linenr_T added = 0; - -! if (recorded_changes == NULL // nothing changed -! || buf->b_listener == NULL) // no listeners - return; - -! argv[0].v_type = VAR_NUMBER; -! argv[0].vval.v_number = buf->b_fnum; // a:bufnr -! -! -! for (li = recorded_changes->lv_first; li != NULL; li = li->li_next) -! { -! varnumber_T lnum; -! -! lnum = dict_get_number(li->li_tv.vval.v_dict, (char_u *)"lnum"); -! if (start > lnum) -! start = lnum; -! lnum = dict_get_number(li->li_tv.vval.v_dict, (char_u *)"end"); -! if (lnum > end) -! end = lnum; -! added = dict_get_number(li->li_tv.vval.v_dict, (char_u *)"added"); -! } -! argv[1].v_type = VAR_NUMBER; -! argv[1].vval.v_number = start; -! argv[2].v_type = VAR_NUMBER; -! argv[2].vval.v_number = end; -! argv[3].v_type = VAR_NUMBER; -! argv[3].vval.v_number = added; -! -! argv[4].v_type = VAR_LIST; -! argv[4].vval.v_list = recorded_changes; -! ++textlock; -! -! for (lnr = buf->b_listener; lnr != NULL; lnr = lnr->lr_next) - { - call_func(lnr->lr_callback, -1, &rettv, -! 5, argv, NULL, 0L, 0L, &dummy, TRUE, lnr->lr_partial, NULL); - clear_tv(&rettv); - } - -+ --textlock; - list_unref(recorded_changes); - recorded_changes = NULL; - } -*** ../vim-8.1.1331/src/proto/change.pro 2019-05-11 19:14:11.589313987 +0200 ---- src/proto/change.pro 2019-05-14 19:02:12.920839840 +0200 -*************** -*** 3,10 **** - void changed(void); - void changed_internal(void); - void f_listener_add(typval_T *argvars, typval_T *rettv); - void f_listener_remove(typval_T *argvars, typval_T *rettv); -! void invoke_listeners(void); - void changed_bytes(linenr_T lnum, colnr_T col); - void inserted_bytes(linenr_T lnum, colnr_T col, int added); - void appended_lines(linenr_T lnum, long count); ---- 3,11 ---- - void changed(void); - void changed_internal(void); - void f_listener_add(typval_T *argvars, typval_T *rettv); -+ void f_listener_flush(typval_T *argvars, typval_T *rettv); - void f_listener_remove(typval_T *argvars, typval_T *rettv); -! void invoke_listeners(buf_T *buf); - void changed_bytes(linenr_T lnum, colnr_T col); - void inserted_bytes(linenr_T lnum, colnr_T col, int added); - void appended_lines(linenr_T lnum, long count); -*** ../vim-8.1.1331/src/screen.c 2019-05-11 21:14:02.336269566 +0200 ---- src/screen.c 2019-05-14 18:52:55.103887107 +0200 -*************** -*** 565,572 **** - } - - #ifdef FEAT_EVAL -! // Before updating the screen, notify any listeners of changed text. -! invoke_listeners(); - #endif - - if (must_redraw) ---- 565,577 ---- - } - - #ifdef FEAT_EVAL -! { -! buf_T *buf; -! -! // Before updating the screen, notify any listeners of changed text. -! FOR_ALL_BUFFERS(buf) -! invoke_listeners(buf); -! } - #endif - - if (must_redraw) -*** ../vim-8.1.1331/runtime/doc/eval.txt 2019-05-12 13:53:46.906851000 +0200 ---- runtime/doc/eval.txt 2019-05-14 21:17:56.054323991 +0200 -*************** -*** 2459,2464 **** ---- 2459,2465 ---- - list2str({list} [, {utf8}]) String turn numbers in {list} into a String - listener_add({callback} [, {buf}]) - Number add a callback to listen to changes -+ listener_flush([{buf}]) none invoke listener callbacks - listener_remove({id}) none remove a listener callback - localtime() Number current time - log({expr}) Float natural logarithm (base e) of {expr} -*************** -*** 6322,6329 **** - buffer is used. - Returns a unique ID that can be passed to |listener_remove()|. - -! The {callback} is invoked with a list of items that indicate a -! change. The list cannot be changed. Each list item is a - dictionary with these entries: - lnum the first line number of the change - end the first line below the change ---- 6323,6343 ---- - buffer is used. - Returns a unique ID that can be passed to |listener_remove()|. - -! The {callback} is invoked with four arguments: -! a:bufnr the buffer that was changed -! a:start first changed line number -! a:end first line number below the change -! a:added total number of lines added, negative if lines -! were deleted -! a:changes a List of items with details about the changes -! -! Example: > -! func Listener(bufnr, start, end, added, changes) -! echo 'lines ' .. a:start .. ' until ' .. a:end .. ' changed' -! endfunc -! call listener_add('Listener', bufnr) -! -! < The List cannot be changed. Each item in a:changes is a - dictionary with these entries: - lnum the first line number of the change - end the first line below the change -*************** -*** 6337,6371 **** - lnum line below which the new line is added - end equal to "lnum" - added number of lines inserted -! col one - When lines are deleted the values are: - lnum the first deleted line - end the line below the first deleted line, before - the deletion was done - added negative, number of lines deleted -! col one - When lines are changed: - lnum the first changed line - end the line below the last changed line -! added zero -! col first column with a change or one - -! The entries are in the order the changes was made, thus the -! most recent change is at the end. One has to go through the -! list from end to start to compute the line numbers in the -! current state of the text. -! -! When using the same function for multiple buffers, you can -! pass the buffer to that function using a |Partial|. -! Example: > -! func Listener(bufnr, changes) -! " ... -! endfunc -! let bufnr = ... -! call listener_add(function('Listener', [bufnr]), bufnr) -! -! < The {callback} is invoked just before the screen is updated. -! To trigger this in a script use the `:redraw` command. - - The {callback} is not invoked when the buffer is first loaded. - Use the |BufReadPost| autocmd event to handle the initial text ---- 6351,6382 ---- - lnum line below which the new line is added - end equal to "lnum" - added number of lines inserted -! col 1 - When lines are deleted the values are: - lnum the first deleted line - end the line below the first deleted line, before - the deletion was done - added negative, number of lines deleted -! col 1 - When lines are changed: - lnum the first changed line - end the line below the last changed line -! added 0 -! col first column with a change or 1 - -! The entries are in the order the changes were made, thus the -! most recent change is at the end. The line numbers are valid -! when the callback is invoked, but later changes may make them -! invalid, thus keeping a copy for later might not work. -! -! The {callback} is invoked just before the screen is updated, -! when |listener_flush()| is called or when a change is being -! made that changes the line count in a way it causes a line -! number in the list of changes to become invalid. -! -! The {callback} is invoked with the text locked, see -! |textlock|. If you do need to make changes to the buffer, use -! a timer to do this later |timer_start()|. - - The {callback} is not invoked when the buffer is first loaded. - Use the |BufReadPost| autocmd event to handle the initial text -*************** -*** 6373,6378 **** ---- 6384,6397 ---- - The {callback} is also not invoked when the buffer is - unloaded, use the |BufUnload| autocmd event for that. - -+ listener_flush([{buf}]) *listener_flush()* -+ Invoke listener callbacks for buffer {buf}. If there are no -+ pending changes then no callbacks are invoked. -+ -+ {buf} refers to a buffer name or number. For the accepted -+ values, see |bufname()|. When {buf} is omitted the current -+ buffer is used. -+ - listener_remove({id}) *listener_remove()* - Remove a listener previously added with listener_add(). - -*** ../vim-8.1.1331/src/testdir/test_listener.vim 2019-05-12 14:36:22.938437845 +0200 ---- src/testdir/test_listener.vim 2019-05-14 20:56:05.034204412 +0200 -*************** -*** 16,24 **** - func Test_listening() - new - call setline(1, ['one', 'two']) -! let id = listener_add({l -> s:StoreList(l)}) - call setline(1, 'one one') -! redraw - call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list) - - " Undo is also a change ---- 16,25 ---- - func Test_listening() - new - call setline(1, ['one', 'two']) -! let s:list = [] -! let id = listener_add({b, s, e, a, l -> s:StoreList(l)}) - call setline(1, 'one one') -! call listener_flush() - call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list) - - " Undo is also a change -*************** -*** 26,37 **** - call append(2, 'two two') - undo - redraw -! call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}, -! \ {'lnum': 3, 'end': 4, 'col': 1, 'added': -1}, ], s:list) - 1 - -! " Two listeners, both get called. -! let id2 = listener_add({l -> s:AnotherStoreList(l)}) - let s:list = [] - let s:list2 = [] - exe "normal $asome\<Esc>" ---- 27,40 ---- - call append(2, 'two two') - undo - redraw -! " the two changes get merged -! call assert_equal([{'lnum': 3, 'end': 4, 'col': 1, 'added': 0}], s:list) - 1 - -! " Two listeners, both get called. Also check column. -! call setline(1, ['one one', 'two']) -! call listener_flush() -! let id2 = listener_add({b, s, e, a, l -> s:AnotherStoreList(l)}) - let s:list = [] - let s:list2 = [] - exe "normal $asome\<Esc>" -*************** -*** 39,45 **** ---- 42,51 ---- - call assert_equal([{'lnum': 1, 'end': 2, 'col': 8, 'added': 0}], s:list) - call assert_equal([{'lnum': 1, 'end': 2, 'col': 8, 'added': 0}], s:list2) - -+ " removing listener works - call listener_remove(id2) -+ call setline(1, ['one one', 'two']) -+ call listener_flush() - let s:list = [] - let s:list2 = [] - call setline(3, 'three') -*************** -*** 47,58 **** - call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}], s:list) - call assert_equal([], s:list2) - - " the "o" command first adds an empty line and then changes it - let s:list = [] - exe "normal Gofour\<Esc>" - redraw -! call assert_equal([{'lnum': 4, 'end': 4, 'col': 1, 'added': 1}, -! \ {'lnum': 4, 'end': 5, 'col': 1, 'added': 0}], s:list) - - " Remove last listener - let s:list = [] ---- 53,94 ---- - call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}], s:list) - call assert_equal([], s:list2) - -+ " a change above a previous change without a line number change is reported -+ " together -+ call setline(1, ['one one', 'two']) -+ call listener_flush() -+ call append(2, 'two two') -+ call setline(1, 'something') -+ call listener_flush() -+ call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}, -+ \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list) -+ -+ " an insert just above a previous change that was the last one gets merged -+ call setline(1, ['one one', 'two']) -+ call listener_flush() -+ call setline(2, 'something') -+ call append(1, 'two two') -+ call listener_flush() -+ call assert_equal([{'lnum': 2, 'end': 3, 'col': 1, 'added': 1}], s:list) -+ -+ " an insert above a previous change causes a flush -+ call setline(1, ['one one', 'two']) -+ call listener_flush() -+ call setline(2, 'something') -+ call append(0, 'two two') -+ call assert_equal([{'lnum': 2, 'end': 3, 'col': 1, 'added': 0}], s:list) -+ call listener_flush() -+ call assert_equal([{'lnum': 1, 'end': 1, 'col': 1, 'added': 1}], s:list) -+ - " the "o" command first adds an empty line and then changes it -+ %del -+ call setline(1, ['one one', 'two']) -+ call listener_flush() - let s:list = [] - exe "normal Gofour\<Esc>" - redraw -! call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}, -! \ {'lnum': 3, 'end': 4, 'col': 1, 'added': 0}], s:list) - - " Remove last listener - let s:list = [] -*************** -*** 62,68 **** - call assert_equal([], s:list) - - " Trying to change the list fails -! let id = listener_add({l -> s:EvilStoreList(l)}) - let s:list3 = [] - call setline(1, 'asdfasdf') - redraw ---- 98,104 ---- - call assert_equal([], s:list) - - " Trying to change the list fails -! let id = listener_add({b, s, e, a, l -> s:EvilStoreList(l)}) - let s:list3 = [] - call setline(1, 'asdfasdf') - redraw -*************** -*** 72,80 **** - bwipe! - endfunc - -! func s:StoreBufList(buf, l) - let s:bufnr = a:buf -! let s:list = a:l - endfunc - - func Test_listening_other_buf() ---- 108,171 ---- - bwipe! - endfunc - -! func s:StoreListArgs(buf, start, end, added, list) -! let s:buf = a:buf -! let s:start = a:start -! let s:end = a:end -! let s:added = a:added -! let s:list = a:list -! endfunc -! -! func Test_listener_args() -! new -! call setline(1, ['one', 'two']) -! let s:list = [] -! let id = listener_add('s:StoreListArgs') -! -! " just one change -! call setline(1, 'one one') -! call listener_flush() -! call assert_equal(bufnr(''), s:buf) -! call assert_equal(1, s:start) -! call assert_equal(2, s:end) -! call assert_equal(0, s:added) -! call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list) -! -! " two disconnected changes -! call setline(1, ['one', 'two', 'three', 'four']) -! call listener_flush() -! call setline(1, 'one one') -! call setline(3, 'three three') -! call listener_flush() -! call assert_equal(bufnr(''), s:buf) -! call assert_equal(1, s:start) -! call assert_equal(4, s:end) -! call assert_equal(0, s:added) -! call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}, -! \ {'lnum': 3, 'end': 4, 'col': 1, 'added': 0}], s:list) -! -! " add and remove lines -! call setline(1, ['one', 'two', 'three', 'four', 'five', 'six']) -! call listener_flush() -! call append(2, 'two two') -! 4del -! call append(5, 'five five') -! call listener_flush() -! call assert_equal(bufnr(''), s:buf) -! call assert_equal(3, s:start) -! call assert_equal(6, s:end) -! call assert_equal(1, s:added) -! call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}, -! \ {'lnum': 4, 'end': 5, 'col': 1, 'added': -1}, -! \ {'lnum': 6, 'end': 6, 'col': 1, 'added': 1}], s:list) -! -! call listener_remove(id) -! bwipe! -! endfunc -! -! func s:StoreBufList(buf, start, end, added, list) - let s:bufnr = a:buf -! let s:list = a:list - endfunc - - func Test_listening_other_buf() -*************** -*** 82,88 **** - call setline(1, ['one', 'two']) - let bufnr = bufnr('') - normal ww -! let id = listener_add(function('s:StoreBufList', [bufnr]), bufnr) - let s:list = [] - call setbufline(bufnr, 1, 'hello') - redraw ---- 173,179 ---- - call setline(1, ['one', 'two']) - let bufnr = bufnr('') - normal ww -! let id = listener_add(function('s:StoreBufList'), bufnr) - let s:list = [] - call setbufline(bufnr, 1, 'hello') - redraw -*** ../vim-8.1.1331/src/version.c 2019-05-14 17:57:14.861402461 +0200 ---- src/version.c 2019-05-14 21:18:19.926188697 +0200 -*************** -*** 769,770 **** ---- 769,772 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 1332, - /**/ - --- -Hanson's Treatment of Time: - There are never enough hours in a day, but always too - many days before Saturday. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ an exciting new programming language -- http://www.Zimbu.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |