]> granicus.if.org Git - vim/commitdiff
patch 8.1.0036: not restoring Insert mode if leaving prompt buffer with mouse v8.1.0036
authorBram Moolenaar <Bram@vim.org>
Wed, 6 Jun 2018 16:02:39 +0000 (18:02 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 6 Jun 2018 16:02:39 +0000 (18:02 +0200)
Problem:    Not restoring Insert mode if leaving a prompt buffer by using a
            mouse click.
Solution:   Set b_prompt_insert appropriately. Also correct cursor position
            when moving cursor to last line.

src/buffer.c
src/edit.c
src/version.c
src/window.c

index 1c55acbaf2b143e1c1fb54cb782bf6b7f25b1688..68b4a045757480ab231219da3d317d72f163b7f4 100644 (file)
@@ -5733,6 +5733,10 @@ buf_spname(buf_T *buf)
 #endif
        if (buf->b_fname != NULL)
            return buf->b_fname;
+#ifdef FEAT_JOB_CHANNEL
+       if (bt_prompt(buf))
+           return (char_u *)_("[Prompt]");
+#endif
        return (char_u *)_("[Scratch]");
     }
 
index 76cbfce54984e7d184479e49b768d8f3b8e42b96..7c7fadd10a1abd52f7f96deff6d531e44fb34757 100644 (file)
@@ -1411,11 +1411,10 @@ doESCkey:
 #ifdef FEAT_JOB_CHANNEL
            if (bt_prompt(curbuf))
            {
-               buf_T *buf = curbuf;
-
                invoke_prompt_callback();
-               if (curbuf != buf)
-                   // buffer changed, get out of Insert mode
+               if (!bt_prompt(curbuf))
+                   // buffer changed to a non-prompt buffer, get out of
+                   // Insert mode
                    goto doESCkey;
                break;
            }
@@ -1906,6 +1905,8 @@ init_prompt(int cmdchar_todo)
        coladvance((colnr_T)MAXCOL);
     if (cmdchar_todo == 'I' || curwin->w_cursor.col <= (int)STRLEN(prompt))
        curwin->w_cursor.col = STRLEN(prompt);
+    /* Make sure the cursor is in a valid position. */
+    check_cursor();
 }
 
 /*
@@ -9467,7 +9468,7 @@ ins_bs(
 
     /* If deleted before the insertion point, adjust it */
     if (curwin->w_cursor.lnum == Insstart_orig.lnum
-                                      && curwin->w_cursor.col < Insstart_orig.col)
+                                 && curwin->w_cursor.col < Insstart_orig.col)
        Insstart_orig.col = curwin->w_cursor.col;
 
     /* vi behaviour: the cursor moves backward but the character that
@@ -9517,6 +9518,11 @@ ins_mouse(int c)
             * previous one to stop insert there properly. */
            curwin = old_curwin;
            curbuf = curwin->w_buffer;
+#ifdef FEAT_JOB_CHANNEL
+           if (bt_prompt(curbuf))
+               // Restart Insert mode when re-entering the prompt buffer.
+               curbuf->b_prompt_insert = 'A';
+#endif
        }
        start_arrow(curwin == old_curwin ? &tpos : NULL);
        if (curwin != new_curwin && win_valid(new_curwin))
index c7c5bfd779045a0d3babf2f802fbe812d3542dda..8f17fac84037ed1bedd074902473f0b7a396803e 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    36,
 /**/
     35,
 /**/
index f86d11eb3b206acd086809e3a4ff5776ef43efb5..27ef9d5cc27381e3a73a9a34f0a2356c6e6b5426 100644 (file)
@@ -2115,12 +2115,21 @@ leaving_window(win_T *win)
     // When leaving the window (or closing the window) was done from a
     // callback we need to break out of the Insert mode loop.
     if (State & INSERT)
+    {
        stop_insert_mode = TRUE;
+       if (bt_prompt(win->w_buffer) && win->w_buffer->b_prompt_insert == NUL)
+           win->w_buffer->b_prompt_insert = 'A';
+    }
 }
 
     static void
 entering_window(win_T *win)
 {
+    // When switching to a prompt buffer that was in Insert mode, don't stop
+    // Insert mode, it may have been set in leaving_window().
+    if (bt_prompt(win->w_buffer) && win->w_buffer->b_prompt_insert != NUL)
+       stop_insert_mode = FALSE;
+
     // When entering the prompt window may restart Insert mode.
     restart_edit = win->w_buffer->b_prompt_insert;
 }