summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-06-06 18:02:39 +0200
committerBram Moolenaar <Bram@vim.org>2018-06-06 18:02:39 +0200
commit891e1fd894720d0b99a9daefa41e8181844f819a (patch)
treeea5da71e753bf0022cc832a1397ea262d8d8a64c /src
parent6d41c78e353b630bc1a72cbff9160311d2a81e8c (diff)
downloadvim-git-891e1fd894720d0b99a9daefa41e8181844f819a.tar.gz
patch 8.1.0036: not restoring Insert mode if leaving prompt buffer with mousev8.1.0036
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.
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c4
-rw-r--r--src/edit.c16
-rw-r--r--src/version.c2
-rw-r--r--src/window.c9
4 files changed, 26 insertions, 5 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 1c55acbaf..68b4a0457 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -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]");
}
diff --git a/src/edit.c b/src/edit.c
index 76cbfce54..7c7fadd10 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -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))
diff --git a/src/version.c b/src/version.c
index c7c5bfd77..8f17fac84 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 36,
+/**/
35,
/**/
34,
diff --git a/src/window.c b/src/window.c
index f86d11eb3..27ef9d5cc 100644
--- a/src/window.c
+++ b/src/window.c
@@ -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;
}