Patch 8.1.0445
Problem: Setting 'term' does not store location for termcap options.
Solution: Set the script context for termcap options that are changed when
'term' is set.
Files: src/option.c, src/proto/option.pro, src/term.c,
src/testdir/test_options.vim
*** ../vim-8.1.0444/src/option.c 2018-09-30 21:43:17.199693265 +0200
--- src/option.c 2018-10-02 14:12:11.856267373 +0200
***************
*** 1755,1766 ****
{"langmap", "lmap", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP|P_SECURE,
#ifdef FEAT_LANGMAP
(char_u *)&p_langmap, PV_NONE,
! {(char_u *)"", /* unmatched } */
#else
(char_u *)NULL, PV_NONE,
! {(char_u *)NULL,
#endif
! (char_u *)0L} SCTX_INIT},
{"langmenu", "lm", P_STRING|P_VI_DEF|P_NFNAME,
#if defined(FEAT_MENU) && defined(FEAT_MULTI_LANG)
(char_u *)&p_lm, PV_NONE,
--- 1755,1766 ----
{"langmap", "lmap", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP|P_SECURE,
#ifdef FEAT_LANGMAP
(char_u *)&p_langmap, PV_NONE,
! {(char_u *)"", (char_u *)0L}
#else
(char_u *)NULL, PV_NONE,
! {(char_u *)NULL, (char_u *)0L}
#endif
! SCTX_INIT},
{"langmenu", "lm", P_STRING|P_VI_DEF|P_NFNAME,
#if defined(FEAT_MENU) && defined(FEAT_MULTI_LANG)
(char_u *)&p_lm, PV_NONE,
***************
*** 5790,5809 ****
}
/*
! * Mark a terminal option as allocated, found by a pointer into
term_strings[].
*/
! void
! set_term_option_alloced(char_u **p)
{
! int opt_idx;
for (opt_idx = 1; options[opt_idx].fullname != NULL; opt_idx++)
if (options[opt_idx].var == (char_u *)p)
! {
! options[opt_idx].flags |= P_ALLOCED;
! return;
! }
! return; /* cannot happen: didn't find it! */
}
#if defined(FEAT_EVAL) || defined(PROTO)
--- 5790,5821 ----
}
/*
! * Return the option index found by a pointer into term_strings[].
! * Return -1 if not found.
*/
! int
! get_term_opt_idx(char_u **p)
{
! int opt_idx;
for (opt_idx = 1; options[opt_idx].fullname != NULL; opt_idx++)
if (options[opt_idx].var == (char_u *)p)
! return opt_idx;
! return -1; // cannot happen: didn't find it!
! }
!
! /*
! * Mark a terminal option as allocated, found by a pointer into
term_strings[].
! * Return the option index or -1 if not found.
! */
! int
! set_term_option_alloced(char_u **p)
! {
! int opt_idx = get_term_opt_idx(p);
!
! if (opt_idx >= 0)
! options[opt_idx].flags |= P_ALLOCED;
! return opt_idx;
}
#if defined(FEAT_EVAL) || defined(PROTO)
***************
*** 8237,8242 ****
--- 8249,8280 ----
curwin->w_p_script_ctx[indir & PV_MASK] = new_script_ctx;
}
}
+
+ /*
+ * Set the script_ctx for a termcap option.
+ * "name" must be the two character code, e.g. "RV".
+ * When "name" is NULL use "opt_idx".
+ */
+ void
+ set_term_option_sctx_idx(char *name, int opt_idx)
+ {
+ char_u buf[5];
+ int idx;
+
+ if (name == NULL)
+ idx = opt_idx;
+ else
+ {
+ buf[0] = 't';
+ buf[1] = '_';
+ buf[2] = name[0];
+ buf[3] = name[1];
+ buf[4] = 0;
+ idx = findoption(buf);
+ }
+ if (idx >= 0)
+ set_option_sctx_idx(idx, OPT_GLOBAL, current_sctx);
+ }
#endif
/*
***************
*** 10445,10451 ****
{
struct vimoption *p;
! for (p = &options[0]; p->fullname != NULL; p++)
if (istermoption(p))
{
if (p->flags & P_ALLOCED)
--- 10483,10489 ----
{
struct vimoption *p;
! for (p = options; p->fullname != NULL; p++)
if (istermoption(p))
{
if (p->flags & P_ALLOCED)
***************
*** 10455,10460 ****
--- 10493,10502 ----
*(char_u **)(p->var) = empty_option;
p->def_val[VI_DEFAULT] = empty_option;
p->flags &= ~(P_ALLOCED|P_DEF_ALLOCED);
+ #ifdef FEAT_EVAL
+ // remember where the option was cleared
+ set_option_sctx_idx((int)(p - options), OPT_GLOBAL, current_sctx);
+ #endif
}
clear_termcodes();
}
*** ../vim-8.1.0444/src/proto/option.pro 2018-09-13 20:31:47.103018229
+0200
--- src/proto/option.pro 2018-10-02 14:12:15.040243605 +0200
***************
*** 17,27 ****
void check_buf_options(buf_T *buf);
void free_string_option(char_u *p);
void clear_string_option(char_u **pp);
! void set_term_option_alloced(char_u **p);
int was_set_insecurely(char_u *opt, int opt_flags);
void set_string_option_direct(char_u *name, int opt_idx, char_u *val, int
opt_flags, int set_sid);
char_u *check_colorcolumn(win_T *wp);
char_u *check_stl_option(char_u *s);
int get_option_value(char_u *name, long *numval, char_u **stringval, int
opt_flags);
int get_option_value_strict(char_u *name, long *numval, char_u **stringval,
int opt_type, void *from);
char_u *option_iter_next(void **option, int opt_type);
--- 17,29 ----
void check_buf_options(buf_T *buf);
void free_string_option(char_u *p);
void clear_string_option(char_u **pp);
! int get_term_opt_idx(char_u **p);
! int set_term_option_alloced(char_u **p);
int was_set_insecurely(char_u *opt, int opt_flags);
void set_string_option_direct(char_u *name, int opt_idx, char_u *val, int
opt_flags, int set_sid);
char_u *check_colorcolumn(win_T *wp);
char_u *check_stl_option(char_u *s);
+ void set_term_option_sctx_idx(char *name, int opt_idx);
int get_option_value(char_u *name, long *numval, char_u **stringval, int
opt_flags);
int get_option_value_strict(char_u *name, long *numval, char_u **stringval,
int opt_type, void *from);
char_u *option_iter_next(void **option, int opt_type);
*** ../vim-8.1.0444/src/term.c 2018-09-30 21:43:17.207693209 +0200
--- src/term.c 2018-10-02 14:44:51.335763377 +0200
***************
*** 1471,1476 ****
--- 1471,1479 ----
if (term_strings[p->bt_entry] == NULL
|| term_strings[p->bt_entry] == empty_option)
{
+ #ifdef FEAT_EVAL
+ int opt_idx = -1;
+ #endif
/* 8bit terminal: use CSI instead of <Esc>[ */
if (term_8bit && term_7to8bit((char_u *)p->bt_string) != 0)
{
***************
*** 1486,1496 ****
STRMOVE(t + 1, t + 2);
}
term_strings[p->bt_entry] = s;
! set_term_option_alloced(&term_strings[p->bt_entry]);
}
}
else
term_strings[p->bt_entry] = (char_u *)p->bt_string;
}
}
else
--- 1489,1511 ----
STRMOVE(t + 1, t + 2);
}
term_strings[p->bt_entry] = s;
! #ifdef FEAT_EVAL
! opt_idx =
! #endif
! set_term_option_alloced(
! &term_strings[p->bt_entry]);
}
}
else
+ {
term_strings[p->bt_entry] = (char_u *)p->bt_string;
+ #ifdef FEAT_EVAL
+ opt_idx = get_term_opt_idx(&term_strings[p->bt_entry]);
+ #endif
+ }
+ #ifdef FEAT_EVAL
+ set_term_option_sctx_idx(NULL, opt_idx);
+ #endif
}
}
else
***************
*** 1616,1622 ****
--- 1631,1642 ----
{
if (TERM_STR(string_names[i].dest) == NULL
|| TERM_STR(string_names[i].dest) == empty_option)
+ {
TERM_STR(string_names[i].dest) = TGETSTR(string_names[i].name, &tp);
+ #ifdef FEAT_EVAL
+ set_term_option_sctx_idx(string_names[i].name, -1);
+ #endif
+ }
}
/* tgetflag() returns 1 if the flag is present, 0 if not and
***************
*** 1658,1664 ****
--- 1678,1689 ----
* Get number of colors (if not done already).
*/
if (TERM_STR(KS_CCO) == NULL || TERM_STR(KS_CCO) == empty_option)
+ {
set_color_count(tgetnum("Co"));
+ #ifdef FEAT_EVAL
+ set_term_option_sctx_idx("Co", -1);
+ #endif
+ }
# ifndef hpux
BC = (char *)TGETSTR("bc", &tp);
*** ../vim-8.1.0444/src/testdir/test_options.vim 2018-08-23
22:20:31.449852029 +0200
--- src/testdir/test_options.vim 2018-10-02 14:42:18.764840113 +0200
***************
*** 270,275 ****
--- 270,287 ----
call assert_fails('set t_foo=', 'E846:')
endfunc
+ " Must be executed before other tests that set 'term'.
+ func Test_000_term_option_verbose()
+ let verb_cm = execute('verbose set t_cm')
+ call assert_notmatch('Last set from', verb_cm)
+
+ let term_save = &term
+ set term=ansi
+ let verb_cm = execute('verbose set t_cm')
+ call assert_match('Last set from.*test_options.vim', verb_cm)
+ let &term = term_save
+ endfunc
+
func Test_set_ttytype()
if !has('gui_running') && has('unix')
" Setting 'ttytype' used to cause a double-free when exiting vim and
*** ../vim-8.1.0444/src/version.c 2018-10-02 14:15:08.991376909 +0200
--- src/version.c 2018-10-02 14:42:46.984641236 +0200
***************
*** 794,795 ****
--- 794,797 ----
{ /* Add new patch number below this line */
+ /**/
+ 445,
/**/
--
hundred-and-one symptoms of being an internet addict:
132. You come back and check this list every half-hour.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.