diff src/evalfunc.c @ 16271:243cdc183ec9 v8.1.1140

patch 8.1.1140: not easy to find out what neighbors a window has commit https://github.com/vim/vim/commit/46ad288b9b2a6eb0430cf802ff5ce68a58629897 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Apr 8 20:01:47 2019 +0200 patch 8.1.1140: not easy to find out what neighbors a window has Problem: Not easy to find out what neighbors a window has. Solution: Add more arguments to winnr(). (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/3993)
author Bram Moolenaar <Bram@vim.org>
date Mon, 08 Apr 2019 20:15:05 +0200
parents d3377393e3d9
children 514e42de6a1d
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -13982,6 +13982,8 @@ get_winnr(tabpage_T *tp, typval_T *argva
     twin = (tp == curtab) ? curwin : tp->tp_curwin;
     if (argvar->v_type != VAR_UNKNOWN)
     {
+	int	invalid_arg = FALSE;
+
 	arg = tv_get_string_chk(argvar);
 	if (arg == NULL)
 	    nr = 0;		/* type error; errmsg already given */
@@ -13995,6 +13997,32 @@ get_winnr(tabpage_T *tp, typval_T *argva
 	}
 	else
 	{
+	    long	count;
+	    char_u	*endp;
+
+	    // Extract the window count (if specified). e.g. winnr('3j')
+	    count = strtol((char *)arg, (char **)&endp, 10);
+	    if (count <= 0)
+		count = 1;	// if count is not specified, default to 1
+	    if (endp != NULL && *endp != '\0')
+	    {
+		if (STRCMP(endp, "j") == 0)
+		    twin = win_vert_neighbor(tp, twin, FALSE, count);
+		else if (STRCMP(endp, "k") == 0)
+		    twin = win_vert_neighbor(tp, twin, TRUE, count);
+		else if (STRCMP(endp, "h") == 0)
+		    twin = win_horz_neighbor(tp, twin, TRUE, count);
+		else if (STRCMP(endp, "l") == 0)
+		    twin = win_horz_neighbor(tp, twin, FALSE, count);
+		else
+		    invalid_arg = TRUE;
+	    }
+	    else
+		invalid_arg = TRUE;
+	}
+
+	if (invalid_arg)
+	{
 	    semsg(_(e_invexpr2), arg);
 	    nr = 0;
 	}