]> granicus.if.org Git - vim/commitdiff
patch 8.1.0992: a :normal command resets the reg_executing() result v8.1.0992
authorBram Moolenaar <Bram@vim.org>
Mon, 4 Mar 2019 10:40:12 +0000 (11:40 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 4 Mar 2019 10:40:12 +0000 (11:40 +0100)
Problem:    A :normal command while executing a register resets the
            reg_executing() result.
Solution:   Save and restore reg_executing. (closes #4066)

src/ex_docmd.c
src/structs.h
src/testdir/test_functions.vim
src/version.c

index 6e61cca9b3604e471549ab6683e55bad1af4782b..f30d9336af244197a03316912af95e93b6bedaf8 100644 (file)
@@ -10260,6 +10260,7 @@ save_current_state(save_state_T *sst)
     sst->save_insertmode = p_im;
     sst->save_finish_op = finish_op;
     sst->save_opcount = opcount;
+    sst->save_reg_executing = reg_executing;
 
     msg_scroll = FALSE;            /* no msg scrolling in Normal 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;
     finish_op = sst->save_finish_op;
     opcount = sst->save_opcount;
+    reg_executing = sst->save_reg_executing;
     msg_didout |= sst->save_msg_didout;        /* don't reset msg_didout now */
 
     /* Restore the state (needed when called from a function executed for
index ab84eaeaa1eeac9277853fe41610f9af847e1553..6aeed891e62abf3718ba573e1078a070e9af4b3a 100644 (file)
@@ -2625,19 +2625,19 @@ typedef struct w_line
  */
 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_newwidth;    /* new width used in win_equal_rec() */
+    int                fr_newwidth;    // new width used in win_equal_rec()
     int                fr_height;
-    int                fr_newheight;   /* new height used in win_equal_rec() */
-    frame_T    *fr_parent;     /* containing frame or NULL */
-    frame_T    *fr_next;       /* frame right or below in same parent, NULL
-                                  for first */
-    frame_T    *fr_prev;       /* frame left or above in same parent, NULL
-                                  for last */
-    /* fr_child and fr_win are mutually exclusive */
-    frame_T    *fr_child;      /* first contained frame */
-    win_T      *fr_win;        /* window that fills this frame */
+    int                fr_newheight;   // new height used in win_equal_rec()
+    frame_T    *fr_parent;     // containing frame or NULL
+    frame_T    *fr_next;       // frame right or below in same parent, NULL
+                               // for last
+    frame_T    *fr_prev;       // frame left or above in same parent, NULL
+                               // for first
+    // fr_child and fr_win are mutually exclusive
+    frame_T    *fr_child;      // first contained frame
+    win_T      *fr_win;        // window that fills this frame
 };
 
 #define FR_LEAF        0       /* frame is a leaf */
@@ -3527,6 +3527,7 @@ typedef struct {
     int                save_insertmode;
     int                save_finish_op;
     int                save_opcount;
+    int                save_reg_executing;
     tasave_T   tabuf;
 } save_state_T;
 
index a7caf224082111949d7dc564696b5e469512c913..43c0f63c21573e8c318194dc807ce7c755b12f9c 100644 (file)
@@ -1137,6 +1137,15 @@ func Test_reg_executing_and_recording()
   call feedkeys("q\"\"=s:save_reg_stat()\<CR>pq", 'xt')
   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!
   delfunc s:save_reg_stat
   unlet s:reg_stat
index 1824903a948ae7c89806826ec382bc7eb8516ce2..4ac981e6a01c68eeee3363519a9868d5719d5851 100644 (file)
@@ -779,6 +779,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    992,
 /**/
     991,
 /**/