changeset 13020:58cce40c965b v8.0.1386

patch 8.0.1386: cannot select modified buffers with getbufinfo() commit https://github.com/vim/vim/commit/8e6a31df81113bbf0e4bb5324a74dc5f6c62a490 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Dec 10 21:06:22 2017 +0100 patch 8.0.1386: cannot select modified buffers with getbufinfo() Problem: Cannot select modified buffers with getbufinfo(). Solution: Add the "bufmodified" flag. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/2431)
author Christian Brabandt <cb@256bit.org>
date Sun, 10 Dec 2017 21:15:05 +0100
parents d4f4479e8e51
children b874913e5f83
files runtime/doc/eval.txt src/evalfunc.c src/testdir/test_bufwintabinfo.vim src/version.c
diffstat 4 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -4173,6 +4173,7 @@ getbufinfo([{dict}])
 		be specified in {dict}:
 			buflisted	include only listed buffers.
 			bufloaded	include only loaded buffers.
+			bufmodified	include only modified buffers.
 
 		Otherwise, {expr} specifies a particular buffer to return
 		information for.  For the use of {expr}, see |bufname()|
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -4137,6 +4137,7 @@ f_getbufinfo(typval_T *argvars, typval_T
     int		filtered = FALSE;
     int		sel_buflisted = FALSE;
     int		sel_bufloaded = FALSE;
+    int		sel_bufmodified = FALSE;
 
     if (rettv_list_alloc(rettv) != OK)
 	return;
@@ -4159,6 +4160,10 @@ f_getbufinfo(typval_T *argvars, typval_T
 	    di = dict_find(sel_d, (char_u *)"bufloaded", -1);
 	    if (di != NULL && get_tv_number(&di->di_tv))
 		sel_bufloaded = TRUE;
+
+	    di = dict_find(sel_d, (char_u *)"bufmodified", -1);
+	    if (di != NULL && get_tv_number(&di->di_tv))
+		sel_bufmodified = TRUE;
 	}
     }
     else if (argvars[0].v_type != VAR_UNKNOWN)
@@ -4178,7 +4183,8 @@ f_getbufinfo(typval_T *argvars, typval_T
 	if (argbuf != NULL && argbuf != buf)
 	    continue;
 	if (filtered && ((sel_bufloaded && buf->b_ml.ml_mfp == NULL)
-					   || (sel_buflisted && !buf->b_p_bl)))
+			|| (sel_buflisted && !buf->b_p_bl)
+			|| (sel_bufmodified && !buf->b_changed)))
 	    continue;
 
 	d = get_buffer_info(buf);
--- a/src/testdir/test_bufwintabinfo.vim
+++ b/src/testdir/test_bufwintabinfo.vim
@@ -20,6 +20,13 @@ function Test_getbufwintabinfo()
     call assert_equal('vim', l[0].variables.editor)
     call assert_notequal(-1, index(l[0].windows, bufwinid('%')))
 
+    " Test for getbufinfo() with 'bufmodified'
+    call assert_equal(0, len(getbufinfo({'bufmodified' : 1})))
+    call setbufline('Xtestfile1', 1, ["Line1"])
+    let l = getbufinfo({'bufmodified' : 1})
+    call assert_equal(1, len(l))
+    call assert_equal(bufnr('Xtestfile1'), l[0].bufnr)
+
     if has('signs')
 	call append(0, ['Linux', 'Windows', 'Mac'])
 	sign define Mark text=>> texthl=Search
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1386,
+/**/
     1385,
 /**/
     1384,