aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2014-09-16 23:28:35 -0400
committerJustin M. Keyes <justinkz@gmail.com>2014-09-16 23:28:35 -0400
commit8249e4ac72b54d00addb597a124d0f55566b2466 (patch)
treed7eea141a3e0025fa0382fd8cc469963e5d5c3cc /src
parent8d6540f8764c4a691e22890258599d74b43b52e6 (diff)
parente32d338c87957e7fddcaa1c3393268663a171617 (diff)
downloadrneovim-8249e4ac72b54d00addb597a124d0f55566b2466.tar.gz
rneovim-8249e4ac72b54d00addb597a124d0f55566b2466.tar.bz2
rneovim-8249e4ac72b54d00addb597a124d0f55566b2466.zip
Merge pull request #919 from munshkr/p7.4.310
vim-patch:7.4.310, vim-patch:7.4.313
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c58
-rw-r--r--src/nvim/testdir/test_eval.in21
-rw-r--r--src/nvim/testdir/test_eval.ok2
-rw-r--r--src/nvim/version.c4
4 files changed, 65 insertions, 20 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 7793f5040c..e750da01f0 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -6387,6 +6387,7 @@ static struct fst {
{"getcmdline", 0, 0, f_getcmdline},
{"getcmdpos", 0, 0, f_getcmdpos},
{"getcmdtype", 0, 0, f_getcmdtype},
+ {"getcurpos", 0, 0, f_getcurpos},
{"getcwd", 0, 0, f_getcwd},
{"getfontname", 0, 1, f_getfontname},
{"getfperm", 1, 1, f_getfperm},
@@ -7863,12 +7864,17 @@ static void f_cursor(typval_T *argvars, typval_T *rettv)
rettv->vval.v_number = -1;
if (argvars[1].v_type == VAR_UNKNOWN) {
pos_T pos;
+ colnr_T curswant = -1;
- if (list2fpos(argvars, &pos, NULL) == FAIL)
+ if (list2fpos(argvars, &pos, NULL, &curswant) == FAIL) {
return;
+ }
line = pos.lnum;
col = pos.col;
coladd = pos.coladd;
+ if (curswant >= 0) {
+ curwin->w_curswant = curswant - 1;
+ }
} else {
line = get_tv_lnum(argvars);
col = get_tv_number_chk(&argvars[1], NULL);
@@ -9373,10 +9379,7 @@ static void f_getpid(typval_T *argvars, typval_T *rettv)
rettv->vval.v_number = os_get_pid();
}
-/*
- * "getpos(string)" function
- */
-static void f_getpos(typval_T *argvars, typval_T *rettv)
+static void getpos_both(typval_T *argvars, typval_T *rettv, bool getcurpos)
{
pos_T *fp;
list_T *l;
@@ -9384,7 +9387,11 @@ static void f_getpos(typval_T *argvars, typval_T *rettv)
rettv_list_alloc(rettv);
l = rettv->vval.v_list;
- fp = var2fpos(&argvars[0], TRUE, &fnum);
+ if (getcurpos) {
+ fp = &curwin->w_cursor;
+ } else {
+ fp = var2fpos(&argvars[0], true, &fnum);
+ }
list_append_number(l, (fnum != -1) ? (varnumber_T)fnum : (varnumber_T)0);
list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum : (varnumber_T)0);
list_append_number(l,
@@ -9393,6 +9400,25 @@ static void f_getpos(typval_T *argvars, typval_T *rettv)
: (varnumber_T)0);
list_append_number(l,
(fp != NULL) ? (varnumber_T)fp->coladd : (varnumber_T)0);
+ if (getcurpos) {
+ list_append_number(l, (varnumber_T) curwin->w_curswant + 1);
+ }
+}
+
+/*
+ * "getcurpos(string)" function
+ */
+static void f_getcurpos(typval_T *argvars, typval_T *rettv)
+{
+ getpos_both(argvars, rettv, true);
+}
+
+/*
+ * "getpos(string)" function
+ */
+static void f_getpos(typval_T *argvars, typval_T *rettv)
+{
+ getpos_both(argvars, rettv, false);
}
/*
@@ -13118,17 +13144,21 @@ static void f_setpos(typval_T *argvars, typval_T *rettv)
pos_T pos;
int fnum;
char_u *name;
+ colnr_T curswant = -1;
rettv->vval.v_number = -1;
name = get_tv_string_chk(argvars);
if (name != NULL) {
- if (list2fpos(&argvars[1], &pos, &fnum) == OK) {
+ if (list2fpos(&argvars[1], &pos, &fnum, &curswant) == OK) {
if (--pos.col < 0)
pos.col = 0;
if (name[0] == '.' && name[1] == NUL) {
/* set cursor */
if (fnum == curbuf->b_fnum) {
curwin->w_cursor = pos;
+ if (curswant >= 0) {
+ curwin->w_curswant = curswant - 1;
+ }
check_cursor();
rettv->vval.v_number = 0;
} else
@@ -15177,18 +15207,18 @@ var2fpos (
* Return FAIL when conversion is not possible, doesn't check the position for
* validity.
*/
-static int list2fpos(typval_T *arg, pos_T *posp, int *fnump)
+static int list2fpos(typval_T *arg, pos_T *posp, int *fnump, colnr_T *curswantp)
{
list_T *l = arg->vval.v_list;
long i = 0;
long n;
- /* List must be: [fnum, lnum, col, coladd], where "fnum" is only there
- * when "fnump" isn't NULL and "coladd" is optional. */
+ /* List must be: [fnum, lnum, col, coladd, curswant], where "fnum" is only
+ * there when "fnump" isn't NULL; "coladd" and "curswant" are optional. */
if (arg->v_type != VAR_LIST
|| l == NULL
|| l->lv_len < (fnump == NULL ? 2 : 3)
- || l->lv_len > (fnump == NULL ? 3 : 4))
+ || l->lv_len > (fnump == NULL ? 4 : 5))
return FAIL;
if (fnump != NULL) {
@@ -15210,12 +15240,16 @@ static int list2fpos(typval_T *arg, pos_T *posp, int *fnump)
return FAIL;
posp->col = n;
- n = list_find_nr(l, i, NULL);
+ n = list_find_nr(l, i, NULL); // off
if (n < 0)
posp->coladd = 0;
else
posp->coladd = n;
+ if (curswantp != NULL) {
+ *curswantp = list_find_nr(l, i + 1, NULL); // curswant
+ }
+
return OK;
}
diff --git a/src/nvim/testdir/test_eval.in b/src/nvim/testdir/test_eval.in
index c34f5cb50e..a29fefc3b6 100644
--- a/src/nvim/testdir/test_eval.in
+++ b/src/nvim/testdir/test_eval.in
@@ -1,7 +1,7 @@
STARTTEST
-
-:e test.out
-:%d
+:so small.vim
+:set encoding=latin1
+:set noswapfile
:" function name not starting with a capital
:try
@@ -49,9 +49,18 @@ STARTTEST
: $put =v:exception
:endtry
-:1d
-:w
-:qa!
+:$put ='{{{1 getcurpos/setpos'
+/^012345678
+6l:let sp = getcurpos()
+0:call setpos('.', sp)
+jyl:$put
+:/^start:/+1,$wq! test.out
+:" vim: et ts=4 isk-=\: fmr=???,???
+:call getchar()
ENDTEST
+012345678
+012345678
+
+start:
diff --git a/src/nvim/testdir/test_eval.ok b/src/nvim/testdir/test_eval.ok
index 162e1b12fd..63b9156442 100644
--- a/src/nvim/testdir/test_eval.ok
+++ b/src/nvim/testdir/test_eval.ok
@@ -9,3 +9,5 @@ func s:Testje exists: 1
Bar exists: 1
func Bar exists: 1
Vim(call):E116: Invalid arguments for function append
+{{{1 getcurpos/setpos
+6
diff --git a/src/nvim/version.c b/src/nvim/version.c
index bf0dace6ef..1d0366f083 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -282,10 +282,10 @@ static int included_patches[] = {
//316 NA
315,
314,
- //313,
+ 313,
312,
//311,
- //310,
+ 310,
309,
308,
//307 NA