0
0
mirror of https://github.com/vim/vim.git synced 2025-09-28 04:24:06 -04:00

Add the conceal patch from Vince Negri.

This commit is contained in:
Bram Moolenaar
2010-06-05 23:22:07 +02:00
parent 945e2dbb63
commit 860cae1cec
40 changed files with 1737 additions and 698 deletions

View File

@@ -485,7 +485,7 @@ update_screen(type)
# ifdef FEAT_WINDOWS
wwp == wp &&
# endif
syntax_present(wp->w_buffer))
syntax_present(wp))
syn_stack_apply_changes(wp->w_buffer);
}
}
@@ -585,6 +585,54 @@ update_screen(type)
#endif
}
#if defined(FEAT_CONCEAL) || defined(PROTO)
void
update_single_line(wp, lnum)
win_T *wp;
linenr_T lnum;
{
int row;
int j;
if (lnum >= wp->w_topline && lnum < wp->w_botline
&& foldedCount(wp, lnum, NULL) == 0)
{
# ifdef FEAT_GUI
/* Remove the cursor before starting to do anything, because scrolling
* may make it difficult to redraw the text under it. */
if (gui.in_use)
gui_undraw_cursor();
# endif
row = 0;
for (j = 0; j < wp->w_lines_valid; ++j)
{
if (lnum == wp->w_lines[j].wl_lnum)
{
screen_start(); /* not sure of screen cursor */
# if defined(FEAT_SEARCH_EXTRA)
start_search_hl();
prepare_search_hl(wp, lnum);
# endif
win_line(wp, lnum, row, row + wp->w_lines[j].wl_size, FALSE);
# if defined(FEAT_SEARCH_EXTRA)
end_search_hl();
# endif
break;
}
row += wp->w_lines[j].wl_size;
}
# ifdef FEAT_GUI
/* Redraw the cursor */
if (gui.in_use)
{
out_flush(); /* required before updating the cursor */
gui_update_cursor(FALSE, FALSE);
}
# endif
}
}
#endif
#if defined(FEAT_SIGNS) || defined(FEAT_GUI)
static void update_prepare __ARGS((void));
static void update_finish __ARGS((void));
@@ -917,9 +965,9 @@ win_update(wp)
#ifdef FEAT_SYN_HL
/* Need to redraw lines above the change that may be included
* in a pattern match. */
if (syntax_present(buf))
if (syntax_present(wp))
{
mod_top -= buf->b_syn_sync_linebreaks;
mod_top -= buf->b_s.b_syn_sync_linebreaks;
if (mod_top < 1)
mod_top = 1;
}
@@ -1010,7 +1058,7 @@ win_update(wp)
if (mod_bot > wp->w_topline)
mod_top = wp->w_topline;
#ifdef FEAT_SYN_HL
else if (syntax_present(buf))
else if (syntax_present(wp))
top_end = 1;
#endif
}
@@ -1545,7 +1593,7 @@ win_update(wp)
#ifdef FEAT_SYN_HL
|| did_update == DID_FOLD
|| (did_update == DID_LINE
&& syntax_present(buf)
&& syntax_present(wp)
&& (
# ifdef FEAT_FOLDING
(foldmethodIsSyntax(wp)
@@ -1771,7 +1819,7 @@ win_update(wp)
#ifdef FEAT_SYN_HL
/* Let the syntax stuff know we skipped a few lines. */
if (syntax_last_parsed != 0 && syntax_last_parsed + 1 < lnum
&& syntax_present(buf))
&& syntax_present(wp))
syntax_end_parsing(syntax_last_parsed + 1);
#endif
@@ -1843,7 +1891,7 @@ win_update(wp)
/*
* Let the syntax stuff know we stop parsing here.
*/
if (syntax_last_parsed != 0 && syntax_present(buf))
if (syntax_last_parsed != 0 && syntax_present(wp))
syntax_end_parsing(syntax_last_parsed + 1);
#endif
@@ -2726,6 +2774,14 @@ win_line(wp, lnum, startrow, endrow, nochange)
int feedback_old_attr = -1;
#endif
#ifdef FEAT_CONCEAL
int syntax_flags = 0;
int conceal_attr = hl_attr(HLF_CONCEAL);
int first_conceal = (wp->w_p_conceal != 3);
int is_concealing = FALSE;
int boguscols = 0; /* nonexistent columns added to force
wrapping */
#endif
if (startrow > endrow) /* past the end already! */
return startrow;
@@ -2743,7 +2799,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
extra_check = 0;
#endif
#ifdef FEAT_SYN_HL
if (syntax_present(wp->w_buffer) && !wp->w_buffer->b_syn_error)
if (syntax_present(wp) && !wp->w_s->b_syn_error)
{
/* Prepare for syntax highlighting in this line. When there is an
* error, stop syntax highlighting. */
@@ -2751,7 +2807,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
did_emsg = FALSE;
syntax_start(wp, lnum);
if (did_emsg)
wp->w_buffer->b_syn_error = TRUE;
wp->w_s->b_syn_error = TRUE;
else
{
did_emsg = save_did_emsg;
@@ -2763,9 +2819,9 @@ win_line(wp, lnum, startrow, endrow, nochange)
#ifdef FEAT_SPELL
if (wp->w_p_spell
&& *wp->w_buffer->b_p_spl != NUL
&& wp->w_buffer->b_langp.ga_len > 0
&& *(char **)(wp->w_buffer->b_langp.ga_data) != NULL)
&& *wp->w_s->b_p_spl != NUL
&& wp->w_s->b_langp.ga_len > 0
&& *(char **)(wp->w_s->b_langp.ga_data) != NULL)
{
/* Prepare for spell checking. */
has_spell = TRUE;
@@ -3113,7 +3169,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
/* no bad word found at line start, don't check until end of a
* word */
spell_hlf = HLF_COUNT;
word_end = (int)(spell_to_word_end(ptr, wp->w_buffer)
word_end = (int)(spell_to_word_end(ptr, wp)
- line + 1);
}
else
@@ -3962,14 +4018,19 @@ win_line(wp, lnum, startrow, endrow, nochange)
did_emsg = FALSE;
syntax_attr = get_syntax_attr((colnr_T)v - 1,
# ifdef FEAT_SPELL
has_spell ? &can_spell :
# ifdef FEAT_CONCEAL
&syntax_flags,
# else
NULL,
# endif
NULL, FALSE);
# ifdef FEAT_SPELL
has_spell ? &can_spell :
# endif
NULL, FALSE);
if (did_emsg)
{
wp->w_buffer->b_syn_error = TRUE;
wp->w_s->b_syn_error = TRUE;
has_syntax = FALSE;
}
else
@@ -4304,6 +4365,74 @@ win_line(wp, lnum, startrow, endrow, nochange)
}
#endif
}
#ifdef FEAT_CONCEAL
if ( wp->w_p_conceal
&& (!area_highlighting)
&& ((lnum != wp->w_cursor.lnum)
|| (curwin != wp) || (wp->w_buffer->b_p_ma == FALSE))
&& ((syntax_flags & HL_CONCEAL) != 0))
{
char_attr = conceal_attr;
if (first_conceal
&& (syn_get_sub_char() != NUL || wp->w_p_conceal == 1))
{
if (syn_get_sub_char() != NUL)
c = syn_get_sub_char();
else if (lcs_conceal != NUL)
c = lcs_conceal;
else
c = ' ';
first_conceal = FALSE;
# ifdef FEAT_HLCOLUMN
if (hlc > 0 && n_extra > 0)
hlc += n_extra;
# endif
vcol += n_extra;
if (wp->w_p_wrap && n_extra > 0)
{
# ifdef FEAT_RIGHTLEFT
if (wp->w_p_rl)
{
col -= n_extra;
boguscols -= n_extra;
}
else
# endif
{
boguscols += n_extra;
col += n_extra;
}
}
n_extra = 0;
n_attr = 0;
}
else if (n_skip == 0)
{
is_concealing = TRUE;
n_skip = 1;
}
# ifdef FEAT_MBYTE
mb_c = c;
if (enc_utf8 && (*mb_char2len)(c) > 1)
{
mb_utf8 = TRUE;
u8cc[0] = 0;
c = 0xc0;
}
else
mb_utf8 = FALSE; /* don't draw as UTF-8 */
# endif
}
else
{
first_conceal = (wp->w_p_conceal != 3);
is_concealing = FALSE;
}
#endif /* FEAT_CONCEAL */
}
/* Don't override visual selection highlighting. */
@@ -4570,8 +4699,14 @@ win_line(wp, lnum, startrow, endrow, nochange)
}
#endif
SCREEN_LINE(screen_row, W_WINCOL(wp), col, (int)W_WIDTH(wp),
wp->w_p_rl);
#ifdef FEAT_CONCEAL
SCREEN_LINE(screen_row, W_WINCOL(wp), col - boguscols,
(int)W_WIDTH(wp), wp->w_p_rl);
boguscols = 0;
#else
SCREEN_LINE(screen_row, W_WINCOL(wp), col,
(int)W_WIDTH(wp), wp->w_p_rl);
#endif
row++;
/*
@@ -4730,6 +4865,97 @@ win_line(wp, lnum, startrow, endrow, nochange)
++col;
}
}
#ifdef FEAT_CONCEAL
else if (wp->w_p_conceal && is_concealing)
{
--n_skip;
# ifdef FEAT_HLCOLUMN
if (hlc)
{
++hlc;
if (n_extra > 0)
hlc += n_extra;
}
# endif
if (wp->w_p_wrap)
{
/*
* Special voodoo required if 'wrap' is on.
*
* Advance the column indicator to force the line
* drawing to wrap early. This will make the line
* take up the same screen space when parts are concealed,
* so that cursor line computations aren't messed up.
*
* To avoid the fictitious advance of 'col' causing
* trailing junk to be written out of the screen line
* we are building, 'boguscols' keeps track of the number
* of bad columns we have advanced.
*/
if (n_extra > 0)
{
vcol += n_extra;
# ifdef FEAT_RIGHTLEFT
if (wp->w_p_rl)
{
col -= n_extra;
boguscols -= n_extra;
}
else
# endif
{
col += n_extra;
boguscols += n_extra;
}
n_extra = 0;
n_attr = 0;
}
# ifdef FEAT_MBYTE
if (has_mbyte && (*mb_char2cells)(mb_c) > 1)
{
/* Need to fill two screen columns. */
# ifdef FEAT_RIGHTLEFT
if (wp->w_p_rl)
{
--boguscols;
--col;
}
else
# endif
{
++boguscols;
++col;
}
}
# endif
# ifdef FEAT_RIGHTLEFT
if (wp->w_p_rl)
{
--boguscols;
--col;
}
else
# endif
{
++boguscols;
++col;
}
}
else
{
if (n_extra > 0)
{
vcol += n_extra;
n_extra = 0;
n_attr = 0;
}
}
}
#endif /* FEAT_CONCEAL */
else
--n_skip;
@@ -4772,8 +4998,14 @@ win_line(wp, lnum, startrow, endrow, nochange)
|| (n_extra != 0 && (c_extra != NUL || *p_extra != NUL)))
)
{
SCREEN_LINE(screen_row, W_WINCOL(wp), col, (int)W_WIDTH(wp),
wp->w_p_rl);
#ifdef FEAT_CONCEAL
SCREEN_LINE(screen_row, W_WINCOL(wp), col - boguscols,
(int)W_WIDTH(wp), wp->w_p_rl);
boguscols = 0;
#else
SCREEN_LINE(screen_row, W_WINCOL(wp), col,
(int)W_WIDTH(wp), wp->w_p_rl);
#endif
++row;
++screen_row;