diff options
author | Bram Moolenaar <Bram@vim.org> | 2015-03-31 18:31:03 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2015-03-31 18:31:03 +0200 |
commit | 1e7813a1872df80eec1760bdd9d80352b306ac56 (patch) | |
tree | 32f7645aa3470a563eeaba6c4802ac42b5c89e4c | |
parent | 7d2757a47204d00cd47e3db94f1bd248c499d4e3 (diff) |
updated for version 7.4.687v7.4.687
Problem: There is no way to use a different in Replace mode for a terminal.
Solution: Add t_SR. (Omar Sandoval)
-rw-r--r-- | runtime/doc/options.txt | 3 | ||||
-rw-r--r-- | runtime/doc/term.txt | 14 | ||||
-rw-r--r-- | src/option.c | 3 | ||||
-rw-r--r-- | src/term.c | 39 | ||||
-rw-r--r-- | src/term.h | 2 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 46 insertions, 17 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 39c3270fd2..24a65bbecf 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -3420,7 +3420,8 @@ A jump table for the options with a short description can be found at |Q_op|. the height of the cursor can be changed. This can be done by specifying a block cursor, or a percentage for a vertical or horizontal cursor. - For a console the 't_SI' and 't_EI' escape sequences are used. + For a console the 't_SI', 't_SR', and 't_EI' escape sequences are + used. The option is a comma separated list of parts. Each part consist of a mode-list and an argument-list: diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt index 2ad4f67784..717989ad94 100644 --- a/runtime/doc/term.txt +++ b/runtime/doc/term.txt @@ -294,7 +294,8 @@ Added by Vim (there are no standard codes for these): t_WP set window position (Y, X) in pixels *t_WP* *'t_WP'* t_WS set window size (height, width) in characters *t_WS* *'t_WS'* t_SI start insert mode (bar cursor shape) *t_SI* *'t_SI'* - t_EI end insert mode (block cursor shape) *t_EI* *'t_EI'* + t_SR start replace mode (underline cursor shape) *t_SR* *'t_SR'* + t_EI end insert or replace mode (block cursor shape) *t_EI* *'t_EI'* |termcap-cursor-shape| t_RV request terminal version string (for xterm) *t_RV* *'t_RV'* |xterm-8bit| |v:termresponse| |'ttymouse'| |xterm-codes| @@ -438,13 +439,16 @@ If one of these is not available, 't_Sb' and 't_Sf' are used. 't_me' is used to reset to the default colors. *termcap-cursor-shape* *termcap-cursor-color* -When Vim enters Insert mode the 't_SI' escape sequence is sent. When leaving -Insert mode 't_EI' is used. But only if both are defined. This can be used -to change the shape or color of the cursor in Insert mode. These are not -standard termcap/terminfo entries, you need to set them yourself. +When Vim enters Insert mode the 't_SI' escape sequence is sent. When Vim +enters Replace mode the 't_SR' escape sequence is sent if it is set, otherwise +'t_SI' is sent. When leaving Insert mode or Replace mode 't_EI' is used. This +can be used to change the shape or color of the cursor in Insert or Replace +mode. These are not standard termcap/terminfo entries, you need to set them +yourself. Example for an xterm, this changes the color of the cursor: > if &term =~ "xterm" let &t_SI = "\<Esc>]12;purple\x7" + let &t_SR = "\<Esc>]12;red\x7" let &t_EI = "\<Esc>]12;blue\x7" endif NOTE: When Vim exits the shape for Normal mode will remain. The shape from diff --git a/src/option.c b/src/option.c index 6b3b00caa3..cf3a317626 100644 --- a/src/option.c +++ b/src/option.c @@ -2978,6 +2978,7 @@ static struct vimoption p_term("t_WS", T_CWS) p_term("t_SI", T_CSI) p_term("t_EI", T_CEI) + p_term("t_SR", T_CSR) p_term("t_xn", T_XN) p_term("t_xs", T_XS) p_term("t_ZH", T_CZH) @@ -8560,7 +8561,7 @@ set_num_option(opt_idx, varp, value, errbuf, errbuflen, opt_flags) errmsg = e_invarg; curwin->w_p_nuw = 10; } - curwin->w_nrwidth_line_count = 0; + curwin->w_nrwidth_line_count = 0; /* trigger a redraw */ } #endif diff --git a/src/term.c b/src/term.c index 0d797bcd66..ffe9d43f2b 100644 --- a/src/term.c +++ b/src/term.c @@ -3567,27 +3567,46 @@ cursor_off() #if defined(CURSOR_SHAPE) || defined(PROTO) /* - * Set cursor shape to match Insert mode. + * Set cursor shape to match Insert or Replace mode. */ void term_cursor_shape() { - static int showing_insert_mode = MAYBE; + static int showing_mode = NORMAL; + char_u *p; - if (!full_screen || *T_CSI == NUL || *T_CEI == NUL) + /* Only do something when redrawing the screen and we can restore the + * mode. */ + if (!full_screen || *T_CEI == NUL) return; - if (State & INSERT) + if ((State & REPLACE) == REPLACE) { - if (showing_insert_mode != TRUE) + if (showing_mode != REPLACE) + { + if (*T_CSR != NUL) + p = T_CSR; /* Replace mode cursor */ + else + p = T_CSI; /* fall back to Insert mode cursor */ + if (*p != NUL) + { + out_str(p); + showing_mode = REPLACE; + } + } + } + else if (State & INSERT) + { + if (showing_mode != INSERT && *T_CSI != NUL) + { out_str(T_CSI); /* Insert mode cursor */ - showing_insert_mode = TRUE; + showing_mode = INSERT; + } } - else + else if (showing_mode != NORMAL) { - if (showing_insert_mode != FALSE) - out_str(T_CEI); /* non-Insert mode cursor */ - showing_insert_mode = FALSE; + out_str(T_CEI); /* non-Insert mode cursor */ + showing_mode = NORMAL; } } #endif diff --git a/src/term.h b/src/term.h index 28390a285c..12d5eb9095 100644 --- a/src/term.h +++ b/src/term.h @@ -81,6 +81,7 @@ enum SpecialKey KS_CRV, /* request version string */ KS_CSI, /* start insert mode (bar cursor) */ KS_CEI, /* end insert mode (block cursor) */ + KS_CSR, /* start replace mode (underline cursor) */ #ifdef FEAT_VERTSPLIT KS_CSV, /* scroll region vertical */ #endif @@ -159,6 +160,7 @@ extern char_u *(term_strings[]); /* current terminal strings */ #define T_CWS (term_str(KS_CWS)) /* window size */ #define T_CSI (term_str(KS_CSI)) /* start insert mode */ #define T_CEI (term_str(KS_CEI)) /* end insert mode */ +#define T_CSR (term_str(KS_CSR)) /* start replace mode */ #define T_CRV (term_str(KS_CRV)) /* request version string */ #define T_OP (term_str(KS_OP)) /* original color pair */ #define T_U7 (term_str(KS_U7)) /* request cursor position */ diff --git a/src/version.c b/src/version.c index 89e70848a3..dcecdc451c 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 687, +/**/ 686, /**/ 685, |