summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/eval.c42
-rw-r--r--src/proto/syntax.pro1
-rw-r--r--src/syntax.c16
-rw-r--r--src/version.c2
4 files changed, 61 insertions, 0 deletions
diff --git a/src/eval.c b/src/eval.c
index 4afcb189c..ade6f5a1c 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -651,6 +651,7 @@ static void f_substitute __ARGS((typval_T *argvars, typval_T *rettv));
static void f_synID __ARGS((typval_T *argvars, typval_T *rettv));
static void f_synIDattr __ARGS((typval_T *argvars, typval_T *rettv));
static void f_synIDtrans __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_synstack __ARGS((typval_T *argvars, typval_T *rettv));
static void f_system __ARGS((typval_T *argvars, typval_T *rettv));
static void f_tabpagebuflist __ARGS((typval_T *argvars, typval_T *rettv));
static void f_tabpagenr __ARGS((typval_T *argvars, typval_T *rettv));
@@ -7252,6 +7253,7 @@ static struct fst
{"synID", 3, 3, f_synID},
{"synIDattr", 2, 3, f_synIDattr},
{"synIDtrans", 1, 1, f_synIDtrans},
+ {"synstack", 2, 2, f_synstack},
{"system", 1, 2, f_system},
{"tabpagebuflist", 0, 1, f_tabpagebuflist},
{"tabpagenr", 0, 1, f_tabpagenr},
@@ -15846,6 +15848,46 @@ f_synIDtrans(argvars, rettv)
}
/*
+ * "synstack(lnum, col)" function
+ */
+/*ARGSUSED*/
+ static void
+f_synstack(argvars, rettv)
+ typval_T *argvars;
+ typval_T *rettv;
+{
+#ifdef FEAT_SYN_HL
+ long lnum;
+ long col;
+ int i;
+ int id;
+#endif
+
+ rettv->v_type = VAR_LIST;
+ rettv->vval.v_list = NULL;
+
+#ifdef FEAT_SYN_HL
+ lnum = get_tv_lnum(argvars); /* -1 on type error */
+ col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
+
+ if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
+ && col >= 0 && col < (long)STRLEN(ml_get(lnum))
+ && rettv_list_alloc(rettv) != FAIL)
+ {
+ (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL);
+ for (i = 0; ; ++i)
+ {
+ id = syn_get_stack_item(i);
+ if (id < 0)
+ break;
+ if (list_append_number(rettv->vval.v_list, id) == FAIL)
+ break;
+ }
+ }
+#endif
+}
+
+/*
* "system()" function
*/
static void
diff --git a/src/proto/syntax.pro b/src/proto/syntax.pro
index 4fe080136..b6f008f6f 100644
--- a/src/proto/syntax.pro
+++ b/src/proto/syntax.pro
@@ -13,6 +13,7 @@ void set_context_in_echohl_cmd __ARGS((expand_T *xp, char_u *arg));
void set_context_in_syntax_cmd __ARGS((expand_T *xp, char_u *arg));
char_u *get_syntax_name __ARGS((expand_T *xp, int idx));
int syn_get_id __ARGS((win_T *wp, long lnum, colnr_T col, int trans, int *spellp));
+int syn_get_stack_item __ARGS((int i));
int syn_get_foldlevel __ARGS((win_T *wp, long lnum));
void init_highlight __ARGS((int both, int reset));
int load_colors __ARGS((char_u *name));
diff --git a/src/syntax.c b/src/syntax.c
index e321313be..f9fbb0129 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -6105,6 +6105,22 @@ syn_get_id(wp, lnum, col, trans, spellp)
return (trans ? current_trans_id : current_id);
}
+#if defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * Return the syntax ID at position "i" in the current stack.
+ * The caller must have called syn_get_id() before to fill the stack.
+ * Returns -1 when "i" is out of range.
+ */
+ int
+syn_get_stack_item(i)
+ int i;
+{
+ if (i >= current_state.ga_len )
+ return -1;
+ return CUR_STATE(i).si_id;
+}
+#endif
+
#if defined(FEAT_FOLDING) || defined(PROTO)
/*
* Function called to get folding level for line "lnum" in window "wp".
diff --git a/src/version.c b/src/version.c
index 0723d5331..35227e3d6 100644
--- a/src/version.c
+++ b/src/version.c
@@ -667,6 +667,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 215,
+/**/
214,
/**/
213,