aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2016-10-13 01:19:09 +0200
committerGitHub <noreply@github.com>2016-10-13 01:19:09 +0200
commit5a61ff188c60a9ce6cd6bfc7bfdf5ccbd7616523 (patch)
tree6b9eb97fbd85228675c40d0e4f096c19b9d69545 /src/nvim/eval.c
parent22fe76aec47e4e2cc9207bf6659e63741a310409 (diff)
parent1b61bd93aeb40d8596df4d2cd3371748b5022120 (diff)
downloadrneovim-5a61ff188c60a9ce6cd6bfc7bfdf5ccbd7616523.tar.gz
rneovim-5a61ff188c60a9ce6cd6bfc7bfdf5ccbd7616523.tar.bz2
rneovim-5a61ff188c60a9ce6cd6bfc7bfdf5ccbd7616523.zip
Merge #5257 from jbradaric/vim-7.4.1893
vim-patch:7.4.{1893,1895}
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c48
1 files changed, 36 insertions, 12 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 4aba1ec1bb..cae032f437 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -6709,7 +6709,6 @@ static int get_env_tv(char_u **arg, typval_T *rettv, int evaluate)
# include "funcs.generated.h"
#endif
-
/*
* Function given to ExpandGeneric() to obtain the list of internal
* or user defined function names.
@@ -7712,26 +7711,47 @@ static void f_bufnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->vval.v_number = -1;
}
-/*
- * "bufwinnr(nr)" function
- */
-static void f_bufwinnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+static void buf_win_common(typval_T *argvars, typval_T *rettv, bool get_nr)
{
- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
- ++emsg_off;
+ int error = false;
+ (void)get_tv_number_chk(&argvars[0], &error); // issue errmsg if type error
+ if (error) { // the argument has an invalid type
+ rettv->vval.v_number = -1;
+ return;
+ }
+
+ emsg_off++;
+ buf_T *buf = get_buf_tv(&argvars[0], true);
+ if (buf == NULL) { // no need to search if buffer was not found
+ rettv->vval.v_number = -1;
+ goto end;
+ }
- buf_T *buf = get_buf_tv(&argvars[0], TRUE);
int winnr = 0;
+ int winid;
bool found_buf = false;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
- ++winnr;
+ winnr++;
if (wp->w_buffer == buf) {
found_buf = true;
+ winid = wp->handle;
break;
}
}
- rettv->vval.v_number = (found_buf ? winnr : -1);
- --emsg_off;
+ rettv->vval.v_number = (found_buf ? (get_nr ? winnr : winid) : -1);
+end:
+ emsg_off--;
+}
+
+/// "bufwinid(nr)" function
+static void f_bufwinid(typval_T *argvars, typval_T *rettv, FunPtr fptr) {
+ buf_win_common(argvars, rettv, false);
+}
+
+/// "bufwinnr(nr)" function
+static void f_bufwinnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ buf_win_common(argvars, rettv, true);
}
/*
@@ -10279,7 +10299,11 @@ find_win_by_nr (
}
FOR_ALL_WINDOWS_IN_TAB(wp, tp) {
- if (--nr <= 0) {
+ if (nr >= LOWEST_WIN_ID) {
+ if (wp->handle == nr) {
+ return wp;
+ }
+ } else if (--nr <= 0) {
return wp;
}
}