diff options
author | Marco Hinz <mh.codebro+github@gmail.com> | 2019-04-10 10:16:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-10 10:16:32 +0200 |
commit | 21b108fe445452e6e35621184fc77623dc64f9a3 (patch) | |
tree | 8e861512afe04e03aee45fdd7a3129e8cd694d7b /src/nvim/eval.c | |
parent | ddd0eb6f5120a09b97867d2561ea61309038ccd2 (diff) | |
download | rneovim-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.c | 26 |
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; } |