0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.1.0992: a :normal command resets the reg_executing() result

Problem:    A :normal command while executing a register resets the
            reg_executing() result.
Solution:   Save and restore reg_executing. (closes #4066)
This commit is contained in:
Bram Moolenaar 2019-03-04 11:40:12 +01:00
parent 975880b6e6
commit cce713ddcc
4 changed files with 25 additions and 11 deletions

View File

@ -10260,6 +10260,7 @@ save_current_state(save_state_T *sst)
sst->save_insertmode = p_im; sst->save_insertmode = p_im;
sst->save_finish_op = finish_op; sst->save_finish_op = finish_op;
sst->save_opcount = opcount; sst->save_opcount = opcount;
sst->save_reg_executing = reg_executing;
msg_scroll = FALSE; /* no msg scrolling in Normal mode */ msg_scroll = FALSE; /* no msg scrolling in Normal mode */
restart_edit = 0; /* don't go to Insert mode */ restart_edit = 0; /* don't go to Insert mode */
@ -10285,6 +10286,7 @@ restore_current_state(save_state_T *sst)
p_im = sst->save_insertmode; p_im = sst->save_insertmode;
finish_op = sst->save_finish_op; finish_op = sst->save_finish_op;
opcount = sst->save_opcount; opcount = sst->save_opcount;
reg_executing = sst->save_reg_executing;
msg_didout |= sst->save_msg_didout; /* don't reset msg_didout now */ msg_didout |= sst->save_msg_didout; /* don't reset msg_didout now */
/* Restore the state (needed when called from a function executed for /* Restore the state (needed when called from a function executed for

View File

@ -2625,19 +2625,19 @@ typedef struct w_line
*/ */
struct frame_S struct frame_S
{ {
char fr_layout; /* FR_LEAF, FR_COL or FR_ROW */ char fr_layout; // FR_LEAF, FR_COL or FR_ROW
int fr_width; int fr_width;
int fr_newwidth; /* new width used in win_equal_rec() */ int fr_newwidth; // new width used in win_equal_rec()
int fr_height; int fr_height;
int fr_newheight; /* new height used in win_equal_rec() */ int fr_newheight; // new height used in win_equal_rec()
frame_T *fr_parent; /* containing frame or NULL */ frame_T *fr_parent; // containing frame or NULL
frame_T *fr_next; /* frame right or below in same parent, NULL frame_T *fr_next; // frame right or below in same parent, NULL
for first */ // for last
frame_T *fr_prev; /* frame left or above in same parent, NULL frame_T *fr_prev; // frame left or above in same parent, NULL
for last */ // for first
/* fr_child and fr_win are mutually exclusive */ // fr_child and fr_win are mutually exclusive
frame_T *fr_child; /* first contained frame */ frame_T *fr_child; // first contained frame
win_T *fr_win; /* window that fills this frame */ win_T *fr_win; // window that fills this frame
}; };
#define FR_LEAF 0 /* frame is a leaf */ #define FR_LEAF 0 /* frame is a leaf */
@ -3527,6 +3527,7 @@ typedef struct {
int save_insertmode; int save_insertmode;
int save_finish_op; int save_finish_op;
int save_opcount; int save_opcount;
int save_reg_executing;
tasave_T tabuf; tasave_T tabuf;
} save_state_T; } save_state_T;

View File

@ -1137,6 +1137,15 @@ func Test_reg_executing_and_recording()
call feedkeys("q\"\"=s:save_reg_stat()\<CR>pq", 'xt') call feedkeys("q\"\"=s:save_reg_stat()\<CR>pq", 'xt')
call assert_equal('":', s:reg_stat) call assert_equal('":', s:reg_stat)
" :normal command saves and restores reg_executing
let @q = ":call TestFunc()\<CR>:call s:save_reg_stat()\<CR>"
func TestFunc() abort
normal! ia
endfunc
call feedkeys("@q", 'xt')
call assert_equal(':q', s:reg_stat)
delfunc TestFunc
bwipe! bwipe!
delfunc s:save_reg_stat delfunc s:save_reg_stat
unlet s:reg_stat unlet s:reg_stat

View File

@ -779,6 +779,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
992,
/**/ /**/
991, 991,
/**/ /**/