Patch 8.1.1055
Problem: CTRL-G U in Insert mode doesn't work to avoid splitting the undo
sequence for shift-left and shift-right.
Solution: Also check dont_sync_undo for shifted cursor keys. (Christian
Brabandt)
Files: src/edit.c, src/testdir/test_mapping.vim
*** ../vim-8.1.1054/src/edit.c 2019-03-21 21:45:30.875282175 +0100
--- src/edit.c 2019-03-26 21:58:45.370578667 +0100
***************
*** 236,246 ****
#if defined(FEAT_GUI_TABLINE) || defined(PROTO)
static void ins_tabline(int c);
#endif
! static void ins_left(int end_change);
static void ins_home(int c);
static void ins_end(int c);
static void ins_s_left(void);
! static void ins_right(int end_change);
static void ins_s_right(void);
static void ins_up(int startcol);
static void ins_pageup(void);
--- 236,246 ----
#if defined(FEAT_GUI_TABLINE) || defined(PROTO)
static void ins_tabline(int c);
#endif
! static void ins_left(void);
static void ins_home(int c);
static void ins_end(int c);
static void ins_s_left(void);
! static void ins_right(void);
static void ins_s_right(void);
static void ins_up(int startcol);
static void ins_pageup(void);
***************
*** 290,299 ****
char. Set when edit() is called.
after that arrow_used is used. */
! static int did_add_space = FALSE; /* auto_format() added an extra space
! under the cursor */
! static int dont_sync_undo = FALSE; /* CTRL-G U prevents syncing undo for
! the next left/right cursor */
/*
* edit(): Start inserting text.
--- 290,299 ----
char. Set when edit() is called.
after that arrow_used is used. */
! static int did_add_space = FALSE; // auto_format() added an extra space
! // under the cursor
! static int dont_sync_undo = FALSE; // CTRL-G U prevents syncing undo for
! // the next left/right cursor key
/*
* edit(): Start inserting text.
***************
*** 1284,1290 ****
if (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))
ins_s_left();
else
! ins_left(dont_sync_undo == FALSE);
break;
case K_S_LEFT: /* <S-Left> */
--- 1284,1290 ----
if (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))
ins_s_left();
else
! ins_left();
break;
case K_S_LEFT: /* <S-Left> */
***************
*** 1296,1302 ****
if (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))
ins_s_right();
else
! ins_right(dont_sync_undo == FALSE);
break;
case K_S_RIGHT: /* <S-Right> */
--- 1296,1302 ----
if (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))
ins_s_right();
else
! ins_right();
break;
case K_S_RIGHT: /* <S-Right> */
***************
*** 9291,9300 ****
#endif
static void
! ins_left(
! int end_change) /* end undoable change */
{
pos_T tpos;
#ifdef FEAT_FOLDING
if ((fdo_flags & FDO_HOR) && KeyTyped)
--- 9291,9300 ----
#endif
static void
! ins_left(void)
{
pos_T tpos;
+ int end_change = dont_sync_undo == FALSE; // end undoable
change
#ifdef FEAT_FOLDING
if ((fdo_flags & FDO_HOR) && KeyTyped)
***************
*** 9378,9385 ****
}
static void
! ins_s_left(void)
{
#ifdef FEAT_FOLDING
if ((fdo_flags & FDO_HOR) && KeyTyped)
foldOpenCursor();
--- 9378,9386 ----
}
static void
! ins_s_left()
{
+ int end_change = dont_sync_undo == FALSE; // end undoable change
#ifdef FEAT_FOLDING
if ((fdo_flags & FDO_HOR) && KeyTyped)
foldOpenCursor();
***************
*** 9387,9404 ****
undisplay_dollar();
if (curwin->w_cursor.lnum > 1 || curwin->w_cursor.col > 0)
{
! start_arrow(&curwin->w_cursor);
(void)bck_word(1L, FALSE, FALSE);
curwin->w_set_curswant = TRUE;
}
else
vim_beep(BO_CRSR);
}
static void
! ins_right(
! int end_change) /* end undoable change */
{
#ifdef FEAT_FOLDING
if ((fdo_flags & FDO_HOR) && KeyTyped)
foldOpenCursor();
--- 9388,9409 ----
undisplay_dollar();
if (curwin->w_cursor.lnum > 1 || curwin->w_cursor.col > 0)
{
! start_arrow_with_change(&curwin->w_cursor, end_change);
! if (!end_change)
! AppendCharToRedobuff(K_S_LEFT);
(void)bck_word(1L, FALSE, FALSE);
curwin->w_set_curswant = TRUE;
}
else
vim_beep(BO_CRSR);
+ dont_sync_undo = FALSE;
}
static void
! ins_right(void)
{
+ int end_change = dont_sync_undo == FALSE; // end undoable change
+
#ifdef FEAT_FOLDING
if ((fdo_flags & FDO_HOR) && KeyTyped)
foldOpenCursor();
***************
*** 9442,9449 ****
}
static void
! ins_s_right(void)
{
#ifdef FEAT_FOLDING
if ((fdo_flags & FDO_HOR) && KeyTyped)
foldOpenCursor();
--- 9447,9455 ----
}
static void
! ins_s_right()
{
+ int end_change = dont_sync_undo == FALSE; // end undoable change
#ifdef FEAT_FOLDING
if ((fdo_flags & FDO_HOR) && KeyTyped)
foldOpenCursor();
***************
*** 9452,9463 ****
if (curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count
|| gchar_cursor() != NUL)
{
! start_arrow(&curwin->w_cursor);
(void)fwd_word(1L, FALSE, 0);
curwin->w_set_curswant = TRUE;
}
else
vim_beep(BO_CRSR);
}
static void
--- 9458,9472 ----
if (curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count
|| gchar_cursor() != NUL)
{
! start_arrow_with_change(&curwin->w_cursor, end_change);
! if (!end_change)
! AppendCharToRedobuff(K_S_RIGHT);
(void)fwd_word(1L, FALSE, 0);
curwin->w_set_curswant = TRUE;
}
else
vim_beep(BO_CRSR);
+ dont_sync_undo = FALSE;
}
static void
*** ../vim-8.1.1054/src/testdir/test_mapping.vim 2019-01-30
22:01:36.982854408 +0100
--- src/testdir/test_mapping.vim 2019-03-26 21:53:59.040601292 +0100
***************
*** 140,148 ****
imapclear
endfunc
" This isn't actually testing a mapping, but similar use of CTRL-G U as above.
func Test_break_undo()
! :set whichwrap=<,>,[,]
call feedkeys("G4o 2k", "xt")
exe ":norm! iTest3: text with a (parenthesis here\<C-G>U\<Right>new line
here\<esc>\<up>\<up>."
call assert_equal('new line here', getline(line('$') - 3))
--- 140,171 ----
imapclear
endfunc
+ func Test_map_cursor_ctrl_gU()
+ " <c-g>U<cursor> works only within a single line
+ nnoremap c<* *Ncgn<C-r>"<C-G>U<S-Left>
+ call setline(1, ['foo', 'foobar', '', 'foo'])
+ call cursor(1,2)
+ call feedkeys("c<*PREFIX\<esc>.", 'xt')
+ call assert_equal(['PREFIXfoo', 'foobar', '', 'PREFIXfoo'], getline(1,'$'))
+ " break undo manually
+ set ul=1000
+ exe ":norm! uu"
+ call assert_equal(['foo', 'foobar', '', 'foo'], getline(1,'$'))
+
+ " Test that it does not work if the cursor moves to the previous line
+ " 2 times <S-Left> move to the previous line
+ nnoremap c<* *Ncgn<C-r>"<C-G>U<S-Left><C-G>U<S-Left>
+ call setline(1, ['', ' foo', 'foobar', '', 'foo'])
+ call cursor(2,3)
+ call feedkeys("c<*PREFIX\<esc>.", 'xt')
+ call assert_equal(['PREFIXPREFIX', ' foo', 'foobar', '', 'foo'],
getline(1,'$'))
+ nmapclear
+ endfunc
+
+
" This isn't actually testing a mapping, but similar use of CTRL-G U as above.
func Test_break_undo()
! set whichwrap=<,>,[,]
call feedkeys("G4o 2k", "xt")
exe ":norm! iTest3: text with a (parenthesis here\<C-G>U\<Right>new line
here\<esc>\<up>\<up>."
call assert_equal('new line here', getline(line('$') - 3))
*** ../vim-8.1.1054/src/version.c 2019-03-26 21:44:16.825047310 +0100
--- src/version.c 2019-03-26 22:45:04.210432805 +0100
***************
*** 777,778 ****
--- 777,780 ----
{ /* Add new patch number below this line */
+ /**/
+ 1055,
/**/
--
hundred-and-one symptoms of being an internet addict:
127. You bring your laptop and cellular phone to church.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.