aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
authorMarco Hinz <mh.codebro+github@gmail.com>2019-04-10 10:16:32 +0200
committerGitHub <noreply@github.com>2019-04-10 10:16:32 +0200
commit21b108fe445452e6e35621184fc77623dc64f9a3 (patch)
tree8e861512afe04e03aee45fdd7a3129e8cd694d7b /src/nvim/eval.c
parentddd0eb6f5120a09b97867d2561ea61309038ccd2 (diff)
downloadrneovim-21b108fe445452e6e35621184fc77623dc64f9a3.tar.gz
rneovim-21b108fe445452e6e35621184fc77623dc64f9a3.tar.bz2
rneovim-21b108fe445452e6e35621184fc77623dc64f9a3.zip
vim-patch:8.1.1140: not easy to find out what neighbors a window has (#9873)
Problem: Not easy to find out what neighbors a window has. Solution: Add more arguments to winnr(). (Yegappan Lakshmanan) https://github.com/vim/vim/commit/46ad288b9b2a6eb0430cf802ff5ce68a58629897
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 9a67b01307..86333acbef 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -16755,6 +16755,7 @@ static int get_winnr(tabpage_T *tp, typval_T *argvar)
twin = (tp == curtab) ? curwin : tp->tp_curwin;
if (argvar->v_type != VAR_UNKNOWN) {
+ bool invalid_arg = false;
const char *const arg = tv_get_string_chk(argvar);
if (arg == NULL) {
nr = 0; // Type error; errmsg already given.
@@ -16766,6 +16767,31 @@ static int get_winnr(tabpage_T *tp, typval_T *argvar)
nr = 0;
}
} else {
+ // Extract the window count (if specified). e.g. winnr('3j')
+ char_u *endp;
+ long count = strtol((char *)arg, (char **)&endp, 10);
+ if (count <= 0) {
+ // if count is not specified, default to 1
+ count = 1;
+ }
+ if (endp != NULL && *endp != '\0') {
+ if (strequal((char *)endp, "j")) {
+ twin = win_vert_neighbor(tp, twin, false, count);
+ } else if (strequal((char *)endp, "k")) {
+ twin = win_vert_neighbor(tp, twin, true, count);
+ } else if (strequal((char *)endp, "h")) {
+ twin = win_horz_neighbor(tp, twin, true, count);
+ } else if (strequal((char *)endp, "l")) {
+ twin = win_horz_neighbor(tp, twin, false, count);
+ } else {
+ invalid_arg = true;
+ }
+ } else {
+ invalid_arg = true;
+ }
+ }
+
+ if (invalid_arg) {
EMSG2(_(e_invexpr2), arg);
nr = 0;
}