diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-06-04 22:15:54 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-06-04 22:15:54 +0100 |
commit | 1d97db3d987c05af88c30ad20f537bcf3024f9c1 (patch) | |
tree | 2835145bad19eeca6d90bd3360b12f8ffd2f9d4b | |
parent | 327e6dd82235d70f6d5aa33ac8281e7fd79b7381 (diff) | |
download | vim-git-1d97db3d987c05af88c30ad20f537bcf3024f9c1.tar.gz |
patch 8.2.5056: the channel log only contains some of the raw terminal outputv8.2.5056
Problem: The channel log only contains some of the raw terminal output.
Solution: Add the "o" flag to log all terminal output. Use it for "--log".
-rw-r--r-- | runtime/doc/channel.txt | 9 | ||||
-rw-r--r-- | runtime/doc/starting.txt | 2 | ||||
-rw-r--r-- | src/channel.c | 10 | ||||
-rw-r--r-- | src/edit.c | 10 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/normal.c | 10 | ||||
-rw-r--r-- | src/optionstr.c | 5 | ||||
-rw-r--r-- | src/term.c | 60 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 11 |
10 files changed, 58 insertions, 63 deletions
diff --git a/runtime/doc/channel.txt b/runtime/doc/channel.txt index 01a9e3695..6705c59c3 100644 --- a/runtime/doc/channel.txt +++ b/runtime/doc/channel.txt @@ -628,15 +628,18 @@ ch_logfile({fname} [, {mode}]) *ch_logfile()* Start logging channel activity to {fname}. When {fname} is an empty string: stop logging. - When {mode} is omitted or "a" append to the file. - When {mode} is "w" start with an empty file. + When {mode} is omitted or contains "a" or is "o" then append + to the file. + When {mode} contains "w" and not "a" start with an empty file. + When {mode} contains "o" then log all terminal output. + Otherwise only some interesting terminal output is logged. Use |ch_log()| to write log messages. The file is flushed after every message, on Unix you can use "tail -f" to see what is going on in real time. To enable the log very early, to see what is received from a - terminal during startup, use |--log|: > + terminal during startup, use |--log| (this uses mode "ao"): > vim --log logfile < This function is not available in the |sandbox|. diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt index f5b33a888..ec095a472 100644 --- a/runtime/doc/starting.txt +++ b/runtime/doc/starting.txt @@ -346,7 +346,7 @@ a slash. Thus "-R" means recovery and "-/R" readonly. < --log {filename} *--log* Start logging and write entries to {filename}. - This works like calling `ch_logfile({filename}, 'a')` very + This works like calling `ch_logfile({filename}, 'ao')` very early during startup. {only available with the +channel feature} diff --git a/src/channel.c b/src/channel.c index e3b32eebf..abd2ce1da 100644 --- a/src/channel.c +++ b/src/channel.c @@ -152,7 +152,8 @@ static proftime_T log_start; void ch_logfile(char_u *fname, char_u *opt) { - FILE *file = NULL; + FILE *file = NULL; + char *mode = "a"; if (log_fd != NULL) { @@ -163,9 +164,14 @@ ch_logfile(char_u *fname, char_u *opt) fclose(log_fd); } + // The "a" flag overrules the "w" flag. + if (vim_strchr(opt, 'a') == NULL && vim_strchr(opt, 'w') != NULL) + mode = "w"; + ch_log_output = vim_strchr(opt, 'o') != NULL ? LOG_ALWAYS : FALSE; + if (*fname != NUL) { - file = fopen((char *)fname, *opt == 'w' ? "w" : "a"); + file = fopen((char *)fname, mode); if (file == NULL) { semsg(_(e_cant_open_file_str), fname); diff --git a/src/edit.c b/src/edit.c index 443e023d5..dbfa0ae5f 100644 --- a/src/edit.c +++ b/src/edit.c @@ -319,9 +319,8 @@ edit( #endif if (!p_ek) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; + // Disable bracketed paste mode, we won't recognize the escape // sequences. out_str(T_BD); @@ -3690,9 +3689,8 @@ ins_esc( #endif if (!p_ek) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; + // Re-enable bracketed paste mode. out_str(T_BE); diff --git a/src/main.c b/src/main.c index b72c9aecf..b92be4cfe 100644 --- a/src/main.c +++ b/src/main.c @@ -152,7 +152,7 @@ main # endif # ifdef FEAT_JOB_CHANNEL if (STRICMP(argv[i], "--log") == 0) - ch_logfile((char_u *)(argv[i + 1]), (char_u *)"a"); + ch_logfile((char_u *)(argv[i + 1]), (char_u *)"ao"); # endif } #endif diff --git a/src/normal.c b/src/normal.c index f07598655..fdbc5c838 100644 --- a/src/normal.c +++ b/src/normal.c @@ -431,9 +431,8 @@ normal_cmd_get_more_chars( #endif if ((State & MODE_INSERT) && !p_ek) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; + // Disable bracketed paste and modifyOtherKeys here, we won't // recognize the escape sequences with 'esckeys' off. out_str(T_BD); @@ -444,9 +443,8 @@ normal_cmd_get_more_chars( if ((State & MODE_INSERT) && !p_ek) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; + // Re-enable bracketed paste mode and modifyOtherKeys out_str(T_BE); out_str(T_CTI); diff --git a/src/optionstr.c b/src/optionstr.c index 44e178cba..c26667a2b 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -1462,9 +1462,8 @@ ambw_end: } if (varp == &T_BE && termcap_active) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; + if (*T_BE == NUL) // When clearing t_BE we assume the user no longer wants // bracketed paste, thus disable it by writing t_BD. diff --git a/src/term.c b/src/term.c index 7449d88c6..96a81800a 100644 --- a/src/term.c +++ b/src/term.c @@ -2570,7 +2570,7 @@ out_flush(void) out_pos = 0; ui_write(out_buf, len, FALSE); #ifdef FEAT_JOB_CHANNEL - if (ch_log_output) + if (ch_log_output != FALSE) { out_buf[len] = NUL; ch_log(NULL, "raw %s output: \"%s\"", @@ -2579,7 +2579,8 @@ out_flush(void) # endif "terminal", out_buf); - ch_log_output = FALSE; + if (ch_log_output == TRUE) + ch_log_output = FALSE; // only log once } #endif } @@ -3106,9 +3107,8 @@ term_ul_rgb_color(guicolor_T rgb) void term_settitle(char_u *title) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; + // t_ts takes one argument: column in status line OUT_STR(tgoto((char *)T_TS, 0, 0)); // set title start out_str_nf(title); @@ -3610,9 +3610,8 @@ settmode(tmode_T tmode) if (termcap_active && tmode != TMODE_SLEEP && cur_tmode != TMODE_SLEEP) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; + if (tmode != TMODE_RAW) { out_str(T_BD); // disable bracketed paste mode @@ -3643,9 +3642,8 @@ starttermcap(void) { if (full_screen && !termcap_active) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; + out_str(T_TI); // start termcap mode out_str(T_CTI); // start "raw" mode out_str(T_KS); // start "keypad transmit" mode @@ -3705,9 +3703,7 @@ stoptermcap(void) check_for_codes_from_term(); } #endif -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; #if defined(UNIX) || defined(VMS) // Disable xterm's focus reporting mode if 'esckeys' is set. @@ -3750,9 +3746,7 @@ may_req_termresponse(void) && starting == 0 && *T_CRV != NUL) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; LOG_TR(("Sending CRV request")); out_str(T_CRV); termrequest_sent(&crv_status); @@ -3791,9 +3785,7 @@ check_terminal_behavior(void) // width, that will be (1, 2). This function has the side effect that // changes cursor position, so it must be called immediately after // entering termcap mode. -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; LOG_TR(("Sending request for ambiwidth check")); // Do this in the second row. In the first row the returned sequence // may be CSI 1;2R, which is the same as <S-F3>. @@ -3822,9 +3814,7 @@ check_terminal_behavior(void) // sequence is ignored and the cursor does not move. If the terminal // handles test sequence incorrectly, a garbage string is displayed and // the cursor does move. -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; LOG_TR(("Sending xterm compatibility test sequence.")); // Do this in the third row. Second row is used by ambiguous // character width check. @@ -3875,9 +3865,7 @@ may_req_bg_color(void) // Only request foreground if t_RF is set. if (rfg_status.tr_progress == STATUS_GET && *T_RFG != NUL) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; LOG_TR(("Sending FG request")); out_str(T_RFG); termrequest_sent(&rfg_status); @@ -3888,9 +3876,7 @@ may_req_bg_color(void) // Only request background if t_RB is set. if (rbg_status.tr_progress == STATUS_GET && *T_RBG != NUL) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; LOG_TR(("Sending BG request")); out_str(T_RBG); termrequest_sent(&rbg_status); @@ -3954,9 +3940,7 @@ scroll_start(void) { if (*T_VS != NUL && *T_CVS != NUL) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; out_str(T_VS); out_str(T_CVS); screen_start(); // don't know where cursor is now @@ -4866,9 +4850,7 @@ handle_version_response(int first, int *arg, int argc, char_u *tp) && *T_CSH != NUL && *T_CRS != NUL) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; LOG_TR(("Sending cursor style request")); out_str(T_CRS); termrequest_sent(&rcs_status); @@ -4883,9 +4865,7 @@ handle_version_response(int first, int *arg, int argc, char_u *tp) && term_props[TPR_CURSOR_BLINK].tpr_status == TPR_YES && *T_CRC != NUL) { -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; LOG_TR(("Sending cursor blink mode request")); out_str(T_CRC); termrequest_sent(&rbm_status); @@ -6455,9 +6435,7 @@ req_more_codes_from_term(void) { char *key_name = key_names[xt_index_out]; -#ifdef FEAT_JOB_CHANNEL - ch_log_output = TRUE; -#endif + MAY_WANT_TO_LOG_THIS; LOG_TR(("Requesting XT %d: %s", xt_index_out, key_name)); sprintf(buf, "\033P+q%02x%02x\033\\", key_name[0], key_name[1]); out_str_nf((char_u *)buf); diff --git a/src/version.c b/src/version.c index 5e666eda3..8e048b1ee 100644 --- a/src/version.c +++ b/src/version.c @@ -735,6 +735,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 5056, +/**/ 5055, /**/ 5054, @@ -1479,6 +1479,17 @@ typedef enum #define MAYBE 2 // sometimes used for a variant on TRUE +#define LOG_ALWAYS 9 // must be different from TRUE and FALSE + +#ifdef FEAT_JOB_CHANNEL +// If "--log logfile" was used or ch_logfile() was called then log some or all +// terminal output. +# define MAY_WANT_TO_LOG_THIS if (ch_log_output == FALSE) ch_log_output = TRUE; +#else +// no logging support +# define MAY_WANT_TO_LOG_THIS +#endif + #ifndef UINT32_T typedef UINT32_TYPEDEF UINT32_T; #endif |