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
index fa7eac4..6dbc3d1 100644
--- a/src/option.c
+++ b/src/option.c
@@ -3269,7 +3269,6 @@
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 @@
&& (!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 @@
/*
* Convert a key name or string into a key value.
* Used for 'wildchar' and 'cedit' options.
+ * When "multi_byte" is TRUE allow for multi-byte characters.
*/
- static int
-string_to_key(char_u *arg)
+ 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 @@
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 @@
#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
index 8c9bde5..59dcd42 100644
--- a/src/proto/option.pro
+++ b/src/proto/option.pro
@@ -9,6 +9,7 @@
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
index f5a9fd1..f2fae57 100644
--- 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 @@
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 @@
--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
index e2ab84c..ed58049 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 764,
+/**/
763,
/**/
762,