]> granicus.if.org Git - vim/commitdiff
For conceal mode: when two different syntax items follow each other, show the
authorBram Moolenaar <Bram@vim.org>
Thu, 22 Jul 2010 20:16:29 +0000 (22:16 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 22 Jul 2010 20:16:29 +0000 (22:16 +0200)
replacement character for both.

src/proto/syntax.pro
src/screen.c
src/syntax.c

index b2d63fdd79a55120bc80dd4cecdc5ec3b7ff5b36..12dc9dec3b945b4d196b38f82a65eb5440f4bbcd 100644 (file)
@@ -4,7 +4,7 @@ void syn_stack_free_all __ARGS((synblock_T *block));
 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 *p_flags, int *can_spell, int keep_state));
+int get_syntax_attr __ARGS((colnr_T col, int *can_spell, int keep_state));
 void syntax_clear __ARGS((synblock_T *block));
 void reset_synblock __ARGS((win_T *wp));
 void ex_syntax __ARGS((exarg_T *eap));
@@ -15,6 +15,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 keep_state));
+int get_syntax_info __ARGS((int *idp));
 int syn_get_sub_char __ARGS((void));
 int syn_get_stack_item __ARGS((int i));
 int syn_get_foldlevel __ARGS((win_T *wp, long lnum));
index 69df0b2cde48ec4a90a820048b68cad455fd16d2..71eb16fca595b50d0eaeebf6d0a758fd5a41657a 100644 (file)
@@ -2775,8 +2775,9 @@ win_line(wp, lnum, startrow, endrow, nochange)
 
 #ifdef FEAT_CONCEAL
     int                syntax_flags    = 0;
+    int                syntax_id       = 0;
+    int                prev_syntax_id  = 0;
     int                conceal_attr    = hl_attr(HLF_CONCEAL);
-    int                first_conceal   = (wp->w_p_conc != 3);
     int                is_concealing   = FALSE;
     int                boguscols       = 0;    /* nonexistent columns added to force
                                           wrapping */
@@ -4028,11 +4029,6 @@ win_line(wp, lnum, startrow, endrow, nochange)
                    did_emsg = FALSE;
 
                    syntax_attr = get_syntax_attr((colnr_T)v - 1,
-# ifdef FEAT_CONCEAL
-                                               &syntax_flags,
-# else
-                                               NULL,
-# endif
 # ifdef FEAT_SPELL
                                                has_spell ? &can_spell :
 # endif
@@ -4060,6 +4056,8 @@ win_line(wp, lnum, startrow, endrow, nochange)
                     * with line highlighting */
                    if (c == NUL)
                        syntax_flags = 0;
+                   else
+                       syntax_flags = get_syntax_info(&syntax_id);
 # endif
                }
 #endif
@@ -4388,9 +4386,12 @@ win_line(wp, lnum, startrow, endrow, nochange)
                && (syntax_flags & HL_CONCEAL) != 0)
            {
                char_attr = conceal_attr;
-               if (first_conceal
-                       && (syn_get_sub_char() != NUL || wp->w_p_conc == 1))
+               if (prev_syntax_id != syntax_id
+                       && (syn_get_sub_char() != NUL || wp->w_p_conc == 1)
+                       && wp->w_p_conc != 3)
                {
+                   /* First time at this concealed item: display one
+                    * character. */
                    if (syn_get_sub_char() != NUL)
                        c = syn_get_sub_char();
                    else if (lcs_conceal != NUL)
@@ -4398,7 +4399,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
                    else
                        c = ' ';
 
-                   first_conceal = FALSE;
+                   prev_syntax_id = syntax_id;
 
                    if (n_extra > 0)
                        vcol_off += n_extra;
@@ -4440,7 +4441,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
            }
            else
            {
-               first_conceal = (wp->w_p_conc != 3);
+               prev_syntax_id = 0;
                is_concealing = FALSE;
            }
 #endif /* FEAT_CONCEAL */
index c54984c972e821798b4614df57fc3e43253741fb..5880803645ca52064220fdae932923e1f6d34c41 100644 (file)
@@ -1755,9 +1755,8 @@ syn_finish_line(syncing)
  * done.
  */
     int
-get_syntax_attr(col, p_flags, can_spell, keep_state)
+get_syntax_attr(col, can_spell, keep_state)
     colnr_T    col;
-    int                *p_flags UNUSED;
     int                *can_spell;
     int                keep_state;     /* keep state of char at "col" */
 {
@@ -1799,10 +1798,6 @@ get_syntax_attr(col, p_flags, can_spell, keep_state)
        ++current_col;
     }
 
-#ifdef FEAT_CONCEAL
-    if (p_flags != NULL)
-       *p_flags = current_flags;
-#endif
     return attr;
 }
 
@@ -6332,12 +6327,26 @@ syn_get_id(wp, lnum, col, trans, spellp, keep_state)
            || col < current_col)
        syntax_start(wp, lnum);
 
-    (void)get_syntax_attr(col, NULL, spellp, keep_state);
+    (void)get_syntax_attr(col, spellp, keep_state);
 
     return (trans ? current_trans_id : current_id);
 }
 
 #if defined(FEAT_CONCEAL) || defined(PROTO)
+/*
+ * Get extra information about the syntax item.  Must be called right after
+ * get_syntax_attr().
+ * Stores the current item ID in "*idp".
+ * Returns the current flags.
+ */
+    int
+get_syntax_info(idp)
+    int                *idp;
+{
+    *idp = current_id;
+    return current_flags;
+}
+
 /*
  * Return conceal substitution character
  */