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;
-    }
 }
 
 /*