diff options
Diffstat (limited to 'data/vim/patches/8.1.1321')
-rw-r--r-- | data/vim/patches/8.1.1321 | 405 |
1 files changed, 405 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1321 b/data/vim/patches/8.1.1321 new file mode 100644 index 000000000..feb3fe874 --- /dev/null +++ b/data/vim/patches/8.1.1321 @@ -0,0 +1,405 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1321 +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.1321 +Problem: No docs or tests for listener functions. +Solution: Add help and tests for listener_add() and listener_remove(). + Invoke the callbacks before redrawing. +Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, + src/testdir/test_listener.vim, src/testdir/Make_all.mak, + src/change.c, src/screen.c, src/evalfunc.c, src/proto/evalfunc.pro + + +*** ../vim-8.1.1320/runtime/doc/eval.txt 2019-05-09 21:08:53.764083394 +0200 +--- runtime/doc/eval.txt 2019-05-11 20:54:59.593866827 +0200 +*************** +*** 2457,2462 **** +--- 2457,2465 ---- + line2byte({lnum}) Number byte count of line {lnum} + lispindent({lnum}) Number Lisp indent for line {lnum} + list2str({list} [, {utf8}]) String turn numbers in {list} into a String ++ listener_add({callback} [, {buf}]) ++ Number add a callback to listen to changes ++ listener_remove({id}) none remove a listener callback + localtime() Number current time + log({expr}) Float natural logarithm (base e) of {expr} + log10({expr}) Float logarithm of Float {expr} to base 10 +*************** +*** 6311,6316 **** +--- 6314,6366 ---- + With utf-8 composing characters work as expected: > + list2str([97, 769]) returns "á" + < ++ listener_add({callback} [, {buf}]) *listener_add()* ++ Add a callback function that will be invoked when changes have ++ been made to buffer {buf}. ++ {buf} refers to a buffer name or number. For the accepted ++ values, see |bufname()|. When {buf} is omitted the current ++ 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. Each list item is a dictionary with these entries: ++ lnum the first line number of the change ++ end the first line below the change ++ added number of lines added; negative if lines were ++ deleted ++ col first column in "lnum" that was affected by ++ the change; one if unknown or the whole line ++ was affected; this is a byte index, first ++ character has a value of one. ++ When lines are inserted the values are: ++ 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 {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 ++ of a buffer. ++ The {callback} is also not invoked when the buffer is ++ unloaded, use the |BufUnload| autocmd event for that. ++ ++ listener_remove({id}) *listener_remove()* ++ Remove a listener previously added with listener_add(). ++ + localtime() *localtime()* + Return the current time, measured as seconds since 1st Jan + 1970. See also |strftime()| and |getftime()|. +*** ../vim-8.1.1320/runtime/doc/usr_41.txt 2019-05-09 14:52:22.079358841 +0200 +--- runtime/doc/usr_41.txt 2019-05-11 19:31:29.403995607 +0200 +*************** +*** 812,817 **** +--- 812,819 ---- + setbufline() replace a line in the specified buffer + appendbufline() append a list of lines in the specified buffer + deletebufline() delete lines from a specified buffer ++ listener_add() add a callback to listen to changes ++ listener_remove() remove a listener callback + win_findbuf() find windows containing a buffer + win_getid() get window ID of a window + win_gotoid() go to window with ID +*** ../vim-8.1.1320/src/testdir/test_listener.vim 2019-05-11 21:10:55.957195196 +0200 +--- src/testdir/test_listener.vim 2019-05-11 20:52:44.750502230 +0200 +*************** +*** 0 **** +--- 1,77 ---- ++ " tests for listener_add() and listener_remove() ++ ++ func StoreList(l) ++ let g:list = a:l ++ endfunc ++ ++ func AnotherStoreList(l) ++ let g:list2 = a:l ++ endfunc ++ ++ func EvilStoreList(l) ++ let g:list3 = a:l ++ call assert_fails("call add(a:l, 'myitem')", "E742:") ++ endfunc ++ ++ func Test_listening() ++ new ++ call setline(1, ['one', 'two']) ++ let id = listener_add({l -> StoreList(l)}) ++ call setline(1, 'one one') ++ redraw ++ call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], g:list) ++ ++ " Two listeners, both get called. ++ let id2 = listener_add({l -> AnotherStoreList(l)}) ++ let g:list = [] ++ let g:list2 = [] ++ exe "normal $asome\<Esc>" ++ redraw ++ call assert_equal([{'lnum': 1, 'end': 2, 'col': 8, 'added': 0}], g:list) ++ call assert_equal([{'lnum': 1, 'end': 2, 'col': 8, 'added': 0}], g:list2) ++ ++ call listener_remove(id2) ++ let g:list = [] ++ let g:list2 = [] ++ call setline(3, 'three') ++ redraw ++ call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}], g:list) ++ call assert_equal([], g:list2) ++ ++ " the "o" command first adds an empty line and then changes it ++ let g: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}], g:list) ++ ++ let g:list = [] ++ call listener_remove(id) ++ call setline(1, 'asdfasdf') ++ redraw ++ call assert_equal([], g:list) ++ ++ " Trying to change the list fails ++ let id = listener_add({l -> EvilStoreList(l)}) ++ let g:list3 = [] ++ call setline(1, 'asdfasdf') ++ redraw ++ call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], g:list3) ++ ++ bwipe! ++ endfunc ++ ++ func Test_listening_other_buf() ++ new ++ call setline(1, ['one', 'two']) ++ let bufnr = bufnr('') ++ normal ww ++ let id = listener_add({l -> StoreList(l)}, bufnr) ++ let g:list = [] ++ call setbufline(bufnr, 1, 'hello') ++ redraw ++ call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], g:list) ++ ++ exe "buf " .. bufnr ++ bwipe! ++ endfunc +*** ../vim-8.1.1320/src/testdir/Make_all.mak 2019-05-09 14:52:22.083358820 +0200 +--- src/testdir/Make_all.mak 2019-05-11 19:33:38.615264428 +0200 +*************** +*** 168,173 **** +--- 168,174 ---- + test_lispwords \ + test_listchars \ + test_listdict \ ++ test_listener \ + test_listlbr \ + test_listlbr_utf8 \ + test_lua \ +*************** +*** 359,364 **** +--- 360,366 ---- + test_lineending.res \ + test_listchars.res \ + test_listdict.res \ ++ test_listener.res \ + test_listlbr.res \ + test_lua.res \ + test_makeencoding.res \ +*** ../vim-8.1.1320/src/change.c 2019-05-11 19:14:11.585314006 +0200 +--- src/change.c 2019-05-11 21:13:09.368532894 +0200 +*************** +*** 184,190 **** + dict_add_number(dict, "lnum", (varnumber_T)lnum); + dict_add_number(dict, "end", (varnumber_T)lnume); + dict_add_number(dict, "added", (varnumber_T)xtra); +! dict_add_number(dict, "col", (varnumber_T)col); + + list_append_dict(recorded_changes, dict); + } +--- 184,190 ---- + dict_add_number(dict, "lnum", (varnumber_T)lnum); + dict_add_number(dict, "end", (varnumber_T)lnume); + dict_add_number(dict, "added", (varnumber_T)xtra); +! dict_add_number(dict, "col", (varnumber_T)col + 1); + + list_append_dict(recorded_changes, dict); + } +*************** +*** 198,216 **** + char_u *callback; + partial_T *partial; + listener_T *lnr; + + callback = get_callback(&argvars[0], &partial); + if (callback == NULL) + return; + + lnr = (listener_T *)alloc_clear((sizeof(listener_T))); + if (lnr == NULL) + { + free_callback(callback, partial); + return; + } +! lnr->lr_next = curbuf->b_listener; +! curbuf->b_listener = lnr; + + if (partial == NULL) + lnr->lr_callback = vim_strsave(callback); +--- 198,224 ---- + char_u *callback; + partial_T *partial; + listener_T *lnr; ++ buf_T *buf = curbuf; + + callback = get_callback(&argvars[0], &partial); + if (callback == NULL) + return; + ++ if (argvars[1].v_type != VAR_UNKNOWN) ++ { ++ buf = get_buf_arg(&argvars[1]); ++ if (buf == NULL) ++ return; ++ } ++ + lnr = (listener_T *)alloc_clear((sizeof(listener_T))); + if (lnr == NULL) + { + free_callback(callback, partial); + return; + } +! lnr->lr_next = buf->b_listener; +! buf->b_listener = lnr; + + if (partial == NULL) + lnr->lr_callback = vim_strsave(callback); +*************** +*** 232,253 **** + listener_T *next; + listener_T *prev = NULL; + int id = tv_get_number(argvars); +! buf_T *buf = curbuf; + +! for (lnr = buf->b_listener; lnr != NULL; lnr = next) +! { +! next = lnr->lr_next; +! if (lnr->lr_id == id) + { +! if (prev != NULL) +! prev->lr_next = lnr->lr_next; +! else +! buf->b_listener = lnr->lr_next; +! free_callback(lnr->lr_callback, lnr->lr_partial); +! vim_free(lnr); + } +- prev = lnr; +- } + } + + /* +--- 240,262 ---- + listener_T *next; + listener_T *prev = NULL; + int id = tv_get_number(argvars); +! buf_T *buf; + +! for (buf = firstbuf; buf != NULL; buf = buf->b_next) +! for (lnr = buf->b_listener; lnr != NULL; lnr = next) + { +! next = lnr->lr_next; +! if (lnr->lr_id == id) +! { +! if (prev != NULL) +! prev->lr_next = lnr->lr_next; +! else +! buf->b_listener = lnr->lr_next; +! free_callback(lnr->lr_callback, lnr->lr_partial); +! vim_free(lnr); +! } +! prev = lnr; + } + } + + /* +*** ../vim-8.1.1320/src/screen.c 2019-05-09 15:12:45.176723907 +0200 +--- src/screen.c 2019-05-11 19:53:53.403623537 +0200 +*************** +*** 564,569 **** +--- 564,574 ---- + type = 0; + } + ++ #ifdef FEAT_EVAL ++ // Before updating the screen, notify any listeners of changed text. ++ invoke_listeners(); ++ #endif ++ + if (must_redraw) + { + if (type < must_redraw) /* use maximal type */ +*** ../vim-8.1.1320/src/evalfunc.c 2019-05-11 18:28:41.351611622 +0200 +--- src/evalfunc.c 2019-05-11 20:44:57.028591441 +0200 +*************** +*** 2009,2020 **** + return buf; + } + +- #ifdef FEAT_SIGNS + /* + * Get the buffer from "arg" and give an error and return NULL if it is not + * valid. + */ +! static buf_T * + get_buf_arg(typval_T *arg) + { + buf_T *buf; +--- 2009,2019 ---- + return buf; + } + + /* + * Get the buffer from "arg" and give an error and return NULL if it is not + * valid. + */ +! buf_T * + get_buf_arg(typval_T *arg) + { + buf_T *buf; +*************** +*** 2026,2032 **** + semsg(_("E158: Invalid buffer name: %s"), tv_get_string(arg)); + return buf; + } +- #endif + + /* + * "bufname(expr)" function +--- 2025,2030 ---- +*** ../vim-8.1.1320/src/proto/evalfunc.pro 2019-01-03 22:19:22.227686199 +0100 +--- src/proto/evalfunc.pro 2019-05-11 20:45:17.040507331 +0200 +*************** +*** 5,10 **** +--- 5,11 ---- + int call_internal_func(char_u *name, int argcount, typval_T *argvars, typval_T *rettv); + buf_T *buflist_find_by_name(char_u *name, int curtab_only); + buf_T *tv_get_buf(typval_T *tv, int curtab_only); ++ buf_T *get_buf_arg(typval_T *arg); + void execute_redir_str(char_u *value, int value_len); + void mzscheme_call_vim(char_u *name, typval_T *args, typval_T *rettv); + float_T vim_round(float_T f); +*** ../vim-8.1.1320/src/version.c 2019-05-11 19:14:11.589313987 +0200 +--- src/version.c 2019-05-11 19:37:27.213616239 +0200 +*************** +*** 769,770 **** +--- 769,772 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1321, + /**/ + +-- +System administrators are just like women: You can't live with them and you +can't live without them. + + /// 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 /// |