From b55ae8ce42c8a83d14bfde2c138fcc74f447de68 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Fri, 2 Dec 2022 13:37:36 +0000 Subject: [PATCH] patch 9.0.0988: using feedkeys() does not show up in a channel log Problem: Using feedkeys() does not show up in a channel log. Solution: Add ch_log() calls and clean up the code. --- src/evalfunc.c | 113 ++++++++++++++++++++++++++----------------------- src/version.c | 2 + 2 files changed, 61 insertions(+), 54 deletions(-) diff --git a/src/evalfunc.c b/src/evalfunc.c index e72f8610f..fa63ab2e2 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -4343,7 +4343,6 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED) int context = FALSE; int dangerous = FALSE; int lowlevel = FALSE; - char_u *keys_esc; // This is not allowed in the sandbox. If the commands would still be // executed in the sandbox it would be OK, but it probably happens later, @@ -4379,73 +4378,79 @@ f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED) if (*keys != NUL || execute) { - // Need to escape K_SPECIAL and CSI before putting the string in the - // typeahead buffer. - keys_esc = vim_strsave_escape_csi(keys); - if (keys_esc != NULL) + if (lowlevel) { - if (lowlevel) - { #ifdef USE_INPUT_BUF - int len = (int)STRLEN(keys); + ch_log(NULL, "feedkeys() lowlevel: %s", keys); - for (int idx = 0; idx < len; ++idx) - { - // if a CTRL-C was typed, set got_int, similar to what - // happens in fill_input_buf() - if (keys[idx] == 3 && ctrl_c_interrupts && typed) - got_int = TRUE; - add_to_input_buf(keys + idx, 1); - } + int len = (int)STRLEN(keys); + for (int idx = 0; idx < len; ++idx) + { + // if a CTRL-C was typed, set got_int, similar to what + // happens in fill_input_buf() + if (keys[idx] == 3 && ctrl_c_interrupts && typed) + got_int = TRUE; + add_to_input_buf(keys + idx, 1); + } #else - emsg(_(e_lowlevel_input_not_supported)); + emsg(_(e_lowlevel_input_not_supported)); #endif - } - else - { - ins_typebuf(keys_esc, (remap ? REMAP_YES : REMAP_NONE), - insert ? 0 : typebuf.tb_len, !typed, FALSE); - if (vgetc_busy + } + else + { + // Need to escape K_SPECIAL and CSI before putting the string in + // the typeahead buffer. + char_u *keys_esc = vim_strsave_escape_csi(keys); + if (keys_esc == NULL) + return; + + ch_log(NULL, "feedkeys(%s): %s", typed ? "typed" : "", keys); + + ins_typebuf(keys_esc, (remap ? REMAP_YES : REMAP_NONE), + insert ? 0 : typebuf.tb_len, !typed, FALSE); + if (vgetc_busy #ifdef FEAT_TIMERS - || timer_busy + || timer_busy #endif - || input_busy) - typebuf_was_filled = TRUE; - } - vim_free(keys_esc); + || input_busy) + typebuf_was_filled = TRUE; - if (execute) - { - int save_msg_scroll = msg_scroll; - sctx_T save_sctx; + vim_free(keys_esc); + } - // Avoid a 1 second delay when the keys start Insert mode. - msg_scroll = FALSE; + if (execute) + { + int save_msg_scroll = msg_scroll; + sctx_T save_sctx; - if (context) - { - save_sctx = current_sctx; - current_sctx.sc_sid = 0; - current_sctx.sc_version = 0; - } + // Avoid a 1 second delay when the keys start Insert mode. + msg_scroll = FALSE; - if (!dangerous) - { - ++ex_normal_busy; - ++in_feedkeys; - } - exec_normal(TRUE, lowlevel, TRUE); - if (!dangerous) - { - --ex_normal_busy; - --in_feedkeys; - } + ch_log(NULL, "feedkeys() executing"); - msg_scroll |= save_msg_scroll; + if (context) + { + save_sctx = current_sctx; + current_sctx.sc_sid = 0; + current_sctx.sc_version = 0; + } - if (context) - current_sctx = save_sctx; + if (!dangerous) + { + ++ex_normal_busy; + ++in_feedkeys; } + exec_normal(TRUE, lowlevel, TRUE); + if (!dangerous) + { + --ex_normal_busy; + --in_feedkeys; + } + + msg_scroll |= save_msg_scroll; + + if (context) + current_sctx = save_sctx; } } } diff --git a/src/version.c b/src/version.c index 93e35f622..4cb746e18 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 988, /**/ 987, /**/ -- 2.40.0