aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c83
1 files changed, 68 insertions, 15 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 7298f2e9a8..790f1081b5 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -7204,6 +7204,23 @@ static buf_T *tv_get_buf(typval_T *tv, int curtab_only)
}
/*
+ * Get the buffer from "arg" and give an error and return NULL if it is not
+ * valid.
+ */
+ static buf_T *
+get_buf_arg(typval_T *arg)
+{
+ buf_T *buf;
+
+ ++emsg_off;
+ buf = tv_get_buf(arg, FALSE);
+ --emsg_off;
+ if (buf == NULL)
+ EMSG2(_("E158: Invalid buffer name: %s"), tv_get_string(arg));
+ return buf;
+}
+
+/*
* "bufname(expr)" function
*/
static void f_bufname(typval_T *argvars, typval_T *rettv, FunPtr fptr)
@@ -15506,14 +15523,10 @@ f_sign_getplaced(typval_T *argvars, typval_T *rettv)
if (argvars[0].v_type != VAR_UNKNOWN)
{
- // get signs placed in this buffer
- buf = tv_get_buf(&argvars[0], FALSE);
+ // get signs placed in the specified buffer
+ buf = get_buf_arg(&argvars[0]);
if (buf == NULL)
- {
- EMSG2(_("E158: Invalid buffer name: %s"),
- tv_get_string(&argvars[0]));
return;
- }
if (argvars[1].v_type != VAR_UNKNOWN)
{
@@ -15553,6 +15566,53 @@ f_sign_getplaced(typval_T *argvars, typval_T *rettv)
}
/*
+ * "sign_jump()" function
+ */
+ static void
+f_sign_jump(typval_T *argvars, typval_T *rettv)
+{
+ int sign_id;
+ char_u *sign_group = NULL;
+ buf_T *buf;
+ int notanum = FALSE;
+
+ rettv->vval.v_number = -1;
+
+ // Sign identifer
+ sign_id = (int)tv_get_number_chk(&argvars[0], &notanum);
+ if (notanum)
+ return;
+ if (sign_id <= 0)
+ {
+ EMSG(_(e_invarg));
+ return;
+ }
+
+ // Sign group
+ sign_group = tv_get_string_chk(&argvars[1]);
+ if (sign_group == NULL)
+ return;
+ if (sign_group[0] == '\0')
+ sign_group = NULL; // global sign group
+ else
+ {
+ sign_group = vim_strsave(sign_group);
+ if (sign_group == NULL)
+ return;
+ }
+
+ // Buffer to place the sign
+ buf = get_buf_arg(&argvars[2]);
+ if (buf == NULL)
+ goto cleanup;
+
+ rettv->vval.v_number = sign_jump(sign_id, sign_group, buf);
+
+cleanup:
+ xfree(sign_group);
+}
+
+/*
* "sign_place()" function
*/
static void
@@ -15599,12 +15659,9 @@ f_sign_place(typval_T *argvars, typval_T *rettv)
goto cleanup;
// Buffer to place the sign
- buf = tv_get_buf(&argvars[3], FALSE);
+ buf = get_buf_arg(&argvars[3]);
if (buf == NULL)
- {
- EMSG2(_("E158: Invalid buffer name: %s"), tv_get_string(&argvars[3]));
goto cleanup;
- }
if (argvars[4].v_type != VAR_UNKNOWN)
{
@@ -15708,13 +15765,9 @@ f_sign_unplace(typval_T *argvars, typval_T *rettv)
if ((di = tv_dict_find(dict, (char_u *)"buffer", -1)) != NULL)
{
- buf = tv_get_buf(&di->di_tv, FALSE);
+ buf = get_buf_arg(&di->di_tv);
if (buf == NULL)
- {
- EMSG2(_("E158: Invalid buffer name: %s"),
- tv_get_string(&di->di_tv));
goto cleanup;
- }
}
if (tv_dict_find(dict, (char_u *)"id", -1) != NULL)
sign_id = tv_dict_get_number(dict, (char_u *)"id");