# HG changeset patch # User Christian Brabandt # Date 1500843604 -7200 # Node ID b82dad3fa176abc2dab0552ff789b4d0ded8b404 # Parent 21f3930dfe6e47de7c64a0943737ed209f6dfac6 patch 8.0.0764: 'termkey' does not work yet commit https://github.com/vim/vim/commit/dbe948d6c350feacc01ad019b57717149c8ea5e5 Author: Bram Moolenaar Date: Sun Jul 23 22:50:51 2017 +0200 patch 8.0.0764: 'termkey' does not work yet Problem: 'termkey' does not work yet. Solution: Implement 'termkey'. diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -3269,7 +3269,6 @@ static void set_options_default(int opt_ static char_u *term_bg_default(void); static void did_set_option(int opt_idx, int opt_flags, int new_value); static char_u *illegal_char(char_u *, int); -static int string_to_key(char_u *arg); #ifdef FEAT_CMDWIN static char_u *check_cedit(void); #endif @@ -4763,7 +4762,7 @@ do_set( && (!arg[1] || VIM_ISWHITE(arg[1])) && !VIM_ISDIGIT(*arg)))) { - value = string_to_key(arg); + value = string_to_key(arg, FALSE); if (value == 0 && (long *)varp != &p_wcm) { errmsg = e_invarg; @@ -5320,14 +5319,17 @@ illegal_char(char_u *errbuf, int c) /* * Convert a key name or string into a key value. * Used for 'wildchar' and 'cedit' options. - */ - static int -string_to_key(char_u *arg) + * When "multi_byte" is TRUE allow for multi-byte characters. + */ + int +string_to_key(char_u *arg, int multi_byte) { if (*arg == '<') return find_key_option(arg + 1); if (*arg == '^') return Ctrl_chr(arg[1]); + if (multi_byte) + return PTR2CHAR(arg); return *arg; } @@ -5345,7 +5347,7 @@ check_cedit(void) cedit_key = -1; else { - n = string_to_key(p_cedit); + n = string_to_key(p_cedit, FALSE); if (vim_isprintc(n)) return e_invarg; cedit_key = n; @@ -7462,6 +7464,12 @@ did_set_string_option( #endif #ifdef FEAT_TERMINAL + /* 'termkey' */ + else if (varp == &curwin->w_p_tms) + { + if (*curwin->w_p_tk != NUL && string_to_key(curwin->w_p_tk, TRUE) == 0) + errmsg = e_invarg; + } /* 'termsize' */ else if (varp == &curwin->w_p_tms) { diff --git a/src/proto/option.pro b/src/proto/option.pro --- a/src/proto/option.pro +++ b/src/proto/option.pro @@ -9,6 +9,7 @@ void set_helplang_default(char_u *lang); void init_gui_options(void); void set_title_defaults(void); int do_set(char_u *arg, int opt_flags); +int string_to_key(char_u *arg, int multi_byte); void set_options_bin(int oldval, int newval, int opt_flags); int get_viminfo_parameter(int type); char_u *find_viminfo_parameter(int type); diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -60,9 +60,9 @@ * - implement term_scrape(buf, row) inspect terminal screen * - implement term_open(command, options) open terminal window * - implement term_getjob(buf) - * - implement 'termkey' * - when 'encoding' is not utf-8, or the job is using another encoding, setup * conversions. + * - In the GUI use a terminal emulator for :!cmd. */ #include "vim.h" @@ -445,6 +445,10 @@ terminal_loop(void) size_t len; static int mouse_was_outside = FALSE; int dragging_outside = FALSE; + int termkey = 0; + + if (*curwin->w_p_tk != NUL) + termkey = string_to_key(curwin->w_p_tk, TRUE); for (;;) { @@ -459,10 +463,15 @@ terminal_loop(void) --no_mapping; --allow_keys; + if (c == (termkey == 0 ? Ctrl_W : termkey)) + { + stuffcharReadbuff(Ctrl_W); + return; + } + /* Catch keys that need to be handled as in Normal mode. */ switch (c) { - case Ctrl_W: case NUL: case K_ZERO: stuffcharReadbuff(c); diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 764, +/**/ 763, /**/ 762,