changeset 12317:2a8890b80923 v8.0.1038

patch 8.0.1038: strike-through text not supported commit https://github.com/vim/vim/commit/cf4b00c856ef714482d8d060332ac9a4d74e6b88 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Sep 2 18:33:56 2017 +0200 patch 8.0.1038: strike-through text not supported Problem: Strike-through text not supported. Solution: Add support for the "strikethrough" attribute. (Christian Brabandt, Ken Takata)
author Christian Brabandt <cb@256bit.org>
date Sat, 02 Sep 2017 18:45:04 +0200
parents a1d3a6d6af2c
children fb6888115062
files runtime/doc/eval.txt runtime/doc/options.txt runtime/doc/syntax.txt src/evalfunc.c src/gui.c src/gui.h src/gui_gtk_x11.c src/gui_mac.c src/gui_w32.c src/gui_x11.c src/option.c src/screen.c src/syntax.c src/term.c src/term.h src/terminal.c src/version.c src/vim.h
diffstat 18 files changed, 107 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -7723,6 +7723,7 @@ synIDattr({synID}, {what} [, {mode}])			
 		"standout"	"1" if standout
 		"underline"	"1" if underlined
 		"undercurl"	"1" if undercurled
+		"strike"	"1" if strikethrough
 
 		Example (echoes the color of the syntax item under the
 		cursor): >
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -4105,6 +4105,7 @@ A jump table for the options with a shor
 		s	standout	(termcap entry "so" and "se")
 		u	underline	(termcap entry "us" and "ue")
 		c	undercurl	(termcap entry "Cs" and "Ce")
+		t	strikethrough	(termcap entry "Ts" and "Te")
 		n	no highlighting
 		-	no highlighting
 		:	use a highlight group
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -4699,13 +4699,14 @@ 1. highlight arguments for normal termin
 
 					*bold* *underline* *undercurl*
 					*inverse* *italic* *standout*
-					*nocombine*
+					*nocombine* *strikethrough*
 term={attr-list}			*attr-list* *highlight-term* *E418*
 	attr-list is a comma separated list (without spaces) of the
 	following items (in any order):
 		bold
 		underline
 		undercurl	not always available
+		strikethrough	not always available
 		reverse
 		inverse		same as reverse
 		italic
@@ -4716,8 +4717,8 @@ term={attr-list}			*attr-list* *highligh
 	Note that "bold" can be used here and by using a bold font.  They
 	have the same effect.
 	"undercurl" is a curly underline.  When "undercurl" is not possible
-	then "underline" is used.  In general "undercurl" is only available in
-	the GUI.  The color is set with |highlight-guisp|.
+	then "underline" is used.  In general "undercurl" and "strikethrough"
+	is only available in the GUI.  The color is set with |highlight-guisp|.
 
 start={term-list}				*highlight-start* *E422*
 stop={term-list}				*term-list* *highlight-stop*
@@ -4882,7 +4883,8 @@ guifg={color-name}					*highlight-guifg*
 guibg={color-name}					*highlight-guibg*
 guisp={color-name}					*highlight-guisp*
 	These give the foreground (guifg), background (guibg) and special
