Mercurial > vim
diff src/change.c @ 16638:4790302965fc v8.1.1321
patch 8.1.1321: no docs or tests for listener functions
commit https://github.com/vim/vim/commit/a334772967de25764ed7b11d768e8b977818d0c6
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat May 11 21:14:24 2019 +0200
patch 8.1.1321: no docs or tests for listener functions
Problem: No docs or tests for listener functions.
Solution: Add help and tests for listener_add() and listener_remove().
Invoke the callbacks before redrawing.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 11 May 2019 21:15:06 +0200 |
parents | 0daf9eca3541 |
children | 04c2614af21c |
line wrap: on
line diff
--- a/src/change.c +++ b/src/change.c @@ -184,7 +184,7 @@ may_record_change( 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); + dict_add_number(dict, "col", (varnumber_T)col + 1); list_append_dict(recorded_changes, dict); } @@ -198,19 +198,27 @@ f_listener_add(typval_T *argvars, typval 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 = curbuf->b_listener; - curbuf->b_listener = lnr; + lnr->lr_next = buf->b_listener; + buf->b_listener = lnr; if (partial == NULL) lnr->lr_callback = vim_strsave(callback); @@ -232,22 +240,23 @@ f_listener_remove(typval_T *argvars, typ listener_T *next; listener_T *prev = NULL; int id = tv_get_number(argvars); - buf_T *buf = curbuf; + buf_T *buf; - for (lnr = buf->b_listener; lnr != NULL; lnr = next) - { - next = lnr->lr_next; - if (lnr->lr_id == id) + for (buf = firstbuf; buf != NULL; buf = buf->b_next) + for (lnr = buf->b_listener; lnr != NULL; lnr = next) { - 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); + 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; } - prev = lnr; - } } /*