]> granicus.if.org Git - vim/commitdiff
patch 8.0.1038: strike-through text not supported v8.0.1038
authorBram Moolenaar <Bram@vim.org>
Sat, 2 Sep 2017 16:33:56 +0000 (18:33 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 2 Sep 2017 16:33:56 +0000 (18:33 +0200)
Problem:    Strike-through text not supported.
Solution:   Add support for the "strikethrough" attribute. (Christian
            Brabandt, Ken Takata)

18 files changed:
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

index e8bf16e4e546145a1a31af9b657d5739b55d9390..aea1cce3a45d939746045fcca744904d50e5a603 100644 (file)
@@ -7723,6 +7723,7 @@ synIDattr({synID}, {what} [, {mode}])                     *synIDattr()*
                "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): >
index 0018eaaacba43b76d73a0b3c5efaa545fd94616c..859fbe8f75c8e741467d9f8516aae48aa1768557 100644 (file)
@@ -4105,6 +4105,7 @@ A jump table for the options with a short description can be found at |Q_op|.
                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
index feeadb3d305b8818e4d06a649996343deb3c5b53..8f887c42887660b7584c1def8ea2ea2cb406ffcc 100644 (file)
@@ -4699,13 +4699,14 @@ the same syntax file on all terminals, and use the optimal highlighting.
 
                                        *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* *highlight-term* *E418*
        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
index d11d96db941372bc2cd1269a1718fd61ca2dec0b..1cdb6b682aa6d51e1217ddbd756d8a0e69a63db9 100644 (file)
@@ -11843,6 +11843,10 @@ f_synIDattr(typval_T *argvars UNUSED, typval_T *rettv)
        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;
index f774750f2b89de28b7626fcf5668795df85af9af..97fac504329058b8d0ea2708db093e02ecbfe1f1 100644 (file)
--- 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;
index 476971624c7737e381082ebc520287a7c524073a..37cc2399269abed0ffc1be3058a3e5be8984a518 100644 (file)
--- a/src/gui.h
+++ b/src/gui.h
 # 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"
index 3d4ac93ae4c8bc79f59e13f2c8a1ba0641f93640..361f16c65917abf42065bc9b475df8fd9550a5f3 100644 (file)
@@ -5908,6 +5908,27 @@ draw_under(int flags, int row, int col, int cells)
 #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, int cells)
        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,
index dea648ac88aa57b2b4dea5804ba804b67f0fe002..8803487dea50a8d0b1ef8c955802f3661d94f4ce 100644 (file)
@@ -3899,6 +3899,11 @@ draw_string_QD(int row, int col, char_u *s, int len, int flags)
            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)
index e94379ba7ce239234160ec6e4a16314b4793b119..c4a57e675a24cb61d01454f2cfa59af18ccfee75 100644 (file)
@@ -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)
     {
index a638222251ae0ac3473449802e45d8f527a1a68d..1e790a81c4e23937ea31f9c3b8d41ebd9c9706a8 100644 (file)
@@ -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);
index 5f8489fdd46684ec19c2cc31fe5887aadcdd8129..a1304c9447cb400784dc12e1e96fcfaa7f400b9d 100644 (file)
@@ -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)
index c3bcd3b446570b228d8604fbb2067ebdedcb826c..ca7b6583608ee0b0784deae9be371849f3636dc6 100644 (file)
@@ -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);
 
index 730357520221e351729808d8786da91915a224ae..00e292932df3c1c56db223521e877142163b4cf9 100644 (file)
@@ -86,9 +86,9 @@ static int include_link = 0;  /* when 2 include "link" and "clear" */
  */
 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;
index 7460be9772756ff41cd8210cfab7b3952ac83e3e..413d4bb88d580d4da07b43df210919f777016c9f 100644 (file)
@@ -217,6 +217,8 @@ static struct builtin_term builtin_termcaps[] =
     {(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_termcaps[] =
     {(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_termcaps[] =
     {(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"},
index 0fedfeaa85d518dcffe07ed159acddcb4d6c4d98..b95b4f6de893ad8260084c0959bcf4ef6b8229f1 100644 (file)
@@ -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[]);    /* current terminal strings */
 #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) */
index faa74f7f47ca9f6b95f2226ddda3218f9e23dc4e..05c0fd91696bcd6aceef7c84bd93d34bc5a82bc2 100644 (file)
@@ -1735,7 +1735,7 @@ cell2attr(VTermScreenCellAttrs cellattrs, VTermColor cellfg, VTermColor cellbg)
     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_T *rettv)
        {"bold",      HL_BOLD},
        {"italic",    HL_ITALIC},
        {"underline", HL_UNDERLINE},
-       {"strike",    HL_STANDOUT},
+       {"strike",    HL_STRIKETHROUGH},
        {"reverse",   HL_INVERSE},
     };
 
index 8af46882e458e2346ddbb4f98d9ac382b1175e72..e8e508f8a6482b100a2105de21a6ac6e5d9cd0a5 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1038,
 /**/
     1037,
 /**/
index 7fea70b90e227612daa267352776cd4469cf2906..77081e202a97759a391e0c8724b8ae69948d4650 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -681,7 +681,8 @@ extern int (*dyn_libintl_putenv)(const char *envstring);
 #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