Index: src/normal.c
===================================================================
--- src/normal.c (revision 57807)
+++ src/normal.c (working copy)
@@ -7393,6 +7393,8 @@
}
else
{
+ if (Unix2003_compat && cap->cmdchar == 'S')
+ beginline(0);
if (cap->count0)
stuffnumReadbuff(cap->count0);
stuffReadbuff(ar[(int)(vim_strchr(str, cap->cmdchar) - str)]);
@@ -8318,6 +8320,8 @@
if (!checkclearopq(cap->oap))
{
+ int undo_offset = 0;
+ int save;
#ifdef FEAT_FOLDING
if (cap->cmdchar == 'O')
/* Open above the first line of a folded sequence of lines */
@@ -8328,11 +8332,21 @@
(void)hasFolding(curwin->w_cursor.lnum,
NULL, &curwin->w_cursor.lnum);
#endif
- if (u_save((linenr_T)(curwin->w_cursor.lnum -
+ if (Unix2003_compat) {
+ beginline(0);
+ /* Undo of 'O' leaves cursor above the deleted line */
+ if (cap->cmdchar == 'O' && curwin->w_cursor.lnum > 1) {
+ undo_offset = 1;
+ curwin->w_cursor.lnum--;
+ }
+ }
+ save = u_save((linenr_T)(curwin->w_cursor.lnum + undo_offset -
(cap->cmdchar == 'O' ? 1 : 0)),
- (linenr_T)(curwin->w_cursor.lnum +
+ (linenr_T)(curwin->w_cursor.lnum + undo_offset +
(cap->cmdchar == 'o' ? 1 : 0))
- ) == OK
+ ) == OK;
+ curwin->w_cursor.lnum += undo_offset;
+ if (save
&& open_line(cap->cmdchar == 'O' ? BACKWARD : FORWARD,
#ifdef FEAT_COMMENTS
has_format_option(FO_OPEN_COMS) ? OPENLINE_DO_COM :