-*eval.txt* For Vim version 7.1. Last change: 2008 Jan 10
+*eval.txt* For Vim version 7.1. Last change: 2008 Jan 11
VIM REFERENCE MANUAL by Bram Moolenaar
Return a |List|, which is the stack of syntax items at the
position {lnum} and {col} in the current window. Each item in
the List is an ID like what |synID()| returns.
- The stack is the situation in between the character at "col"
- and the next character. Note that a region of only one
- character will not show up, it only exists inside that
- character, not in between characters.
The first item in the List is the outer region, following are
items contained in that one. The last one is what |synID()|
returns, unless not the whole item is highlighted or it is a
if (!transerr && lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
&& col >= 0 && col < (long)STRLEN(ml_get(lnum)))
- id = syn_get_id(curwin, lnum, (colnr_T)col, trans, NULL);
+ id = syn_get_id(curwin, lnum, (colnr_T)col, trans, NULL, FALSE);
#endif
rettv->vval.v_number = id;
&& col >= 0 && col < (long)STRLEN(ml_get(lnum))
&& rettv_list_alloc(rettv) != FAIL)
{
- (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL);
+ (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE);
for (i = 0; ; ++i)
{
id = syn_get_stack_item(i);
void syn_stack_apply_changes __ARGS((buf_T *buf));
void syntax_end_parsing __ARGS((linenr_T lnum));
int syntax_check_changed __ARGS((linenr_T lnum));
-int get_syntax_attr __ARGS((colnr_T col, int *can_spell));
+int get_syntax_attr __ARGS((colnr_T col, int *can_spell, int keep_state));
void syntax_clear __ARGS((buf_T *buf));
void ex_syntax __ARGS((exarg_T *eap));
int syntax_present __ARGS((buf_T *buf));
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_id __ARGS((win_T *wp, long lnum, colnr_T col, int trans, int *spellp, int keep_state));
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));
static int syn_stack_equal __ARGS((synstate_T *sp));
static void validate_current_state __ARGS((void));
static int syn_finish_line __ARGS((int syncing));
-static int syn_current_attr __ARGS((int syncing, int displaying, int *can_spell));
+static int syn_current_attr __ARGS((int syncing, int displaying, int *can_spell, int keep_state));
static int did_match_already __ARGS((int idx, garray_T *gap));
static stateitem_T *push_next_match __ARGS((stateitem_T *cur_si));
static void check_state_ends __ARGS((void));
{
while (!current_finished)
{
- (void)syn_current_attr(syncing, FALSE, NULL);
+ (void)syn_current_attr(syncing, FALSE, NULL, FALSE);
/*
* When syncing, and found some item, need to check the item.
*/
* done.
*/
int
-get_syntax_attr(col, can_spell)
+get_syntax_attr(col, can_spell, keep_state)
colnr_T col;
int *can_spell;
+ int keep_state; /* keep state of char at "col" */
{
int attr = 0;
*/
while (current_col <= col)
{
- attr = syn_current_attr(FALSE, TRUE, can_spell);
+ attr = syn_current_attr(FALSE, TRUE, can_spell,
+ current_col == col ? keep_state : FALSE);
++current_col;
}
* Get syntax attributes for current_lnum, current_col.
*/
static int
-syn_current_attr(syncing, displaying, can_spell)
+syn_current_attr(syncing, displaying, can_spell, keep_state)
int syncing; /* When 1: called for syncing */
int displaying; /* result will be displayed */
int *can_spell; /* return: do spell checking */
+ int keep_state; /* keep syntax stack afterwards */
{
int syn_id;
lpos_T endpos; /* was: char_u *endp; */
* may be for an empty match and a containing item might end in the
* current column.
*/
- if (!syncing)
+ if (!syncing && !keep_state)
{
check_state_ends();
if (current_state.ga_len > 0
* Function called for expression evaluation: get syntax ID at file position.
*/
int
-syn_get_id(wp, lnum, col, trans, spellp)
+syn_get_id(wp, lnum, col, trans, spellp, keep_state)
win_T *wp;
long lnum;
colnr_T col;
- int trans; /* remove transparancy */
- int *spellp; /* return: can do spell checking */
+ int trans; /* remove transparancy */
+ int *spellp; /* return: can do spell checking */
+ int keep_state; /* keep state of char at "col" */
{
/* When the position is not after the current position and in the same
* line of the same buffer, need to restart parsing. */
|| col < current_col)
syntax_start(wp, lnum);
- (void)get_syntax_attr(col, spellp);
+ (void)get_syntax_attr(col, spellp, keep_state);
return (trans ? current_trans_id : current_id);
}
syn_get_stack_item(i)
int i;
{
- if (i >= current_state.ga_len )
+ if (i >= current_state.ga_len)
+ {
+ /* Need to invalidate the state, because we didn't properly finish it
+ * for the last character, "keep_state" was TRUE. */
+ invalidate_current_state();
+ current_col = MAXCOL;
return -1;
+ }
return CUR_STATE(i).si_id;
}
#endif