# HG changeset patch # User Bram Moolenaar # Date 1682775002 -7200 # Node ID 93b3ca8df26a8b4a32ba6170c1a77108320662be # Parent 9ee523cc39d0aa75fb10239d85c904e4046b13ef patch 9.0.1498: in a terminal window the cursor may jump around Commit: https://github.com/vim/vim/commit/58806c1553afa2924377f6445ac6ed8cb852f9ca Author: Bram Moolenaar Date: Sat Apr 29 14:26:02 2023 +0100 patch 9.0.1498: in a terminal window the cursor may jump around Problem: In a terminal window the cursor may jump around. (Kenny Stauffer) Solution: Do not move the cursor to the position for terminal-normal mode. (closes #12312) diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -1209,6 +1209,24 @@ term_write_job_output(term_T *term, char } static void +position_cursor(win_T *wp, VTermPos *pos) +{ + wp->w_wrow = MIN(pos->row, MAX(0, wp->w_height - 1)); + wp->w_wcol = MIN(pos->col, MAX(0, wp->w_width - 1)); +#ifdef FEAT_PROP_POPUP + if (popup_is_popup(wp)) + { + wp->w_wrow += popup_top_extra(wp); + wp->w_wcol += popup_left_extra(wp); + wp->w_flags |= WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED; + } + else + wp->w_flags &= ~(WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED); +#endif + wp->w_valid |= (VALID_WCOL|VALID_WROW); +} + + static void update_cursor(term_T *term, int redraw) { if (term->tl_normal_mode) @@ -1219,7 +1237,16 @@ update_cursor(term_T *term, int redraw) term->tl_cursor_pos.col); else #endif + if (!term_job_running(term)) + // avoid the cursor positioned below the last used line setcursor(); + else + { + // do not use the window cursor position + position_cursor(curwin, &curbuf->b_term->tl_cursor_pos); + windgoto(W_WINROW(curwin) + curwin->w_wrow, + curwin->w_wincol + curwin->w_wcol); + } if (redraw) { aco_save_T aco; @@ -2358,24 +2385,6 @@ send_keys_to_term(term_T *term, int c, i return OK; } - static void -position_cursor(win_T *wp, VTermPos *pos) -{ - wp->w_wrow = MIN(pos->row, MAX(0, wp->w_height - 1)); - wp->w_wcol = MIN(pos->col, MAX(0, wp->w_width - 1)); -#ifdef FEAT_PROP_POPUP - if (popup_is_popup(wp)) - { - wp->w_wrow += popup_top_extra(wp); - wp->w_wcol += popup_left_extra(wp); - wp->w_flags |= WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED; - } - else - wp->w_flags &= ~(WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED); -#endif - wp->w_valid |= (VALID_WCOL|VALID_WROW); -} - /* * Handle CTRL-W "": send register contents to the job. */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1498, +/**/ 1497, /**/ 1496,