]> granicus.if.org Git - vim/commitdiff
patch 8.2.1595: cannot easily see what Vim sends to the terminal v8.2.1595
authorBram Moolenaar <Bram@vim.org>
Sat, 5 Sep 2020 12:27:24 +0000 (14:27 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 5 Sep 2020 12:27:24 +0000 (14:27 +0200)
Problem:    Cannot easily see what Vim sends to the terminal.
Solution:   Write output to the channel log if it contains terminal control
            sequences.  Avoid warnings for tputs() argument.

src/edit.c
src/globals.h
src/normal.c
src/optionstr.c
src/term.c
src/version.c

index bc74f44bb4774d6f058f7bd89de7a5e963179f86..41154389ea4b9864e60788ae9d8b0f874d0d17c1 100644 (file)
@@ -315,6 +315,9 @@ edit(
 #endif
     if (!p_ek)
     {
+#ifdef FEAT_JOB_CHANNEL
+       ch_log_output = TRUE;
+#endif
        // Disable bracketed paste mode, we won't recognize the escape
        // sequences.
        out_str(T_BD);
@@ -3724,6 +3727,9 @@ ins_esc(
 #endif
     if (!p_ek)
     {
+#ifdef FEAT_JOB_CHANNEL
+       ch_log_output = TRUE;
+#endif
        // Re-enable bracketed paste mode.
        out_str(T_BE);
 
index 7dbc49e3ecbd6f2b893a6bf45322a7693b838a35..7477992b1fd43c40278d36f585f101bd925f9c2c 100644 (file)
@@ -1898,6 +1898,10 @@ EXTERN int did_repeated_msg INIT(= 0);
 # define REPEATED_MSG_LOOKING      1
 # define REPEATED_MSG_SAFESTATE            2
 
+// This flag is set when outputting a terminal control code and reset in
+// out_flush() when characters have been written.
+EXTERN int ch_log_output INIT(= FALSE);
+
 #define FOR_ALL_CHANNELS(ch) \
     for ((ch) = first_channel; (ch) != NULL; (ch) = (ch)->ch_next)
 #define FOR_ALL_JOBS(job) \
index 966c1a1faa94addcbcb9551b3d35b4527021992f..673cac83e2dd4e100d02c79cd3ffa9c66dbb7d1d 100644 (file)
@@ -897,6 +897,9 @@ getcount:
 #endif
            if ((State & INSERT) && !p_ek)
            {
+#ifdef FEAT_JOB_CHANNEL
+               ch_log_output = TRUE;
+#endif
                // Disable bracketed paste and modifyOtherKeys here, we won't
                // recognize the escape sequences with 'esckeys' off.
                out_str(T_BD);
@@ -907,6 +910,9 @@ getcount:
 
            if ((State & INSERT) && !p_ek)
            {
+#ifdef FEAT_JOB_CHANNEL
+               ch_log_output = TRUE;
+#endif
                // Re-enable bracketed paste mode and modifyOtherKeys
                out_str(T_BE);
                out_str(T_CTI);
index 177ce859fdd12768a21d63aca8e6af0adcf9a832..430e3c34cdc0c964bc2810a0599d3fbe97f4556d 100644 (file)
@@ -1434,6 +1434,9 @@ did_set_string_option(
        }
        if (varp == &T_BE && termcap_active)
        {
+#ifdef FEAT_JOB_CHANNEL
+           ch_log_output = TRUE;
+#endif
            if (*T_BE == NUL)
                // When clearing t_BE we assume the user no longer wants
                // bracketed paste, thus disable it by writing t_BD.
index b1a7a66c584622f1fe59297eed1e5acd9ad92a2f..4d32c043a32d3792290f2980f7619c420a90d2e8 100644 (file)
@@ -43,7 +43,7 @@
 #  ifdef HAVE_OUTFUNTYPE
 #   define TPUTSFUNCAST (outfuntype)
 #  else
-#   define TPUTSFUNCAST (int (*)())
+#   define TPUTSFUNCAST (int (*)(int))
 #  endif
 # endif
 #endif
@@ -2515,6 +2515,14 @@ out_flush(void)
        len = out_pos;
        out_pos = 0;
        ui_write(out_buf, len);
+#ifdef FEAT_JOB_CHANNEL
+       if (ch_log_output)
+       {
+           out_buf[len] = NUL;
+           ch_log(NULL, "raw terminal output: \"%s\"", out_buf);
+           ch_log_output = FALSE;
+       }
+#endif
     }
 }
 
@@ -2586,13 +2594,14 @@ out_char(unsigned c)
 /*
  * Output "c" like out_char(), but don't flush when p_wd is set.
  */
-    static void
-out_char_nf(unsigned c)
+    static int
+out_char_nf(int c)
 {
-    out_buf[out_pos++] = c;
+    out_buf[out_pos++] = (unsigned)c;
 
     if (out_pos >= OUT_SIZE)
        out_flush();
+    return (unsigned)c;
 }
 
 /*
@@ -3031,6 +3040,9 @@ term_ul_rgb_color(guicolor_T rgb)
     void
 term_settitle(char_u *title)
 {
+#ifdef FEAT_JOB_CHANNEL
+    ch_log_output = TRUE;
+#endif
     // t_ts takes one argument: column in status line
     OUT_STR(tgoto((char *)T_TS, 0, 0));        // set title start
     out_str_nf(title);
@@ -3529,6 +3541,9 @@ settmode(tmode_T tmode)
            if (termcap_active && tmode != TMODE_SLEEP
                                                   && cur_tmode != TMODE_SLEEP)
            {
+#ifdef FEAT_JOB_CHANNEL
+               ch_log_output = TRUE;
+#endif
                if (tmode != TMODE_RAW)
                {
                    out_str(T_BD);      // disable bracketed paste mode
@@ -3559,6 +3574,9 @@ starttermcap(void)
 {
     if (full_screen && !termcap_active)
     {
+#ifdef FEAT_JOB_CHANNEL
+       ch_log_output = TRUE;
+#endif
        out_str(T_TI);                  // start termcap mode
        out_str(T_CTI);                 // start "raw" mode
        out_str(T_KS);                  // start "keypad transmit" mode
@@ -3610,6 +3628,9 @@ stoptermcap(void)
            // get them.
            check_for_codes_from_term();
        }
+#endif
+#ifdef FEAT_JOB_CHANNEL
+       ch_log_output = TRUE;
 #endif
        out_str(T_BD);                  // disable bracketed paste mode
        out_str(T_KE);                  // stop "keypad transmit" mode
@@ -3646,6 +3667,9 @@ may_req_termresponse(void)
            && starting == 0
            && *T_CRV != NUL)
     {
+#ifdef FEAT_JOB_CHANNEL
+       ch_log_output = TRUE;
+#endif
        LOG_TR(("Sending CRV request"));
        out_str(T_CRV);
        termrequest_sent(&crv_status);
@@ -3684,6 +3708,9 @@ 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
        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>.
@@ -3712,6 +3739,9 @@ 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
        LOG_TR(("Sending xterm compatibility test sequence."));
        // Do this in the third row.  Second row is used by ambiguous
        // chararacter width check.
@@ -3762,6 +3792,9 @@ 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
            LOG_TR(("Sending FG request"));
            out_str(T_RFG);
            termrequest_sent(&rfg_status);
@@ -3772,6 +3805,9 @@ 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
            LOG_TR(("Sending BG request"));
            out_str(T_RBG);
            termrequest_sent(&rbg_status);
@@ -3835,6 +3871,9 @@ scroll_start(void)
 {
     if (*T_VS != NUL && *T_CVS != NUL)
     {
+#ifdef FEAT_JOB_CHANNEL
+       ch_log_output = TRUE;
+#endif
        out_str(T_VS);
        out_str(T_CVS);
        screen_start();         // don't know where cursor is now
@@ -4685,6 +4724,9 @@ 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
            LOG_TR(("Sending cursor style request"));
            out_str(T_CRS);
            termrequest_sent(&rcs_status);
@@ -4699,6 +4741,9 @@ 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
            LOG_TR(("Sending cursor blink mode request"));
            out_str(T_CRC);
            termrequest_sent(&rbm_status);
@@ -6120,6 +6165,9 @@ req_more_codes_from_term(void)
     {
        char *key_name = key_names[xt_index_out];
 
+#ifdef FEAT_JOB_CHANNEL
+       ch_log_output = TRUE;
+#endif
        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);
index bd15f3d771e935ec95d66c4e59dbd6644c37135e..b43e393978e498a39c979257b4214e6cd9616bda 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1595,
 /**/
     1594,
 /**/