-	(guisp) color to use in the GUI.  "guisp" is used for undercurl.
+	(guisp) color to use in the GUI.  "guisp" is used for undercurl and
+	strikethrough.
 	There are a few special names:
 		NONE		no color (transparent)
 		bg		use normal background color
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -11843,6 +11843,10 @@ f_synIDattr(typval_T *argvars UNUSED, ty
 	case 's':
 		if (TOLOWER_ASC(what[1]) == 'p')	/* sp[#] */
 		    p = highlight_color(id, what, modec);
+							/* strikeout */
+		else if (TOLOWER_ASC(what[1]) == 't' &&
+			TOLOWER_ASC(what[2]) == 'r')
+		    p = highlight_has_attr(id, HL_STRIKETHROUGH, modec);
 		else					/* standout */
 		    p = highlight_has_attr(id, HL_STANDOUT, modec);
 		break;
--- a/src/gui.c
+++ b/src/gui.c
@@ -2396,6 +2396,7 @@ gui_outstr_nowrap(
     /* Do we underline the text? */
     if (hl_mask_todo & HL_UNDERLINE)
 	draw_flags |= DRAW_UNDERL;
+
 #else
     /* Do we underline the text? */
     if ((hl_mask_todo & HL_UNDERLINE) || (hl_mask_todo & HL_ITALIC))
@@ -2405,6 +2406,10 @@ gui_outstr_nowrap(
     if (hl_mask_todo & HL_UNDERCURL)
 	draw_flags |= DRAW_UNDERC;
 
+    /* Do we strikethrough the text? */
+    if (hl_mask_todo & HL_STRIKETHROUGH)
+	draw_flags |= DRAW_STRIKE;
+
     /* Do we draw transparently? */
     if (flags & GUI_MON_TRS_CURSOR)
 	draw_flags |= DRAW_TRANSP;
--- a/src/gui.h
+++ b/src/gui.h
@@ -142,6 +142,7 @@
 # define DRAW_ITALIC		0x10	/* draw italic text */
 #endif
 #define DRAW_CURSOR		0x20	/* drawing block cursor (win32) */
+#define DRAW_STRIKE		0x40	/* strikethrough */
 
 /* For our own tearoff menu item */
 #define TEAR_STRING		"-->Detach"
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -5908,6 +5908,27 @@ draw_under(int flags, int row, int col, 
 #endif
     }
 
+    /* Draw a strikethrough line */
+    if (flags & DRAW_STRIKE)
+    {
+#if GTK_CHECK_VERSION(3,0,0)
+	cairo_set_line_width(cr, 1.0);
+	cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
+	cairo_set_source_rgba(cr,
+		gui.spcolor->red, gui.spcolor->green, gui.spcolor->blue,
+		gui.spcolor->alpha);
+	cairo_move_to(cr, FILL_X(col), y + 1 - gui.char_height/2 + 0.5);
+	cairo_line_to(cr, FILL_X(col + cells), y + 1 - gui.char_height/2 + 0.5);
+	cairo_stroke(cr);
+#else
+	gdk_gc_set_foreground(gui.text_gc, gui.spcolor);
+	gdk_draw_line(gui.drawarea->window, gui.text_gc,
+		      FILL_X(col), y + 1 - gui.char_height/2,
+		      FILL_X(col + cells), y + 1 - gui.char_height/2);
+	gdk_gc_set_foreground(gui.text_gc, gui.fgcolor);
+#endif
+    }
+
     /* Underline: draw a line at the bottom of the character cell. */
     if (flags & DRAW_UNDERL)
     {
@@ -5916,16 +5937,14 @@ draw_under(int flags, int row, int col, 
 	if (p_linespace > 1)
 	    y -= p_linespace - 1;
 #if GTK_CHECK_VERSION(3,0,0)
-	{
-	    cairo_set_line_width(cr, 1.0);
-	    cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
-	    cairo_set_source_rgba(cr,
-		    gui.fgcolor->red, gui.fgcolor->green, gui.fgcolor->blue,
-		    gui.fgcolor->alpha);
-	    cairo_move_to(cr, FILL_X(col), y + 0.5);
-	    cairo_line_to(cr, FILL_X(col + cells), y + 0.5);
-	    cairo_stroke(cr);
-	}
+	cairo_set_line_width(cr, 1.0);
+	cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
+	cairo_set_source_rgba(cr,
+		gui.fgcolor->red, gui.fgcolor->green, gui.fgcolor->blue,
+		gui.fgcolor->alpha);
+	cairo_move_to(cr, FILL_X(col), y + 0.5);
+	cairo_line_to(cr, FILL_X(col + cells), y + 0.5);
+	cairo_stroke(cr);
 #else
 	gdk_draw_line(gui.drawarea->window, gui.text_gc,
 		      FILL_X(col), y,
--- a/src/gui_mac.c
+++ b/src/gui_mac.c
@@ -3899,6 +3899,11 @@ draw_string_QD(int row, int col, char_u 
 	    MoveTo(FILL_X(col), FILL_Y(row + 1) - 1);
 	    LineTo(FILL_X(col + len) - 1, FILL_Y(row + 1) - 1);
 	}
+	if (flags & DRAW_STRIKE)
+	{
+	    MoveTo(FILL_X(col), FILL_Y(row + 1) - gui.char_height/2);
+	    LineTo(FILL_X(col + len) - 1, FILL_Y(row + 1) - gui.char_height/2);
+	}
     }
 
     if (flags & DRAW_UNDERC)
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -6427,6 +6427,18 @@ gui_mch_draw_string(
 	DeleteObject(SelectObject(s_hdc, old_pen));
     }
 
+    /* Strikethrough */
+    if (flags & DRAW_STRIKE)
+    {
+	hpen = CreatePen(PS_SOLID, 1, gui.currSpColor);
+	old_pen = SelectObject(s_hdc, hpen);
+	y = FILL_Y(row + 1) - gui.char_height/2;
+	MoveToEx(s_hdc, FILL_X(col), y, NULL);
+	/* Note: LineTo() excludes the last pixel in the line. */
+	LineTo(s_hdc, FILL_X(col + len), y);
+	DeleteObject(SelectObject(s_hdc, old_pen));
+    }
+
     /* Undercurl */
     if (flags & DRAW_UNDERC)
     {
--- a/src/gui_x11.c
+++ b/src/gui_x11.c
@@ -2542,6 +2542,16 @@ gui_mch_draw_string(
 		y, FILL_X(col + cells) - 1, y);
     }
 
+    if (flags & DRAW_STRIKE)
+    {
+	int	y = FILL_Y(row + 1) - gui.char_height/2;
+
+	XSetForeground(gui.dpy, gui.text_gc, prev_sp_color);
+	XDrawLine(gui.dpy, gui.wid, gui.text_gc, FILL_X(col),
+		y, FILL_X(col + cells) - 1, y);
+	XSetForeground(gui.dpy, gui.text_gc, prev_fg_color);
+    }
+
 #ifdef FEAT_XFONTSET
     if (current_fontset != NULL)
 	XSetClipMask(gui.dpy, gui.text_gc, None);
--- a/src/option.c
+++ b/src/option.c
@@ -3216,8 +3216,10 @@ static struct vimoption options[] =
     p_term("t_so", T_SO)
     p_term("t_SR", T_CSR)
     p_term("t_sr", T_SR)
+    p_term("t_Te", T_STE)
     p_term("t_te", T_TE)
     p_term("t_ti", T_TI)
+    p_term("t_Ts", T_STS)
     p_term("t_ts", T_TS)
     p_term("t_u7", T_U7)
     p_term("t_ue", T_UE)
--- a/src/screen.c
+++ b/src/screen.c
@@ -235,7 +235,7 @@ redraw_later_clear(void)
     else
 #endif
 	/* Use attributes that is very unlikely to appear in text. */
-	screen_attr = HL_BOLD | HL_UNDERLINE | HL_INVERSE;
+	screen_attr = HL_BOLD | HL_UNDERLINE | HL_INVERSE | HL_STRIKETHROUGH;
 }
 
 /*
@@ -8086,6 +8086,8 @@ screen_start_highlight(int attr)
 		out_str(T_CZH);
 	    if ((attr & HL_INVERSE) && T_MR != NULL)	/* inverse (reverse) */
 		out_str(T_MR);
+	    if ((attr & HL_STRIKETHROUGH) && T_STS != NULL)	/* strike */
+		out_str(T_STS);
 
 	    /*
 	     * Output the color or start string after bold etc., in case the
@@ -8210,6 +8212,13 @@ screen_stop_highlight(void)
 		else
 		    out_str(T_CZR);
 	    }
+	    if (screen_attr & HL_STRIKETHROUGH)
+	    {
+		if (STRCMP(T_STE, T_ME) == 0)
+		    do_ME = TRUE;
+		else
+		    out_str(T_STE);
+	    }
 	    if (do_ME || (screen_attr & (HL_BOLD | HL_INVERSE)))
 		out_str(T_ME);
 
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -86,9 +86,9 @@ static int include_link = 0;	/* when 2 i
  */
 static char *(hl_name_table[]) =
     {"bold", "standout", "underline", "undercurl",
-			  "italic", "reverse", "inverse", "nocombine", "NONE"};
+      "italic", "reverse", "inverse", "nocombine", "strikethrough", "NONE"};
 static int hl_attr_table[] =
-    {HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_UNDERCURL, HL_ITALIC, HL_INVERSE, HL_INVERSE, HL_NOCOMBINE, 0};
+    {HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_UNDERCURL, HL_ITALIC, HL_INVERSE, HL_INVERSE, HL_NOCOMBINE, HL_STRIKETHROUGH, 0};
 #define ATTR_COMBINE(attr_a, attr_b) ((((attr_b) & HL_NOCOMBINE) ? attr_b : (attr_a)) | (attr_b))
 
 static int get_attr_entry(garray_T *table, attrentry_T *aep);
@@ -9951,6 +9951,8 @@ highlight_changed(void)
 				break;
 		    case 'c':	attr |= HL_UNDERCURL;
 				break;
+		    case 't':	attr |= HL_STRIKETHROUGH;
+				break;
 		    case ':':	++p;		    /* highlight group name */
 				if (attr || *p == NUL)	 /* no combinations */
 				    return FAIL;
--- a/src/term.c
+++ b/src/term.c
@@ -217,6 +217,8 @@ static struct builtin_term builtin_termc
     {(int)KS_US,	IF_EB("\033|8h", ESC_STR "|8h")},   /* HL_UNDERLINE */
     {(int)KS_UCE,	IF_EB("\033|8C", ESC_STR "|8C")},   /* HL_UNDERCURL */
     {(int)KS_UCS,	IF_EB("\033|8c", ESC_STR "|8c")},   /* HL_UNDERCURL */
+    {(int)KS_STE,	IF_EB("\033|4C", ESC_STR "|4C")},   /* HL_STRIKETHROUGH */
+    {(int)KS_STS,	IF_EB("\033|4c", ESC_STR "|4c")},   /* HL_STRIKETHROUGH */
     {(int)KS_CZR,	IF_EB("\033|4H", ESC_STR "|4H")},   /* HL_ITALIC */
     {(int)KS_CZH,	IF_EB("\033|4h", ESC_STR "|4h")},   /* HL_ITALIC */
     {(int)KS_VB,	IF_EB("\033|f", ESC_STR "|f")},
@@ -831,6 +833,8 @@ static struct builtin_term builtin_termc
     {(int)KS_MD,	IF_EB("\033[1m", ESC_STR "[1m")},
     {(int)KS_UE,	IF_EB("\033[m", ESC_STR "[m")},
     {(int)KS_US,	IF_EB("\033[4m", ESC_STR "[4m")},
+    {(int)KS_STE,	IF_EB("\033[29m", ESC_STR "[29m")},
+    {(int)KS_STS,	IF_EB("\033[9m", ESC_STR "[9m")},
     {(int)KS_MS,	"y"},
     {(int)KS_UT,	"y"},
     {(int)KS_LE,	"\b"},
@@ -1151,6 +1155,8 @@ static struct builtin_term builtin_termc
     {(int)KS_US,	"[US]"},
     {(int)KS_UCE,	"[UCE]"},
     {(int)KS_UCS,	"[UCS]"},
+    {(int)KS_STE,	"[STE]"},
+    {(int)KS_STS,	"[STS]"},
     {(int)KS_MS,	"[MS]"},
     {(int)KS_UT,	"[UT]"},
     {(int)KS_XN,	"[XN]"},
@@ -1595,6 +1601,7 @@ set_termname(char_u *term)
 				{KS_MD, "md"}, {KS_SE, "se"}, {KS_SO, "so"},
 				{KS_CZH,"ZH"}, {KS_CZR,"ZR"}, {KS_UE, "ue"},
 				{KS_US, "us"}, {KS_UCE, "Ce"}, {KS_UCS, "Cs"},
+				{KS_STE,"Te"}, {KS_STS,"Ts"},
 				{KS_CM, "cm"}, {KS_SR, "sr"},
 				{KS_CRI,"RI"}, {KS_VB, "vb"}, {KS_KS, "ks"},
 				{KS_KE, "ke"}, {KS_TI, "ti"}, {KS_TE, "te"},
--- a/src/term.h
+++ b/src/term.h
@@ -55,6 +55,8 @@ enum SpecialKey
     KS_US,	/* underscore (underline) mode */
     KS_UCE,	/* exit undercurl mode */
     KS_UCS,	/* undercurl mode */
+    KS_STE,	/* exit strikethrough mode */
+    KS_STS,	/* strikethrough mode */
     KS_MS,	/* save to move cur in reverse mode */
     KS_CM,	/* cursor motion */
     KS_SR,	/* scroll reverse (backward) */
@@ -149,6 +151,8 @@ extern char_u *(term_strings[]);    /* c
 #define T_US	(TERM_STR(KS_US))	/* underscore (underline) mode */
 #define T_UCE	(TERM_STR(KS_UCE))	/* exit undercurl mode */
 #define T_UCS	(TERM_STR(KS_UCS))	/* undercurl mode */
+#define T_STE	(TERM_STR(KS_STE))	/* exit strikethrough mode */
+#define T_STS	(TERM_STR(KS_STS))	/* strikethrough mode */
 #define T_MS	(TERM_STR(KS_MS))	/* save to move cur in reverse mode */
 #define T_CM	(TERM_STR(KS_CM))	/* cursor motion */
 #define T_SR	(TERM_STR(KS_SR))	/* scroll reverse (backward) */
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -1735,7 +1735,7 @@ cell2attr(VTermScreenCellAttrs cellattrs
     if (cellattrs.italic)
 	attr |= HL_ITALIC;
     if (cellattrs.strike)
-	attr |= HL_STANDOUT;
+	attr |= HL_STRIKETHROUGH;
     if (cellattrs.reverse)
 	attr |= HL_INVERSE;
 
@@ -2451,7 +2451,7 @@ f_term_getattr(typval_T *argvars, typval
 	{"bold",      HL_BOLD},
 	{"italic",    HL_ITALIC},
 	{"underline", HL_UNDERLINE},
-	{"strike",    HL_STANDOUT},
+	{"strike",    HL_STRIKETHROUGH},
 	{"reverse",   HL_INVERSE},
     };
 
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1038,
+/**/
     1037,
 /**/
     1036,
--- a/src/vim.h
+++ b/src/vim.h
@@ -681,7 +681,8 @@ extern int (*dyn_libintl_putenv)(const c
 #define HL_UNDERCURL		0x10
 #define HL_STANDOUT		0x20
 #define HL_NOCOMBINE		0x40
-#define HL_ALL			0x7f
+#define HL_STRIKETHROUGH	0x80
+#define HL_ALL			0xff
 
 /* special attribute addition: Put message in history */
 #define MSG_HIST		0x1000