Patch 8.2.1898
Problem:    Command modifier parsing always uses global cmdmod.
Solution:   Pass in cmdmod_T to use.  Rename struct fields consistently.
Files:      src/structs.h, src/arglist.c src/buffer.c, src/bufwrite.c,
            src/diff.c, src/change.c, src/cmdhist.c, src/edit.c,
            src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c,
            src/fileio.c, src/filepath.c, src/gui.c, src/gui_gtk_x11.c,
            src/help.c, src/if_cscope.c, src/indent.c, src/mark.c,
            src/memline.c, src/message.c, src/option.c, src/ops.c,
            src/os_unix.c, src/quickfix.c, src/register.c, src/scriptfile.c,
            src/search.c, src/session.c, src/tag.c, src/terminal.c,
            src/textformat.c, src/usercmd.c, src/vim9compile.c, src/window.c,
            src/proto/ex_docmd.pro


*** ../vim-8.2.1897/src/structs.h       2020-10-24 17:19:12.135743402 +0200
--- src/structs.h       2020-10-24 20:19:08.416401166 +0200
***************
*** 625,648 ****
   */
  typedef struct
  {
!     int               cmod_flags;             // CMOD_ flags, see below
!     int               hide;                   // TRUE when ":hide" was used
! # ifdef FEAT_BROWSE_CMD
!     int               browse;                 // TRUE to invoke file dialog
! # endif
!     int               split;                  // flags for win_split()
!     int               tab;                    // > 0 when ":tab" was used
! # if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!     int               confirm;                // TRUE to invoke yes/no dialog
! # endif
!     int               keepalt;                // TRUE when ":keepalt" was used
!     int               keepmarks;              // TRUE when ":keepmarks" was 
used
!     int               keepjumps;              // TRUE when ":keepjumps" was 
used
!     int               lockmarks;              // TRUE when ":lockmarks" was 
used
!     int               keeppatterns;           // TRUE when ":keeppatterns" 
was used
!     int               noswapfile;             // TRUE when ":noswapfile" was 
used
!     regmatch_T        filter_regmatch;        // set by :filter /pat/
!     int               filter_force;           // set for :filter!
  
      int               cmod_verbose;           // non-zero to set 'verbose'
  
--- 625,650 ----
   */
  typedef struct
  {
!     int               cmod_flags;             // CMOD_ flags
! #define CMOD_SANDBOX      0x0001      // ":sandbox"
! #define CMOD_SILENT       0x0002      // ":silent"
! #define CMOD_ERRSILENT            0x0004      // ":silent!"
! #define CMOD_UNSILENT     0x0008      // ":unsilent"
! #define CMOD_NOAUTOCMD            0x0010      // ":noautocmd"
! #define CMOD_HIDE         0x0020      // ":hide"
! #define CMOD_BROWSE       0x0040      // ":browse" - invoke file dialog
! #define CMOD_CONFIRM      0x0080      // ":confirm" - invoke yes/no dialog
! #define CMOD_KEEPALT      0x0100      // ":keepalt"
! #define CMOD_KEEPMARKS            0x0200      // ":keepmarks"
! #define CMOD_KEEPJUMPS            0x0400      // ":keepjumps"
! #define CMOD_LOCKMARKS            0x0800      // ":lockmarks"
! #define CMOD_KEEPPATTERNS   0x1000    // ":keeppatterns"
! #define CMOD_NOSWAPFILE           0x2000      // ":noswapfile"
! 
!     int               cmod_split;             // flags for win_split()
!     int               cmod_tab;               // > 0 when ":tab" was used
!     regmatch_T        cmod_filter_regmatch;   // set by :filter /pat/
!     int               cmod_filter_force;      // set for :filter!
  
      int               cmod_verbose;           // non-zero to set 'verbose'
  
***************
*** 655,669 ****
                                        // p_verbose plus one
      int               cmod_save_msg_silent;   // if non-zero: saved value of
                                        // msg_silent + 1
      int               cmod_did_esilent;       // incremented when emsg_silent 
is
  } cmdmod_T;
  
- #define CMOD_SANDBOX  0x01
- #define CMOD_SILENT   0x02
- #define CMOD_ERRSILENT        0x04
- #define CMOD_UNSILENT 0x08
- #define CMOD_NOAUTOCMD        0x10
- 
  #define MF_SEED_LEN   8
  
  struct memfile
--- 657,666 ----
                                        // p_verbose plus one
      int               cmod_save_msg_silent;   // if non-zero: saved value of
                                        // msg_silent + 1
+     int               cmod_save_msg_scroll;   // for restoring msg_scroll
      int               cmod_did_esilent;       // incremented when emsg_silent 
is
  } cmdmod_T;
  
  #define MF_SEED_LEN   8
  
  struct memfile
*** ../vim-8.2.1897/src/arglist.c       2020-08-30 19:26:40.736556825 +0200
--- src/arglist.c       2020-10-24 18:05:47.876210088 +0200
***************
*** 657,663 ****
  #endif
  
        // split window or create new tab page first
!       if (*eap->cmd == 's' || cmdmod.tab != 0)
        {
            if (win_split(0, 0) == FAIL)
                return;
--- 657,663 ----
  #endif
  
        // split window or create new tab page first
!       if (*eap->cmd == 's' || cmdmod.cmod_tab != 0)
        {
            if (win_split(0, 0) == FAIL)
                return;
***************
*** 878,884 ****
      alist_T   *alist;         // argument list to be used
      buf_T     *buf;
      tabpage_T *tpnext;
!     int               had_tab = cmdmod.tab;
      win_T     *old_curwin, *last_curwin;
      tabpage_T *old_curtab, *last_curtab;
      win_T     *new_curwin = NULL;
--- 878,884 ----
      alist_T   *alist;         // argument list to be used
      buf_T     *buf;
      tabpage_T *tpnext;
!     int               had_tab = cmdmod.cmod_tab;
      win_T     *old_curwin, *last_curwin;
      tabpage_T *old_curtab, *last_curtab;
      win_T     *new_curwin = NULL;
***************
*** 1116,1122 ****
  
        // When ":tab" was used open a new tab for a new window repeatedly.
        if (had_tab > 0 && tabpage_index(NULL) <= p_tpm)
!           cmdmod.tab = 9999;
      }
  
      // Remove the "lock" on the argument list.
--- 1116,1122 ----
  
        // When ":tab" was used open a new tab for a new window repeatedly.
        if (had_tab > 0 && tabpage_index(NULL) <= p_tpm)
!           cmdmod.cmod_tab = 9999;
      }
  
      // Remove the "lock" on the argument list.
*** ../vim-8.2.1897/src/buffer.c        2020-07-23 16:36:59.828375424 +0200
--- src/buffer.c        2020-10-24 19:47:52.523484266 +0200
***************
*** 1444,1450 ****
        if (!forceit && bufIsChanged(buf))
        {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!           if ((p_confirm || cmdmod.confirm) && p_write)
            {
                dialog_changed(buf, FALSE);
                if (!bufref_valid(&bufref))
--- 1444,1450 ----
        if (!forceit && bufIsChanged(buf))
        {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!           if ((p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM)) && p_write)
            {
                dialog_changed(buf, FALSE);
                if (!bufref_valid(&bufref))
***************
*** 1634,1640 ****
      if (action == DOBUF_GOTO && !can_abandon(curbuf, forceit))
      {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!       if ((p_confirm || cmdmod.confirm) && p_write)
        {
            bufref_T bufref;
  
--- 1634,1640 ----
      if (action == DOBUF_GOTO && !can_abandon(curbuf, forceit))
      {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!       if ((p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM)) && p_write)
        {
            bufref_T bufref;
  
***************
*** 1689,1695 ****
      bufref_T  prevbufref;
  
      setpcmark();
!     if (!cmdmod.keepalt)
        curwin->w_alt_fnum = curbuf->b_fnum; // remember alternate file
      buflist_altfpos(curwin);                   // remember curpos
  
--- 1689,1695 ----
      bufref_T  prevbufref;
  
      setpcmark();
!     if ((cmdmod.cmod_flags & CMOD_KEEPALT) == 0)
        curwin->w_alt_fnum = curbuf->b_fnum; // remember alternate file
      buflist_altfpos(curwin);                   // remember curpos
  
***************
*** 3435,3441 ****
  
      // Create a buffer.  'buflisted' is not set if it's a new buffer
      buf = buflist_new(ffname, sfname, lnum, 0);
!     if (buf != NULL && !cmdmod.keepalt)
        curwin->w_alt_fnum = buf->b_fnum;
      return buf;
  }
--- 3435,3441 ----
  
      // Create a buffer.  'buflisted' is not set if it's a new buffer
      buf = buflist_new(ffname, sfname, lnum, 0);
!     if (buf != NULL && (cmdmod.cmod_flags & CMOD_KEEPALT) == 0)
        curwin->w_alt_fnum = buf->b_fnum;
      return buf;
  }
***************
*** 5068,5074 ****
      int               r;
      int               count;          // Maximum number of windows to open.
      int               all;            // When TRUE also load inactive buffers.
!     int               had_tab = cmdmod.tab;
      tabpage_T *tpnext;
  
      if (eap->addr_count == 0) // make as many windows as possible
--- 5068,5074 ----
      int               r;
      int               count;          // Maximum number of windows to open.
      int               all;            // When TRUE also load inactive buffers.
!     int               had_tab = cmdmod.cmod_tab;
      tabpage_T *tpnext;
  
      if (eap->addr_count == 0) // make as many windows as possible
***************
*** 5099,5105 ****
        {
            wpnext = wp->w_next;
            if ((wp->w_buffer->b_nwindows > 1
!                   || ((cmdmod.split & WSP_VERT)
                        ? wp->w_height + wp->w_status_height < Rows - p_ch
                                                            - tabline_height()
                        : wp->w_width != Columns)
--- 5099,5105 ----
        {
            wpnext = wp->w_next;
            if ((wp->w_buffer->b_nwindows > 1
!                   || ((cmdmod.cmod_split & WSP_VERT)
                        ? wp->w_height + wp->w_status_height < Rows - p_ch
                                                            - tabline_height()
                        : wp->w_width != Columns)
***************
*** 5220,5226 ****
  #endif
        // When ":tab" was used open a new tab for a new window repeatedly.
        if (had_tab > 0 && tabpage_index(NULL) <= p_tpm)
!           cmdmod.tab = 9999;
      }
      --autocmd_no_enter;
      win_enter(firstwin, FALSE);               // back to first window
--- 5220,5226 ----
  #endif
        // When ":tab" was used open a new tab for a new window repeatedly.
        if (had_tab > 0 && tabpage_index(NULL) <= p_tpm)
!           cmdmod.cmod_tab = 9999;
      }
      --autocmd_no_enter;
      win_enter(firstwin, FALSE);               // back to first window
***************
*** 5547,5553 ****
        case 'd': return FALSE;     // "delete"
        case 'h': return TRUE;      // "hide"
      }
!     return (p_hid || cmdmod.hide);
  }
  
  /*
--- 5547,5553 ----
        case 'd': return FALSE;     // "delete"
        case 'h': return TRUE;      // "hide"
      }
!     return (p_hid || (cmdmod.cmod_flags & CMOD_HIDE));
  }
  
  /*
*** ../vim-8.2.1897/src/bufwrite.c      2020-06-12 22:30:57.629228449 +0200
--- src/bufwrite.c      2020-10-24 20:06:32.610970527 +0200
***************
*** 883,889 ****
  #endif
                                       )
        {
!           if (buf != NULL && cmdmod.lockmarks)
            {
                // restore the original '[ and '] positions
                buf->b_op_start = orig_start;
--- 883,889 ----
  #endif
                                       )
        {
!           if (buf != NULL && (cmdmod.cmod_flags & CMOD_LOCKMARKS))
            {
                // restore the original '[ and '] positions
                buf->b_op_start = orig_start;
***************
*** 967,973 ****
            fname = buf->b_sfname;
      }
  
!     if (cmdmod.lockmarks)
      {
        // restore the original '[ and '] positions
        buf->b_op_start = orig_start;
--- 967,973 ----
            fname = buf->b_sfname;
      }
  
!     if (cmdmod.cmod_flags & CMOD_LOCKMARKS)
      {
        // restore the original '[ and '] positions
        buf->b_op_start = orig_start;
*** ../vim-8.2.1897/src/diff.c  2020-06-09 19:34:51.485836791 +0200
--- src/diff.c  2020-10-24 20:07:19.618798604 +0200
***************
*** 775,781 ****
  {
      int               r;
      char_u    *save_ff;
!     int               save_lockmarks;
  
      if (din->din_fname == NULL)
        return diff_write_buffer(buf, din);
--- 775,781 ----
  {
      int               r;
      char_u    *save_ff;
!     int               save_cmod_flags;
  
      if (din->din_fname == NULL)
        return diff_write_buffer(buf, din);
***************
*** 783,796 ****
      // Always use 'fileformat' set to "unix".
      save_ff = buf->b_p_ff;
      buf->b_p_ff = vim_strsave((char_u *)FF_UNIX);
!     save_lockmarks = cmdmod.lockmarks;
      // Writing the buffer is an implementation detail of performing the diff,
      // so it shouldn't update the '[ and '] marks.
!     cmdmod.lockmarks = TRUE;
      r = buf_write(buf, din->din_fname, NULL,
                        (linenr_T)1, buf->b_ml.ml_line_count,
                        NULL, FALSE, FALSE, FALSE, TRUE);
!     cmdmod.lockmarks = save_lockmarks;
      free_string_option(buf->b_p_ff);
      buf->b_p_ff = save_ff;
      return r;
--- 783,796 ----
      // Always use 'fileformat' set to "unix".
      save_ff = buf->b_p_ff;
      buf->b_p_ff = vim_strsave((char_u *)FF_UNIX);
!     save_cmod_flags = cmdmod.cmod_flags;
      // Writing the buffer is an implementation detail of performing the diff,
      // so it shouldn't update the '[ and '] marks.
!     cmdmod.cmod_flags |= CMOD_LOCKMARKS;
      r = buf_write(buf, din->din_fname, NULL,
                        (linenr_T)1, buf->b_ml.ml_line_count,
                        NULL, FALSE, FALSE, FALSE, TRUE);
!     cmdmod.cmod_flags = save_cmod_flags;
      free_string_option(buf->b_p_ff);
      buf->b_p_ff = save_ff;
      return r;
***************
*** 1187,1199 ****
  #endif
  #ifdef FEAT_BROWSE
      char_u    *browseFile = NULL;
!     int               browse_flag = cmdmod.browse;
  #endif
      stat_T    st;
      char_u    *esc_name = NULL;
  
  #ifdef FEAT_BROWSE
!     if (cmdmod.browse)
      {
        browseFile = do_browse(0, (char_u *)_("Patch file"),
                         eap->arg, NULL, NULL,
--- 1187,1199 ----
  #endif
  #ifdef FEAT_BROWSE
      char_u    *browseFile = NULL;
!     int               save_cmod_flags = cmdmod.cmod_flags;
  #endif
      stat_T    st;
      char_u    *esc_name = NULL;
  
  #ifdef FEAT_BROWSE
!     if (cmdmod.cmod_flags & CMOD_BROWSE)
      {
        browseFile = do_browse(0, (char_u *)_("Patch file"),
                         eap->arg, NULL, NULL,
***************
*** 1201,1207 ****
        if (browseFile == NULL)
            return;             // operation cancelled
        eap->arg = browseFile;
!       cmdmod.browse = FALSE;  // don't let do_ecmd() browse again
      }
  #endif
  
--- 1201,1207 ----
        if (browseFile == NULL)
            return;             // operation cancelled
        eap->arg = browseFile;
!       cmdmod.cmod_flags &= ~CMOD_BROWSE; // don't let do_ecmd() browse again
      }
  #endif
  
***************
*** 1310,1316 ****
        need_mouse_correct = TRUE;
  #endif
        // don't use a new tab page, each tab page has its own diffs
!       cmdmod.tab = 0;
  
        if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL)
        {
--- 1310,1316 ----
        need_mouse_correct = TRUE;
  #endif
        // don't use a new tab page, each tab page has its own diffs
!       cmdmod.cmod_tab = 0;
  
        if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL)
        {
***************
*** 1355,1361 ****
      vim_free(esc_name);
  #ifdef FEAT_BROWSE
      vim_free(browseFile);
!     cmdmod.browse = browse_flag;
  #endif
  }
  
--- 1355,1361 ----
      vim_free(esc_name);
  #ifdef FEAT_BROWSE
      vim_free(browseFile);
!     cmdmod.cmod_flags = save_cmod_flags;
  #endif
  }
  
***************
*** 1377,1383 ****
      set_fraction(curwin);
  
      // don't use a new tab page, each tab page has its own diffs
!     cmdmod.tab = 0;
  
      if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL)
      {
--- 1377,1383 ----
      set_fraction(curwin);
  
      // don't use a new tab page, each tab page has its own diffs
!     cmdmod.cmod_tab = 0;
  
      if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL)
      {
*** ../vim-8.2.1897/src/change.c        2020-09-15 21:34:14.998383526 +0200
--- src/change.c        2020-10-24 20:19:30.476330080 +0200
***************
*** 453,459 ****
  #endif
  
      // set the '. mark
!     if (!cmdmod.keepjumps)
      {
        curbuf->b_last_change.lnum = lnum;
        curbuf->b_last_change.col = col;
--- 453,459 ----
  #endif
  
      // set the '. mark
!     if ((cmdmod.cmod_flags & CMOD_KEEPJUMPS) == 0)
      {
        curbuf->b_last_change.lnum = lnum;
        curbuf->b_last_change.col = col;
*** ../vim-8.2.1897/src/cmdhist.c       2020-07-23 17:16:15.046100627 +0200
--- src/cmdhist.c       2020-10-24 20:13:48.725449038 +0200
***************
*** 304,310 ****
      if (hislen == 0)          // no history
        return;
  
!     if (cmdmod.keeppatterns && histype == HIST_SEARCH)
        return;
  
      // Searches inside the same mapping overwrite each other, so that only
--- 304,310 ----
      if (hislen == 0)          // no history
        return;
  
!     if ((cmdmod.cmod_flags & CMOD_KEEPPATTERNS) && histype == HIST_SEARCH)
        return;
  
      // Searches inside the same mapping overwrite each other, so that only
*** ../vim-8.2.1897/src/edit.c  2020-10-21 12:19:50.080854732 +0200
--- src/edit.c  2020-10-24 20:19:51.276263153 +0200
***************
*** 3616,3622 ****
        curwin->w_set_curswant = TRUE;
  
      // Remember the last Insert position in the '^ mark.
!     if (!cmdmod.keepjumps)
        curbuf->b_last_insert = curwin->w_cursor;
  
      /*
--- 3616,3622 ----
        curwin->w_set_curswant = TRUE;
  
      // Remember the last Insert position in the '^ mark.
!     if ((cmdmod.cmod_flags & CMOD_KEEPJUMPS) == 0)
        curbuf->b_last_insert = curwin->w_cursor;
  
      /*
*** ../vim-8.2.1897/src/ex_cmds.c       2020-10-13 19:08:20.267560498 +0200
--- src/ex_cmds.c       2020-10-24 20:14:04.097397745 +0200
***************
*** 744,750 ****
                foldMoveRange(&win->w_folds, line1, line2, dest);
        }
  #endif
!       if (!cmdmod.lockmarks)
        {
            curbuf->b_op_start.lnum = dest - num_lines + 1;
            curbuf->b_op_end.lnum = dest;
--- 744,750 ----
                foldMoveRange(&win->w_folds, line1, line2, dest);
        }
  #endif
!       if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
        {
            curbuf->b_op_start.lnum = dest - num_lines + 1;
            curbuf->b_op_end.lnum = dest;
***************
*** 759,771 ****
                foldMoveRange(&win->w_folds, dest + 1, line1 - 1, line2);
        }
  #endif
!       if (!cmdmod.lockmarks)
        {
            curbuf->b_op_start.lnum = dest + 1;
            curbuf->b_op_end.lnum = dest + num_lines;
        }
      }
!     if (!cmdmod.lockmarks)
        curbuf->b_op_start.col = curbuf->b_op_end.col = 0;
      mark_adjust_nofold(last_line - num_lines + 1, last_line,
                                             -(last_line - dest - extra), 0L);
--- 759,771 ----
                foldMoveRange(&win->w_folds, dest + 1, line1 - 1, line2);
        }
  #endif
!       if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
        {
            curbuf->b_op_start.lnum = dest + 1;
            curbuf->b_op_end.lnum = dest + num_lines;
        }
      }
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
        curbuf->b_op_start.col = curbuf->b_op_end.col = 0;
      mark_adjust_nofold(last_line - num_lines + 1, last_line,
                                             -(last_line - dest - extra), 0L);
***************
*** 815,821 ****
      char_u    *p;
  
      count = line2 - line1 + 1;
!     if (!cmdmod.lockmarks)
      {
        curbuf->b_op_start.lnum = n + 1;
        curbuf->b_op_end.lnum = n + count;
--- 815,821 ----
      char_u    *p;
  
      count = line2 - line1 + 1;
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        curbuf->b_op_start.lnum = n + 1;
        curbuf->b_op_end.lnum = n + count;
***************
*** 1062,1068 ****
      int               shell_flags = 0;
      pos_T     orig_start = curbuf->b_op_start;
      pos_T     orig_end = curbuf->b_op_end;
!     int               save_lockmarks = cmdmod.lockmarks;
  #ifdef FEAT_FILTERPIPE
      int               stmp = p_stmp;
  #endif
--- 1062,1068 ----
      int               shell_flags = 0;
      pos_T     orig_start = curbuf->b_op_start;
      pos_T     orig_end = curbuf->b_op_end;
!     int               save_cmod_flags = cmdmod.cmod_flags;
  #ifdef FEAT_FILTERPIPE
      int               stmp = p_stmp;
  #endif
***************
*** 1072,1078 ****
  
      // Temporarily disable lockmarks since that's needed to propagate changed
      // regions of the buffer for foldUpdate(), linecount, etc.
!     cmdmod.lockmarks = 0;
  
      cursor_save = curwin->w_cursor;
      linecount = line2 - line1 + 1;
--- 1072,1078 ----
  
      // Temporarily disable lockmarks since that's needed to propagate changed
      // regions of the buffer for foldUpdate(), linecount, etc.
!     cmdmod.cmod_flags &= ~CMOD_LOCKMARKS;
  
      cursor_save = curwin->w_cursor;
      linecount = line2 - line1 + 1;
***************
*** 1241,1247 ****
  
        if (do_in)
        {
!           if (cmdmod.keepmarks || vim_strchr(p_cpo, CPO_REMMARK) == NULL)
            {
                if (read_linecount >= linecount)
                    // move all marks from old lines to new lines
--- 1241,1248 ----
  
        if (do_in)
        {
!           if ((cmdmod.cmod_flags & CMOD_KEEPMARKS)
!                                    || vim_strchr(p_cpo, CPO_REMMARK) == NULL)
            {
                if (read_linecount >= linecount)
                    // move all marks from old lines to new lines
***************
*** 1307,1319 ****
  
  filterend:
  
!     cmdmod.lockmarks = save_lockmarks;
      if (curbuf != old_curbuf)
      {
        --no_wait_return;
        emsg(_("E135: *Filter* Autocommands must not change current buffer"));
      }
!     else if (cmdmod.lockmarks)
      {
        curbuf->b_op_start = orig_start;
        curbuf->b_op_end = orig_end;
--- 1308,1320 ----
  
  filterend:
  
!     cmdmod.cmod_flags = save_cmod_flags;
      if (curbuf != old_curbuf)
      {
        --no_wait_return;
        emsg(_("E135: *Filter* Autocommands must not change current buffer"));
      }
!     else if (cmdmod.cmod_flags & CMOD_LOCKMARKS)
      {
        curbuf->b_op_start = orig_start;
        curbuf->b_op_end = orig_end;
***************
*** 1769,1775 ****
      if (xfname != NULL && *xfname != NUL)
      {
        buf = buflist_new(fname, xfname, curwin->w_cursor.lnum, 0);
!       if (buf != NULL && !cmdmod.keepalt)
            curwin->w_alt_fnum = buf->b_fnum;
      }
      vim_free(fname);
--- 1770,1776 ----
      if (xfname != NULL && *xfname != NUL)
      {
        buf = buflist_new(fname, xfname, curwin->w_cursor.lnum, 0);
!       if (buf != NULL && (cmdmod.cmod_flags & CMOD_KEEPALT) == 0)
            curwin->w_alt_fnum = buf->b_fnum;
      }
      vim_free(fname);
***************
*** 1866,1872 ****
  
      ffname = eap->arg;
  #ifdef FEAT_BROWSE
!     if (cmdmod.browse && !exiting)
      {
        browse_file = do_browse(BROWSE_SAVE, (char_u *)_("Save As"), ffname,
                                                    NULL, NULL, NULL, curbuf);
--- 1867,1873 ----
  
      ffname = eap->arg;
  #ifdef FEAT_BROWSE
!     if ((cmdmod.cmod_flags & CMOD_BROWSE) && !exiting)
      {
        browse_file = do_browse(BROWSE_SAVE, (char_u *)_("Save As"), ffname,
                                                    NULL, NULL, NULL, curbuf);
***************
*** 1942,1948 ****
                && !p_wa)
        {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!           if (p_confirm || cmdmod.confirm)
            {
                if (vim_dialog_yesno(VIM_QUESTION, NULL,
                               (char_u *)_("Write partial file?"), 2) != 
VIM_YES)
--- 1943,1949 ----
                && !p_wa)
        {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!           if (p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM))
            {
                if (vim_dialog_yesno(VIM_QUESTION, NULL,
                               (char_u *)_("Write partial file?"), 2) != 
VIM_YES)
***************
*** 2091,2097 ****
            }
  #endif
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!           if (p_confirm || cmdmod.confirm)
            {
                char_u  buff[DIALOG_MSG_SIZE];
  
--- 2092,2098 ----
            }
  #endif
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!           if (p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM))
            {
                char_u  buff[DIALOG_MSG_SIZE];
  
***************
*** 2142,2148 ****
            if (r)
            {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!               if (p_confirm || cmdmod.confirm)
                {
                    char_u      buff[DIALOG_MSG_SIZE];
  
--- 2143,2149 ----
            if (r)
            {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!               if (p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM))
                {
                    char_u      buff[DIALOG_MSG_SIZE];
  
***************
*** 2229,2240 ****
            }
  #ifdef FEAT_BROWSE
            // ":browse wall": ask for file name if there isn't one
!           if (buf->b_ffname == NULL && cmdmod.browse)
                browse_save_fname(buf);
  #endif
            if (buf->b_ffname == NULL)
            {
!               semsg(_("E141: No file name for buffer %ld"), 
(long)buf->b_fnum);
                ++error;
            }
            else if (check_readonly(&eap->forceit, buf)
--- 2230,2242 ----
            }
  #ifdef FEAT_BROWSE
            // ":browse wall": ask for file name if there isn't one
!           if (buf->b_ffname == NULL && (cmdmod.cmod_flags & CMOD_BROWSE))
                browse_save_fname(buf);
  #endif
            if (buf->b_ffname == NULL)
            {
!               semsg(_("E141: No file name for buffer %ld"),
!                                                           (long)buf->b_fnum);
                ++error;
            }
            else if (check_readonly(&eap->forceit, buf)
***************
*** 2297,2303 ****
                    && check_file_readonly(buf->b_ffname, 0777))))
      {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!       if ((p_confirm || cmdmod.confirm) && buf->b_fname != NULL)
        {
            char_u      buff[DIALOG_MSG_SIZE];
  
--- 2299,2306 ----
                    && check_file_readonly(buf->b_ffname, 0777))))
      {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!       if ((p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM))
!                                                      && buf->b_fname != NULL)
        {
            char_u      buff[DIALOG_MSG_SIZE];
  
***************
*** 2501,2507 ****
      else
      {
  #ifdef FEAT_BROWSE
!       if (cmdmod.browse && !exiting)
        {
            if (
  # ifdef FEAT_GUI
--- 2504,2510 ----
      else
      {
  #ifdef FEAT_BROWSE
!       if ((cmdmod.cmod_flags & CMOD_BROWSE) && !exiting)
        {
            if (
  # ifdef FEAT_GUI
***************
*** 2612,2618 ****
      {
        if (!(flags & ECMD_ADDBUF))
        {
!           if (!cmdmod.keepalt)
                curwin->w_alt_fnum = curbuf->b_fnum;
            if (oldwin != NULL)
                buflist_altfpos(oldwin);
--- 2615,2621 ----
      {
        if (!(flags & ECMD_ADDBUF))
        {
!           if ((cmdmod.cmod_flags & CMOD_KEEPALT) == 0)
                curwin->w_alt_fnum = curbuf->b_fnum;
            if (oldwin != NULL)
                buflist_altfpos(oldwin);
***************
*** 3299,3312 ****
      // eap->line2 pointed to the end of the buffer and nothing was appended)
      // "end" is set to lnum when something has been appended, otherwise
      // it is the same than "start"  -- Acevedo
!     if (!cmdmod.lockmarks)
      {
        curbuf->b_op_start.lnum = (eap->line2 < curbuf->b_ml.ml_line_count) ?
            eap->line2 + 1 : curbuf->b_ml.ml_line_count;
        if (eap->cmdidx != CMD_append)
            --curbuf->b_op_start.lnum;
        curbuf->b_op_end.lnum = (eap->line2 < lnum)
!                                                ? lnum : 
curbuf->b_op_start.lnum;
        curbuf->b_op_start.col = curbuf->b_op_end.col = 0;
      }
      curwin->w_cursor.lnum = lnum;
--- 3302,3315 ----
      // eap->line2 pointed to the end of the buffer and nothing was appended)
      // "end" is set to lnum when something has been appended, otherwise
      // it is the same than "start"  -- Acevedo
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        curbuf->b_op_start.lnum = (eap->line2 < curbuf->b_ml.ml_line_count) ?
            eap->line2 + 1 : curbuf->b_ml.ml_line_count;
        if (eap->cmdidx != CMD_append)
            --curbuf->b_op_start.lnum;
        curbuf->b_op_end.lnum = (eap->line2 < lnum)
!                                             ? lnum : curbuf->b_op_start.lnum;
        curbuf->b_op_start.col = curbuf->b_op_end.col = 0;
      }
      curwin->w_cursor.lnum = lnum;
***************
*** 3729,3735 ****
            ex_may_print(eap);
        }
  
!       if (!cmdmod.keeppatterns)
            save_re_pat(RE_SUBST, pat, p_magic);
        // put pattern in history
        add_to_history(HIST_SEARCH, pat, TRUE, NUL);
--- 3732,3738 ----
            ex_may_print(eap);
        }
  
!       if ((cmdmod.cmod_flags & CMOD_KEEPPATTERNS) == 0)
            save_re_pat(RE_SUBST, pat, p_magic);
        // put pattern in history
        add_to_history(HIST_SEARCH, pat, TRUE, NUL);
***************
*** 4619,4625 ****
  
      if (sub_nsubs > start_nsubs)
      {
!       if (!cmdmod.lockmarks)
        {
            // Set the '[ and '] marks.
            curbuf->b_op_start.lnum = eap->line1;
--- 4622,4628 ----
  
      if (sub_nsubs > start_nsubs)
      {
!       if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
        {
            // Set the '[ and '] marks.
            curbuf->b_op_start.lnum = eap->line1;
***************
*** 5108,5114 ****
      if (ARGCOUNT == 0)
        return;
  
!     if (cmdmod.tab)
      {
        // ":tab drop file ...": open a tab for each argument that isn't
        // edited in a window yet.  It's like ":tab all" but without closing
--- 5111,5117 ----
      if (ARGCOUNT == 0)
        return;
  
!     if (cmdmod.cmod_tab)
      {
        // ":tab drop file ...": open a tab for each argument that isn't
        // edited in a window yet.  It's like ":tab all" but without closing
***************
*** 5247,5253 ****
        got_int = FALSE;
  
  # ifdef FEAT_BROWSE_CMD
!       if (cmdmod.browse)
        {
            quit_more = FALSE;
            nr = prompt_for_number(FALSE);
--- 5250,5256 ----
        got_int = FALSE;
  
  # ifdef FEAT_BROWSE_CMD
!       if (cmdmod.cmod_flags & CMOD_BROWSE)
        {
            quit_more = FALSE;
            nr = prompt_for_number(FALSE);
***************
*** 5262,5268 ****
                    p = expand_env_save(p);
                    eap->arg = p;
                    eap->cmdidx = CMD_edit;
!                   cmdmod.browse = FALSE;
                    do_exedit(eap, NULL);
                    vim_free(p);
                }
--- 5265,5271 ----
                    p = expand_env_save(p);
                    eap->arg = p;
                    eap->cmdidx = CMD_edit;
!                   cmdmod.cmod_flags &= ~CMOD_BROWSE;
                    do_exedit(eap, NULL);
                    vim_free(p);
                }
*** ../vim-8.2.1897/src/ex_cmds2.c      2020-07-22 19:10:59.877072059 +0200
--- src/ex_cmds2.c      2020-10-24 19:40:10.356745236 +0200
***************
*** 86,92 ****
            && (!(flags & CCGD_AW) || autowrite(buf, forceit) == FAIL))
      {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!       if ((p_confirm || cmdmod.confirm) && p_write)
        {
            buf_T       *buf2;
            int         count = 0;
--- 86,92 ----
            && (!(flags & CCGD_AW) || autowrite(buf, forceit) == FAIL))
      {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!       if ((p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM)) && p_write)
        {
            buf_T       *buf2;
            int         count = 0;
***************
*** 96,102 ****
                    if (bufIsChanged(buf2)
                                     && (buf2->b_ffname != NULL
  # ifdef FEAT_BROWSE
!                                        || cmdmod.browse
  # endif
                                        ))
                        ++count;
--- 96,102 ----
                    if (bufIsChanged(buf2)
                                     && (buf2->b_ffname != NULL
  # ifdef FEAT_BROWSE
!                                        || (cmdmod.cmod_flags & CMOD_BROWSE)
  # endif
                                        ))
                        ++count;
***************
*** 197,203 ****
            if (bufIsChanged(buf2)
                    && (buf2->b_ffname != NULL
  #ifdef FEAT_BROWSE
!                       || cmdmod.browse
  #endif
                        )
                    && !buf2->b_p_ro)
--- 197,203 ----
            if (bufIsChanged(buf2)
                    && (buf2->b_ffname != NULL
  #ifdef FEAT_BROWSE
!                       || (cmdmod.cmod_flags & CMOD_BROWSE)
  #endif
                        )
                    && !buf2->b_p_ro)
***************
*** 347,353 ****
      /*
       * When ":confirm" used, don't give an error message.
       */
!     if (!(p_confirm || cmdmod.confirm))
  #endif
      {
        // There must be a wait_return for this message, do_buffer()
--- 347,353 ----
      /*
       * When ":confirm" used, don't give an error message.
       */
!     if (!(p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM)))
  #endif
      {
        // There must be a wait_return for this message, do_buffer()
*** ../vim-8.2.1897/src/ex_docmd.c      2020-10-24 17:19:12.135743402 +0200
--- src/ex_docmd.c      2020-10-24 20:20:04.996219077 +0200
***************
*** 1711,1717 ****
      char      *errormsg = NULL;       // error message
      char_u    *after_modifier = NULL;
      exarg_T   ea;                     // Ex command arguments
-     int               save_msg_scroll = msg_scroll;
      cmdmod_T  save_cmdmod;
      int               save_reg_executing = reg_executing;
      int               ni;                     // set when Not Implemented
--- 1711,1716 ----
***************
*** 1762,1768 ****
      ea.cstack = cstack;
      starts_with_colon = *skipwhite(ea.cmd) == ':';
  #endif
!     if (parse_command_modifiers(&ea, &errormsg, FALSE) == FAIL)
        goto doend;
      apply_cmdmod(&cmdmod);
  
--- 1761,1767 ----
      ea.cstack = cstack;
      starts_with_colon = *skipwhite(ea.cmd) == ':';
  #endif
!     if (parse_command_modifiers(&ea, &errormsg, &cmdmod, FALSE) == FAIL)
        goto doend;
      apply_cmdmod(&cmdmod);
  
***************
*** 2598,2604 ****
                        ? cmdnames[(int)ea.cmdidx].cmd_name : (char_u *)NULL);
  #endif
  
!     undo_cmdmod(save_msg_scroll);
      cmdmod = save_cmdmod;
      reg_executing = save_reg_executing;
  
--- 2597,2603 ----
                        ? cmdnames[(int)ea.cmdidx].cmd_name : (char_u *)NULL);
  #endif
  
!     undo_cmdmod(&cmdmod);
      cmdmod = save_cmdmod;
      reg_executing = save_reg_executing;
  
***************
*** 2633,2657 ****
  /*
   * Parse and skip over command modifiers:
   * - update eap->cmd
!  * - store flags in "cmdmod".
   * - Set ex_pressedreturn for an empty command line.
-  * - set msg_silent for ":silent"
-  * - set 'eventignore' to "all" for ":noautocmd"
   * When "skip_only" is TRUE the global variables are not changed, except for
   * "cmdmod".
   * Call apply_cmdmod() to get the side effects of the modifiers:
   * - Increment "sandbox" for ":sandbox"
   * - set p_verbose for ":verbose"
   * Return FAIL when the command is not to be executed.
   * May set "errormsg" to an error message.
   */
      int
! parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only)
  {
      char_u  *p;
      int           starts_with_colon = FALSE;
  
!     CLEAR_FIELD(cmdmod);
  
      // Repeat until no more command modifiers are found.
      for (;;)
--- 2632,2662 ----
  /*
   * Parse and skip over command modifiers:
   * - update eap->cmd
!  * - store flags in "cmod".
   * - Set ex_pressedreturn for an empty command line.
   * When "skip_only" is TRUE the global variables are not changed, except for
   * "cmdmod".
+  * When "skip_only" is FALSE then undo_cmdmod() must be called later to free
+  * any cmod_filter_regmatch.regprog.
   * Call apply_cmdmod() to get the side effects of the modifiers:
   * - Increment "sandbox" for ":sandbox"
   * - set p_verbose for ":verbose"
+  * - set msg_silent for ":silent"
+  * - set 'eventignore' to "all" for ":noautocmd"
   * Return FAIL when the command is not to be executed.
   * May set "errormsg" to an error message.
   */
      int
! parse_command_modifiers(
!       exarg_T     *eap,
!       char        **errormsg,
!       cmdmod_T    *cmod,
!       int         skip_only)
  {
      char_u  *p;
      int           starts_with_colon = FALSE;
  
!     CLEAR_POINTER(cmod);
  
      // Repeat until no more command modifiers are found.
      for (;;)
***************
*** 2690,2740 ****
            // When adding an entry, also modify cmd_exists().
            case 'a':   if (!checkforcmd(&eap->cmd, "aboveleft", 3))
                            break;
!                       cmdmod.split |= WSP_ABOVE;
                        continue;
  
            case 'b':   if (checkforcmd(&eap->cmd, "belowright", 3))
                        {
!                           cmdmod.split |= WSP_BELOW;
                            continue;
                        }
                        if (checkforcmd(&eap->cmd, "browse", 3))
                        {
  #ifdef FEAT_BROWSE_CMD
!                           cmdmod.browse = TRUE;
  #endif
                            continue;
                        }
                        if (!checkforcmd(&eap->cmd, "botright", 2))
                            break;
!                       cmdmod.split |= WSP_BOT;
                        continue;
  
            case 'c':   if (!checkforcmd(&eap->cmd, "confirm", 4))
                            break;
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!                       cmdmod.confirm = TRUE;
  #endif
                        continue;
  
            case 'k':   if (checkforcmd(&eap->cmd, "keepmarks", 3))
                        {
!                           cmdmod.keepmarks = TRUE;
                            continue;
                        }
                        if (checkforcmd(&eap->cmd, "keepalt", 5))
                        {
!                           cmdmod.keepalt = TRUE;
                            continue;
                        }
                        if (checkforcmd(&eap->cmd, "keeppatterns", 5))
                        {
!                           cmdmod.keeppatterns = TRUE;
                            continue;
                        }
                        if (!checkforcmd(&eap->cmd, "keepjumps", 5))
                            break;
!                       cmdmod.keepjumps = TRUE;
                        continue;
  
            case 'f':   // only accept ":filter {pat} cmd"
--- 2695,2745 ----
            // When adding an entry, also modify cmd_exists().
            case 'a':   if (!checkforcmd(&eap->cmd, "aboveleft", 3))
                            break;
!                       cmod->cmod_split |= WSP_ABOVE;
                        continue;
  
            case 'b':   if (checkforcmd(&eap->cmd, "belowright", 3))
                        {
!                           cmod->cmod_split |= WSP_BELOW;
                            continue;
                        }
                        if (checkforcmd(&eap->cmd, "browse", 3))
                        {
  #ifdef FEAT_BROWSE_CMD
!                           cmod->cmod_flags |= CMOD_BROWSE;
  #endif
                            continue;
                        }
                        if (!checkforcmd(&eap->cmd, "botright", 2))
                            break;
!                       cmod->cmod_split |= WSP_BOT;
                        continue;
  
            case 'c':   if (!checkforcmd(&eap->cmd, "confirm", 4))
                            break;
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!                       cmod->cmod_flags |= CMOD_CONFIRM;
  #endif
                        continue;
  
            case 'k':   if (checkforcmd(&eap->cmd, "keepmarks", 3))
                        {
!                           cmod->cmod_flags |= CMOD_KEEPMARKS;
                            continue;
                        }
                        if (checkforcmd(&eap->cmd, "keepalt", 5))
                        {
!                           cmod->cmod_flags |= CMOD_KEEPALT;
                            continue;
                        }
                        if (checkforcmd(&eap->cmd, "keeppatterns", 5))
                        {
!                           cmod->cmod_flags |= CMOD_KEEPPATTERNS;
                            continue;
                        }
                        if (!checkforcmd(&eap->cmd, "keepjumps", 5))
                            break;
!                       cmod->cmod_flags |= CMOD_KEEPJUMPS;
                        continue;
  
            case 'f':   // only accept ":filter {pat} cmd"
***************
*** 2746,2752 ****
                                break;
                            if (*p == '!')
                            {
!                               cmdmod.filter_force = TRUE;
                                p = skipwhite(p + 1);
                                if (*p == NUL || ends_excmd(*p))
                                    break;
--- 2751,2757 ----
                                break;
                            if (*p == '!')
                            {
!                               cmod->cmod_filter_force = TRUE;
                                p = skipwhite(p + 1);
                                if (*p == NUL || ends_excmd(*p))
                                    break;
***************
*** 2765,2773 ****
                                break;
                            if (!skip_only)
                            {
!                               cmdmod.filter_regmatch.regprog =
                                                vim_regcomp(reg_pat, RE_MAGIC);
!                               if (cmdmod.filter_regmatch.regprog == NULL)
                                    break;
                            }
                            eap->cmd = p;
--- 2770,2778 ----
                                break;
                            if (!skip_only)
                            {
!                               cmod->cmod_filter_regmatch.regprog =
                                                vim_regcomp(reg_pat, RE_MAGIC);
!                               if (cmod->cmod_filter_regmatch.regprog == NULL)
                                    break;
                            }
                            eap->cmd = p;
***************
*** 2779,2826 ****
                                               || *p == NUL || ends_excmd(*p))
                            break;
                        eap->cmd = p;
!                       cmdmod.hide = TRUE;
                        continue;
  
            case 'l':   if (checkforcmd(&eap->cmd, "lockmarks", 3))
                        {
!                           cmdmod.lockmarks = TRUE;
                            continue;
                        }
  
                        if (!checkforcmd(&eap->cmd, "leftabove", 5))
                            break;
!                       cmdmod.split |= WSP_ABOVE;
                        continue;
  
            case 'n':   if (checkforcmd(&eap->cmd, "noautocmd", 3))
                        {
!                           cmdmod.cmod_flags |= CMOD_NOAUTOCMD;
                            continue;
                        }
                        if (!checkforcmd(&eap->cmd, "noswapfile", 3))
                            break;
!                       cmdmod.noswapfile = TRUE;
                        continue;
  
            case 'r':   if (!checkforcmd(&eap->cmd, "rightbelow", 6))
                            break;
!                       cmdmod.split |= WSP_BELOW;
                        continue;
  
            case 's':   if (checkforcmd(&eap->cmd, "sandbox", 3))
                        {
!                           cmdmod.cmod_flags |= CMOD_SANDBOX;
                            continue;
                        }
                        if (!checkforcmd(&eap->cmd, "silent", 3))
                            break;
!                       cmdmod.cmod_flags |= CMOD_SILENT;
                        if (*eap->cmd == '!' && !VIM_ISWHITE(eap->cmd[-1]))
                        {
                            // ":silent!", but not "silent !cmd"
                            eap->cmd = skipwhite(eap->cmd + 1);
!                           cmdmod.cmod_flags |= CMOD_ERRSILENT;
                        }
                        continue;
  
--- 2784,2831 ----
                                               || *p == NUL || ends_excmd(*p))
                            break;
                        eap->cmd = p;
!                       cmod->cmod_flags |= CMOD_HIDE;
                        continue;
  
            case 'l':   if (checkforcmd(&eap->cmd, "lockmarks", 3))
                        {
!                           cmod->cmod_flags |= CMOD_LOCKMARKS;
                            continue;
                        }
  
                        if (!checkforcmd(&eap->cmd, "leftabove", 5))
                            break;
!                       cmod->cmod_split |= WSP_ABOVE;
                        continue;
  
            case 'n':   if (checkforcmd(&eap->cmd, "noautocmd", 3))
                        {
!                           cmod->cmod_flags |= CMOD_NOAUTOCMD;
                            continue;
                        }
                        if (!checkforcmd(&eap->cmd, "noswapfile", 3))
                            break;
!                       cmod->cmod_flags |= CMOD_NOSWAPFILE;
                        continue;
  
            case 'r':   if (!checkforcmd(&eap->cmd, "rightbelow", 6))
                            break;
!                       cmod->cmod_split |= WSP_BELOW;
                        continue;
  
            case 's':   if (checkforcmd(&eap->cmd, "sandbox", 3))
                        {
!                           cmod->cmod_flags |= CMOD_SANDBOX;
                            continue;
                        }
                        if (!checkforcmd(&eap->cmd, "silent", 3))
                            break;
!                       cmod->cmod_flags |= CMOD_SILENT;
                        if (*eap->cmd == '!' && !VIM_ISWHITE(eap->cmd[-1]))
                        {
                            // ":silent!", but not "silent !cmd"
                            eap->cmd = skipwhite(eap->cmd + 1);
!                           cmod->cmod_flags |= CMOD_ERRSILENT;
                        }
                        continue;
  
***************
*** 2832,2838 ****
                                                    ADDR_TABS, eap->skip,
                                                    skip_only, FALSE, 1);
                                if (tabnr == MAXLNUM)
!                                   cmdmod.tab = tabpage_index(curtab) + 1;
                                else
                                {
                                    if (tabnr < 0 || tabnr > LAST_TAB_NR)
--- 2837,2843 ----
                                                    ADDR_TABS, eap->skip,
                                                    skip_only, FALSE, 1);
                                if (tabnr == MAXLNUM)
!                                   cmod->cmod_tab = tabpage_index(curtab) + 1;
                                else
                                {
                                    if (tabnr < 0 || tabnr > LAST_TAB_NR)
***************
*** 2840,2846 ****
                                        *errormsg = _(e_invrange);
                                        return FAIL;
                                    }
!                                   cmdmod.tab = tabnr + 1;
                                }
                            }
                            eap->cmd = p;
--- 2845,2851 ----
                                        *errormsg = _(e_invrange);
                                        return FAIL;
                                    }
!                                   cmod->cmod_tab = tabnr + 1;
                                }
                            }
                            eap->cmd = p;
***************
*** 2848,2872 ****
                        }
                        if (!checkforcmd(&eap->cmd, "topleft", 2))
                            break;
!                       cmdmod.split |= WSP_TOP;
                        continue;
  
            case 'u':   if (!checkforcmd(&eap->cmd, "unsilent", 3))
                            break;
!                       cmdmod.cmod_flags |= CMOD_UNSILENT;
                        continue;
  
            case 'v':   if (checkforcmd(&eap->cmd, "vertical", 4))
                        {
!                           cmdmod.split |= WSP_VERT;
                            continue;
                        }
                        if (!checkforcmd(&p, "verbose", 4))
                            break;
                        if (vim_isdigit(*eap->cmd))
!                           cmdmod.cmod_verbose = atoi((char *)eap->cmd);
                        else
!                           cmdmod.cmod_verbose = 1;
                        eap->cmd = p;
                        continue;
        }
--- 2853,2877 ----
                        }
                        if (!checkforcmd(&eap->cmd, "topleft", 2))
                            break;
!                       cmod->cmod_split |= WSP_TOP;
                        continue;
  
            case 'u':   if (!checkforcmd(&eap->cmd, "unsilent", 3))
                            break;
!                       cmod->cmod_flags |= CMOD_UNSILENT;
                        continue;
  
            case 'v':   if (checkforcmd(&eap->cmd, "vertical", 4))
                        {
!                           cmod->cmod_split |= WSP_VERT;
                            continue;
                        }
                        if (!checkforcmd(&p, "verbose", 4))
                            break;
                        if (vim_isdigit(*eap->cmd))
!                           cmod->cmod_verbose = atoi((char *)eap->cmd);
                        else
!                           cmod->cmod_verbose = 1;
                        eap->cmd = p;
                        continue;
        }
***************
*** 2899,2905 ****
--- 2904,2913 ----
  
      if ((cmod->cmod_flags & (CMOD_SILENT | CMOD_UNSILENT))
            && cmod->cmod_save_msg_silent == 0)
+     {
        cmod->cmod_save_msg_silent = msg_silent + 1;
+       cmod->cmod_save_msg_scroll = msg_scroll;
+     }
      if (cmod->cmod_flags & CMOD_SILENT)
        ++msg_silent;
      if (cmod->cmod_flags & CMOD_UNSILENT)
***************
*** 2911,2978 ****
        ++cmod->cmod_did_esilent;
      }
  
!     if ((cmod->cmod_flags & CMOD_NOAUTOCMD) && cmdmod.cmod_save_ei == NULL)
      {
        // Set 'eventignore' to "all".
        // First save the existing option value for restoring it later.
!       cmdmod.cmod_save_ei = vim_strsave(p_ei);
        set_string_option_direct((char_u *)"ei", -1,
                                          (char_u *)"all", OPT_FREE, SID_NONE);
      }
  }
  
  /*
!  * Undo and free contents of "cmdmod".
   */
      void
! undo_cmdmod(int save_msg_scroll)
  {
!     if (cmdmod.cmod_verbose_save > 0)
      {
!       p_verbose = cmdmod.cmod_verbose_save - 1;
!       cmdmod.cmod_verbose_save = 0;
      }
  
  #ifdef HAVE_SANDBOX
!     if (cmdmod.cmod_did_sandbox)
      {
        --sandbox;
!       cmdmod.cmod_did_sandbox = FALSE;
      }
  #endif
  
!     if (cmdmod.cmod_save_ei != NULL)
      {
        // Restore 'eventignore' to the value before ":noautocmd".
!       set_string_option_direct((char_u *)"ei", -1, cmdmod.cmod_save_ei,
!                                                         OPT_FREE, SID_NONE);
!       free_string_option(cmdmod.cmod_save_ei);
!       cmdmod.cmod_save_ei = NULL;
      }
  
!     if (cmdmod.filter_regmatch.regprog != NULL)
!       vim_regfree(cmdmod.filter_regmatch.regprog);
  
!     if (cmdmod.cmod_save_msg_silent > 0)
      {
        // messages could be enabled for a serious error, need to check if the
        // counters don't become negative
!       if (!did_emsg || msg_silent > cmdmod.cmod_save_msg_silent - 1)
!           msg_silent = cmdmod.cmod_save_msg_silent - 1;
!       emsg_silent -= cmdmod.cmod_did_esilent;
        if (emsg_silent < 0)
            emsg_silent = 0;
        // Restore msg_scroll, it's set by file I/O commands, even when no
        // message is actually displayed.
!       msg_scroll = save_msg_scroll;
  
        // "silent reg" or "silent echo x" inside "redir" leaves msg_col
        // somewhere in the line.  Put it back in the first column.
        if (redirecting())
            msg_col = 0;
  
!       cmdmod.cmod_save_msg_silent = 0;
!       cmdmod.cmod_did_esilent = 0;
      }
  }
  
--- 2919,2986 ----
        ++cmod->cmod_did_esilent;
      }
  
!     if ((cmod->cmod_flags & CMOD_NOAUTOCMD) && cmod->cmod_save_ei == NULL)
      {
        // Set 'eventignore' to "all".
        // First save the existing option value for restoring it later.
!       cmod->cmod_save_ei = vim_strsave(p_ei);
        set_string_option_direct((char_u *)"ei", -1,
                                          (char_u *)"all", OPT_FREE, SID_NONE);
      }
  }
  
  /*
!  * Undo and free contents of "cmod".
   */
      void
! undo_cmdmod(cmdmod_T *cmod)
  {
!     if (cmod->cmod_verbose_save > 0)
      {
!       p_verbose = cmod->cmod_verbose_save - 1;
!       cmod->cmod_verbose_save = 0;
      }
  
  #ifdef HAVE_SANDBOX
!     if (cmod->cmod_did_sandbox)
      {
        --sandbox;
!       cmod->cmod_did_sandbox = FALSE;
      }
  #endif
  
!     if (cmod->cmod_save_ei != NULL)
      {
        // Restore 'eventignore' to the value before ":noautocmd".
!       set_string_option_direct((char_u *)"ei", -1, cmod->cmod_save_ei,
!                                                          OPT_FREE, SID_NONE);
!       free_string_option(cmod->cmod_save_ei);
!       cmod->cmod_save_ei = NULL;
      }
  
!     if (cmod->cmod_filter_regmatch.regprog != NULL)
!       vim_regfree(cmod->cmod_filter_regmatch.regprog);
  
!     if (cmod->cmod_save_msg_silent > 0)
      {
        // messages could be enabled for a serious error, need to check if the
        // counters don't become negative
!       if (!did_emsg || msg_silent > cmod->cmod_save_msg_silent - 1)
!           msg_silent = cmod->cmod_save_msg_silent - 1;
!       emsg_silent -= cmod->cmod_did_esilent;
        if (emsg_silent < 0)
            emsg_silent = 0;
        // Restore msg_scroll, it's set by file I/O commands, even when no
        // message is actually displayed.
!       msg_scroll = cmod->cmod_save_msg_scroll;
  
        // "silent reg" or "silent echo x" inside "redir" leaves msg_col
        // somewhere in the line.  Put it back in the first column.
        if (redirecting())
            msg_col = 0;
  
!       cmod->cmod_save_msg_silent = 0;
!       cmod->cmod_did_esilent = 0;
      }
  }
  
***************
*** 5130,5136 ****
        if (message)
        {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!           if ((p_confirm || cmdmod.confirm) && curbuf->b_fname != NULL)
            {
                char_u  buff[DIALOG_MSG_SIZE];
  
--- 5138,5145 ----
        if (message)
        {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!           if ((p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM))
!                                                   && curbuf->b_fname != NULL)
            {
                char_u  buff[DIALOG_MSG_SIZE];
  
***************
*** 5450,5456 ****
      if (need_hide && !buf_hide(buf) && !forceit)
      {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!       if ((p_confirm || cmdmod.confirm) && p_write)
        {
            bufref_T bufref;
  
--- 5459,5465 ----
      if (need_hide && !buf_hide(buf) && !forceit)
      {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!       if ((p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM)) && p_write)
        {
            bufref_T bufref;
  
***************
*** 6106,6112 ****
  #endif
  #ifdef FEAT_BROWSE
      char_u    dot_path[] = ".";
!     int               browse_flag = cmdmod.browse;
  #endif
      int               use_tab = eap->cmdidx == CMD_tabedit
                       || eap->cmdidx == CMD_tabfind
--- 6115,6121 ----
  #endif
  #ifdef FEAT_BROWSE
      char_u    dot_path[] = ".";
!     int               save_cmod_flags = cmdmod.cmod_flags;
  #endif
      int               use_tab = eap->cmdidx == CMD_tabedit
                       || eap->cmdidx == CMD_tabfind
***************
*** 6122,6128 ****
  #ifdef FEAT_QUICKFIX
      // A ":split" in the quickfix window works like ":new".  Don't want two
      // quickfix windows.  But it's OK when doing ":tab split".
!     if (bt_quickfix(curbuf) && cmdmod.tab == 0)
      {
        if (eap->cmdidx == CMD_split)
            eap->cmdidx = CMD_new;
--- 6131,6137 ----
  #ifdef FEAT_QUICKFIX
      // A ":split" in the quickfix window works like ":new".  Don't want two
      // quickfix windows.  But it's OK when doing ":tab split".
!     if (bt_quickfix(curbuf) && cmdmod.cmod_tab == 0)
      {
        if (eap->cmdidx == CMD_split)
            eap->cmdidx = CMD_new;
***************
*** 6145,6151 ****
  # endif
  #endif
  #ifdef FEAT_BROWSE
!     if (cmdmod.browse
            && eap->cmdidx != CMD_vnew
            && eap->cmdidx != CMD_new)
      {
--- 6154,6160 ----
  # endif
  #endif
  #ifdef FEAT_BROWSE
!     if ((cmdmod.cmod_flags & CMOD_BROWSE)
            && eap->cmdidx != CMD_vnew
            && eap->cmdidx != CMD_new)
      {
***************
*** 6171,6177 ****
            eap->arg = fname;
        }
      }
!     cmdmod.browse = FALSE;    // Don't browse again in do_ecmd().
  #endif
  
      /*
--- 6180,6186 ----
            eap->arg = fname;
        }
      }
!     cmdmod.cmod_flags &= ~CMOD_BROWSE;        // Don't browse again in 
do_ecmd().
  #endif
  
      /*
***************
*** 6179,6185 ****
       */
      if (use_tab)
      {
!       if (win_new_tabpage(cmdmod.tab != 0 ? cmdmod.tab
                         : eap->addr_count == 0 ? 0
                                               : (int)eap->line2 + 1) != FAIL)
        {
--- 6188,6194 ----
       */
      if (use_tab)
      {
!       if (win_new_tabpage(cmdmod.cmod_tab != 0 ? cmdmod.cmod_tab
                         : eap->addr_count == 0 ? 0
                                               : (int)eap->line2 + 1) != FAIL)
        {
***************
*** 6189,6195 ****
            if (curwin != old_curwin
                    && win_valid(old_curwin)
                    && old_curwin->w_buffer != curbuf
!                   && !cmdmod.keepalt)
                old_curwin->w_alt_fnum = curbuf->b_fnum;
        }
      }
--- 6198,6204 ----
            if (curwin != old_curwin
                    && win_valid(old_curwin)
                    && old_curwin->w_buffer != curbuf
!                   && (cmdmod.cmod_flags & CMOD_KEEPALT) == 0)
                old_curwin->w_alt_fnum = curbuf->b_fnum;
        }
      }
***************
*** 6198,6208 ****
      {
        // Reset 'scrollbind' when editing another file, but keep it when
        // doing ":split" without arguments.
!       if (*eap->arg != NUL
! # ifdef FEAT_BROWSE
!               || cmdmod.browse
! # endif
!          )
            RESET_BINDING(curwin);
        else
            do_check_scrollbind(FALSE);
--- 6207,6213 ----
      {
        // Reset 'scrollbind' when editing another file, but keep it when
        // doing ":split" without arguments.
!       if (*eap->arg != NUL)
            RESET_BINDING(curwin);
        else
            do_check_scrollbind(FALSE);
***************
*** 6210,6216 ****
      }
  
  # ifdef FEAT_BROWSE
!     cmdmod.browse = browse_flag;
  # endif
  
  # if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
--- 6215,6221 ----
      }
  
  # ifdef FEAT_BROWSE
!     cmdmod.cmod_flags = save_cmod_flags;
  # endif
  
  # if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
***************
*** 6383,6389 ****
      need_mouse_correct = TRUE;
  # endif
      n = atol((char *)eap->arg);
!     if (cmdmod.split & WSP_VERT)
      {
        if (*eap->arg == '-' || *eap->arg == '+')
            n += wp->w_width;
--- 6388,6394 ----
      need_mouse_correct = TRUE;
  # endif
      n = atol((char *)eap->arg);
!     if (cmdmod.cmod_split & WSP_VERT)
      {
        if (*eap->arg == '-' || *eap->arg == '+')
            n += wp->w_width;
***************
*** 6564,6570 ****
      else if ((eap->cmdidx != CMD_split && eap->cmdidx != CMD_vsplit)
            || *eap->arg != NUL
  #ifdef FEAT_BROWSE
!           || cmdmod.browse
  #endif
            )
      {
--- 6569,6575 ----
      else if ((eap->cmdidx != CMD_split && eap->cmdidx != CMD_vsplit)
            || *eap->arg != NUL
  #ifdef FEAT_BROWSE
!           || (cmdmod.cmod_flags & CMOD_BROWSE)
  #endif
            )
      {
***************
*** 6653,6659 ****
            && curwin != old_curwin
            && win_valid(old_curwin)
            && old_curwin->w_buffer != curbuf
!           && !cmdmod.keepalt)
        old_curwin->w_alt_fnum = curbuf->b_fnum;
  
      ex_no_reprint = TRUE;
--- 6658,6664 ----
            && curwin != old_curwin
            && win_valid(old_curwin)
            && old_curwin->w_buffer != curbuf
!           && (cmdmod.cmod_flags & CMOD_KEEPALT) == 0)
        old_curwin->w_alt_fnum = curbuf->b_fnum;
  
      ex_no_reprint = TRUE;
***************
*** 6798,6804 ****
            return;
  
  #ifdef FEAT_BROWSE
!       if (cmdmod.browse)
        {
            char_u *browseFile;
  
--- 6803,6809 ----
            return;
  
  #ifdef FEAT_BROWSE
!       if (cmdmod.cmod_flags & CMOD_BROWSE)
        {
            char_u *browseFile;
  
***************
*** 7238,7245 ****
      else if (!eap->skip)
      {
        // Pass flags on for ":vertical wincmd ]".
!       postponed_split_flags = cmdmod.split;
!       postponed_split_tab = cmdmod.tab;
        do_window(*eap->arg, eap->addr_count > 0 ? eap->line2 : 0L, xchar);
        postponed_split_flags = 0;
        postponed_split_tab = 0;
--- 7243,7250 ----
      else if (!eap->skip)
      {
        // Pass flags on for ":vertical wincmd ]".
!       postponed_split_flags = cmdmod.cmod_split;
!       postponed_split_tab = cmdmod.cmod_tab;
        do_window(*eap->arg, eap->addr_count > 0 ? eap->line2 : 0L, xchar);
        postponed_split_flags = 0;
        postponed_split_tab = 0;
***************
*** 7642,7648 ****
            if (fname == NULL)
                return;
  #ifdef FEAT_BROWSE
!           if (cmdmod.browse)
            {
                char_u  *browseFile;
  
--- 7647,7653 ----
            if (fname == NULL)
                return;
  #ifdef FEAT_BROWSE
!           if (cmdmod.cmod_flags & CMOD_BROWSE)
            {
                char_u  *browseFile;
  
***************
*** 8314,8321 ****
  ex_stag(exarg_T *eap)
  {
      postponed_split = -1;
!     postponed_split_flags = cmdmod.split;
!     postponed_split_tab = cmdmod.tab;
      ex_tag_cmd(eap, cmdnames[eap->cmdidx].cmd_name + 1);
      postponed_split_flags = 0;
      postponed_split_tab = 0;
--- 8319,8326 ----
  ex_stag(exarg_T *eap)
  {
      postponed_split = -1;
!     postponed_split_flags = cmdmod.cmod_split;
!     postponed_split_tab = cmdmod.cmod_tab;
      ex_tag_cmd(eap, cmdnames[eap->cmdidx].cmd_name + 1);
      postponed_split_flags = 0;
      postponed_split_tab = 0;
*** ../vim-8.2.1897/src/ex_getln.c      2020-09-14 16:37:30.906845912 +0200
--- src/ex_getln.c      2020-10-24 20:15:38.017086531 +0200
***************
*** 195,201 ****
        int                 *patlen)
  {
      char_u    *cmd;
!     cmdmod_T  save_cmdmod = cmdmod;
      char_u    *p;
      int               delim_optional = FALSE;
      int               delim;
--- 195,201 ----
        int                 *patlen)
  {
      char_u    *cmd;
!     cmdmod_T  dummy_cmdmod;
      char_u    *p;
      int               delim_optional = FALSE;
      int               delim;
***************
*** 231,238 ****
      ea.cmd = ccline.cmdbuff;
      ea.addr_type = ADDR_LINES;
  
!     parse_command_modifiers(&ea, &dummy, TRUE);
!     cmdmod = save_cmdmod;
  
      cmd = skip_range(ea.cmd, TRUE, NULL);
      if (vim_strchr((char_u *)"sgvl", *cmd) == NULL)
--- 231,238 ----
      ea.cmd = ccline.cmdbuff;
      ea.addr_type = ADDR_LINES;
  
!     CLEAR_FIELD(dummy_cmdmod);
!     parse_command_modifiers(&ea, &dummy, &dummy_cmdmod, TRUE);
  
      cmd = skip_range(ea.cmd, TRUE, NULL);
      if (vim_strchr((char_u *)"sgvl", *cmd) == NULL)
***************
*** 4163,4170 ****
      pum_undisplay();
  
      // don't use a new tab page
!     cmdmod.tab = 0;
!     cmdmod.noswapfile = 1;
  
      // Create a window for the command-line buffer.
      if (win_split((int)p_cwh, WSP_BOT) == FAIL)
--- 4163,4170 ----
      pum_undisplay();
  
      // don't use a new tab page
!     cmdmod.cmod_tab = 0;
!     cmdmod.cmod_flags |= CMOD_NOSWAPFILE;
  
      // Create a window for the command-line buffer.
      if (win_split((int)p_cwh, WSP_BOT) == FAIL)
*** ../vim-8.2.1897/src/fileio.c        2020-10-11 14:28:07.074402602 +0200
--- src/fileio.c        2020-10-24 20:40:07.524447846 +0200
***************
*** 2501,2507 ****
        check_cursor_lnum();
        beginline(BL_WHITE | BL_FIX);       // on first non-blank
  
!       if (!cmdmod.lockmarks)
        {
            // Set '[ and '] marks to the newly read lines.
            curbuf->b_op_start.lnum = from + 1;
--- 2501,2507 ----
        check_cursor_lnum();
        beginline(BL_WHITE | BL_FIX);       // on first non-blank
  
!       if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
        {
            // Set '[ and '] marks to the newly read lines.
            curbuf->b_op_start.lnum = from + 1;
*** ../vim-8.2.1897/src/filepath.c      2020-10-05 20:38:02.469117560 +0200
--- src/filepath.c      2020-10-24 19:31:59.506081728 +0200
***************
*** 2213,2223 ****
      char_u            *fname;
      static char_u     *last_dir = NULL;    // last used directory
      char_u            *tofree = NULL;
!     int                       save_browse = cmdmod.browse;
  
      // Must turn off browse to avoid that autocommands will get the
      // flag too!
!     cmdmod.browse = FALSE;
  
      if (title == NULL || *title == NUL)
      {
--- 2213,2223 ----
      char_u            *fname;
      static char_u     *last_dir = NULL;    // last used directory
      char_u            *tofree = NULL;
!     int                       save_cmod_flags = cmdmod.cmod_flags;
  
      // Must turn off browse to avoid that autocommands will get the
      // flag too!
!     cmdmod.cmod_flags &= ~CMOD_BROWSE;
  
      if (title == NULL || *title == NUL)
      {
***************
*** 2350,2356 ****
      }
  
      vim_free(tofree);
!     cmdmod.browse = save_browse;
  
      return fname;
  }
--- 2350,2356 ----
      }
  
      vim_free(tofree);
!     cmdmod.cmod_flags = save_cmod_flags;
  
      return fname;
  }
*** ../vim-8.2.1897/src/gui.c   2020-08-11 21:58:12.581968226 +0200
--- src/gui.c   2020-10-24 19:41:02.764602351 +0200
***************
*** 864,873 ****
      // Only exit when there are no changed files
      exiting = TRUE;
  # ifdef FEAT_BROWSE
!     cmdmod.browse = TRUE;
  # endif
  # if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!     cmdmod.confirm = TRUE;
  # endif
      // If there are changed buffers, present the user with a dialog if
      // possible, otherwise give an error message.
--- 864,873 ----
      // Only exit when there are no changed files
      exiting = TRUE;
  # ifdef FEAT_BROWSE
!     cmdmod.cmod_flags |= CMOD_BROWSE;
  # endif
  # if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!     cmdmod.cmod_flags |= CMOD_CONFIRM;
  # endif
      // If there are changed buffers, present the user with a dialog if
      // possible, otherwise give an error message.
*** ../vim-8.2.1897/src/gui_gtk_x11.c   2020-10-21 16:10:16.382485983 +0200
--- src/gui_gtk_x11.c   2020-10-24 19:43:15.440240485 +0200
***************
*** 2226,2235 ****
      save_cmdmod = cmdmod;
  
  # ifdef FEAT_BROWSE
!     cmdmod.browse = TRUE;
  # endif
  # if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!     cmdmod.confirm = TRUE;
  # endif
      /*
       * If there are changed buffers, present the user with
--- 2226,2235 ----
      save_cmdmod = cmdmod;
  
  # ifdef FEAT_BROWSE
!     cmdmod.cmod_flags |= CMOD_BROWSE;
  # endif
  # if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!     cmdmod.cmod_flags |= CMOD_CONFIRM;
  # endif
      /*
       * If there are changed buffers, present the user with
*** ../vim-8.2.1897/src/help.c  2020-10-11 19:08:30.096946822 +0200
--- src/help.c  2020-10-24 19:49:34.783205092 +0200
***************
*** 123,131 ****
  
      // Re-use an existing help window or open a new one.
      // Always open a new one for ":tab help".
!     if (!bt_help(curwin->w_buffer) || cmdmod.tab != 0)
      {
!       if (cmdmod.tab != 0)
            wp = NULL;
        else
            FOR_ALL_WINDOWS(wp)
--- 123,131 ----
  
      // Re-use an existing help window or open a new one.
      // Always open a new one for ":tab help".
!     if (!bt_help(curwin->w_buffer) || cmdmod.cmod_tab != 0)
      {
!       if (cmdmod.cmod_tab != 0)
            wp = NULL;
        else
            FOR_ALL_WINDOWS(wp)
***************
*** 148,154 ****
            // specified, the current window is vertically split and
            // narrow.
            n = WSP_HELP;
!           if (cmdmod.split == 0 && curwin->w_width != Columns
                                                  && curwin->w_width < 80)
                n |= WSP_TOP;
            if (win_split(0, n) == FAIL)
--- 148,154 ----
            // specified, the current window is vertically split and
            // narrow.
            n = WSP_HELP;
!           if (cmdmod.cmod_split == 0 && curwin->w_width != Columns
                                                  && curwin->w_width < 80)
                n |= WSP_TOP;
            if (win_split(0, n) == FAIL)
***************
*** 164,170 ****
            (void)do_ecmd(0, NULL, NULL, NULL, ECMD_LASTL,
                          ECMD_HIDE + ECMD_SET_HELP,
                          NULL);  // buffer is still open, don't store info
!           if (!cmdmod.keepalt)
                curwin->w_alt_fnum = alt_fnum;
            empty_fnum = curbuf->b_fnum;
        }
--- 164,170 ----
            (void)do_ecmd(0, NULL, NULL, NULL, ECMD_LASTL,
                          ECMD_HIDE + ECMD_SET_HELP,
                          NULL);  // buffer is still open, don't store info
!           if ((cmdmod.cmod_flags & CMOD_KEEPALT) == 0)
                curwin->w_alt_fnum = alt_fnum;
            empty_fnum = curbuf->b_fnum;
        }
***************
*** 193,199 ****
      }
  
      // keep the previous alternate file
!     if (alt_fnum != 0 && curwin->w_alt_fnum == empty_fnum && !cmdmod.keepalt)
        curwin->w_alt_fnum = alt_fnum;
  
  erret:
--- 193,200 ----
      }
  
      // keep the previous alternate file
!     if (alt_fnum != 0 && curwin->w_alt_fnum == empty_fnum
!                                   && (cmdmod.cmod_flags & CMOD_KEEPALT) == 0)
        curwin->w_alt_fnum = alt_fnum;
  
  erret:
*** ../vim-8.2.1897/src/if_cscope.c     2020-08-23 14:28:24.111838486 +0200
--- src/if_cscope.c     2020-10-24 18:08:00.667848691 +0200
***************
*** 212,219 ****
            return;
        }
        postponed_split = -1;
!       postponed_split_flags = cmdmod.split;
!       postponed_split_tab = cmdmod.tab;
      }
  
      cmdp->func(eap);
--- 212,219 ----
            return;
        }
        postponed_split = -1;
!       postponed_split_flags = cmdmod.cmod_split;
!       postponed_split_tab = cmdmod.cmod_tab;
      }
  
      cmdp->func(eap);
*** ../vim-8.2.1897/src/indent.c        2020-06-29 20:40:34.022867216 +0200
--- src/indent.c        2020-10-24 20:10:10.482192017 +0200
***************
*** 1049,1055 ****
        smsg(NGETTEXT("%ld line indented ",
                                                 "%ld lines indented ", i), i);
      }
!     if (!cmdmod.lockmarks)
      {
        // set '[ and '] marks
        curbuf->b_op_start = oap->start;
--- 1049,1055 ----
        smsg(NGETTEXT("%ld line indented ",
                                                 "%ld lines indented ", i), i);
      }
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        // set '[ and '] marks
        curbuf->b_op_start = oap->start;
*** ../vim-8.2.1897/src/mark.c  2020-07-19 22:09:02.655572869 +0200
--- src/mark.c  2020-10-24 20:20:12.608194637 +0200
***************
*** 145,151 ****
  #endif
  
      // for :global the mark is set only once
!     if (global_busy || listcmd_busy || cmdmod.keepjumps)
        return;
  
      curwin->w_prev_pcmark = curwin->w_pcmark;
--- 145,151 ----
  #endif
  
      // for :global the mark is set only once
!     if (global_busy || listcmd_busy || (cmdmod.cmod_flags & CMOD_KEEPJUMPS))
        return;
  
      curwin->w_prev_pcmark = curwin->w_pcmark;
***************
*** 1068,1074 ****
      if (line2 < line1 && amount_after == 0L)      // nothing to do
        return;
  
!     if (!cmdmod.lockmarks)
      {
        // named marks, lower case and upper case
        for (i = 0; i < NMARKS; i++)
--- 1068,1074 ----
      if (line2 < line1 && amount_after == 0L)      // nothing to do
        return;
  
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        // named marks, lower case and upper case
        for (i = 0; i < NMARKS; i++)
***************
*** 1133,1139 ****
      FOR_ALL_TAB_WINDOWS(tab, win)
      {
  #ifdef FEAT_JUMPLIST
!       if (!cmdmod.lockmarks)
            // Marks in the jumplist.  When deleting lines, this may create
            // duplicate marks in the jumplist, they will be removed later.
            for (i = 0; i < win->w_jumplistlen; ++i)
--- 1133,1139 ----
      FOR_ALL_TAB_WINDOWS(tab, win)
      {
  #ifdef FEAT_JUMPLIST
!       if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
            // Marks in the jumplist.  When deleting lines, this may create
            // duplicate marks in the jumplist, they will be removed later.
            for (i = 0; i < win->w_jumplistlen; ++i)
***************
*** 1143,1149 ****
  
        if (win->w_buffer == curbuf)
        {
!           if (!cmdmod.lockmarks)
                // marks in the tag stack
                for (i = 0; i < win->w_tagstacklen; i++)
                    if (win->w_tagstack[i].fmark.fnum == fnum)
--- 1143,1149 ----
  
        if (win->w_buffer == curbuf)
        {
!           if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
                // marks in the tag stack
                for (i = 0; i < win->w_tagstacklen; i++)
                    if (win->w_tagstack[i].fmark.fnum == fnum)
***************
*** 1249,1255 ****
      win_T     *win;
      pos_T     *posp;
  
!     if ((col_amount == 0L && lnum_amount == 0L) || cmdmod.lockmarks)
        return; // nothing to do
  
      // named marks, lower case and upper case
--- 1249,1256 ----
      win_T     *win;
      pos_T     *posp;
  
!     if ((col_amount == 0L && lnum_amount == 0L)
!                                      || (cmdmod.cmod_flags & CMOD_LOCKMARKS))
        return; // nothing to do
  
      // named marks, lower case and upper case
*** ../vim-8.2.1897/src/memline.c       2020-09-12 21:04:18.518231440 +0200
--- src/memline.c       2020-10-24 20:16:30.928912799 +0200
***************
*** 289,295 ****
      buf->b_ml.ml_chunksize = NULL;
  #endif
  
!     if (cmdmod.noswapfile)
        buf->b_p_swf = FALSE;
  
      /*
--- 289,295 ----
      buf->b_ml.ml_chunksize = NULL;
  #endif
  
!     if (cmdmod.cmod_flags & CMOD_NOSWAPFILE)
        buf->b_p_swf = FALSE;
  
      /*
***************
*** 635,641 ****
         * When 'updatecount' is 0 and 'noswapfile' there is no swap file.
         * For help files we will make a swap file now.
         */
!       if (p_uc != 0 && !cmdmod.noswapfile)
            ml_open_file(buf);      // create a swap file
        return;
      }
--- 635,641 ----
         * When 'updatecount' is 0 and 'noswapfile' there is no swap file.
         * For help files we will make a swap file now.
         */
!       if (p_uc != 0 && (cmdmod.cmod_flags & CMOD_NOSWAPFILE) == 0)
            ml_open_file(buf);      // create a swap file
        return;
      }
***************
*** 747,753 ****
      char_u    *dirp;
  
      mfp = buf->b_ml.ml_mfp;
!     if (mfp == NULL || mfp->mf_fd >= 0 || !buf->b_p_swf || cmdmod.noswapfile)
        return;         // nothing to do
  
  #ifdef FEAT_SPELL
--- 747,754 ----
      char_u    *dirp;
  
      mfp = buf->b_ml.ml_mfp;
!     if (mfp == NULL || mfp->mf_fd >= 0 || !buf->b_p_swf
!                                     || (cmdmod.cmod_flags & CMOD_NOSWAPFILE))
        return;         // nothing to do
  
  #ifdef FEAT_SPELL
*** ../vim-8.2.1897/src/message.c       2020-10-13 22:15:37.482726643 +0200
--- src/message.c       2020-10-24 18:18:28.310162325 +0200
***************
*** 2319,2328 ****
  {
      int match;
  
!     if (cmdmod.filter_regmatch.regprog == NULL)
        return FALSE;
!     match = vim_regexec(&cmdmod.filter_regmatch, msg, (colnr_T)0);
!     return cmdmod.filter_force ? match : !match;
  }
  
  /*
--- 2319,2328 ----
  {
      int match;
  
!     if (cmdmod.cmod_filter_regmatch.regprog == NULL)
        return FALSE;
!     match = vim_regexec(&cmdmod.cmod_filter_regmatch, msg, (colnr_T)0);
!     return cmdmod.cmod_filter_force ? match : !match;
  }
  
  /*
*** ../vim-8.2.1897/src/option.c        2020-09-12 21:04:18.518231440 +0200
--- src/option.c        2020-10-24 20:16:44.660867872 +0200
***************
*** 1125,1131 ****
      else if (eap->cmdidx == CMD_setglobal)
        flags = OPT_GLOBAL;
  #if defined(FEAT_EVAL) && defined(FEAT_BROWSE)
!     if (cmdmod.browse && flags == 0)
        ex_options(eap);
      else
  #endif
--- 1125,1131 ----
      else if (eap->cmdidx == CMD_setglobal)
        flags = OPT_GLOBAL;
  #if defined(FEAT_EVAL) && defined(FEAT_BROWSE)
!     if ((cmdmod.cmod_flags & CMOD_BROWSE) && flags == 0)
        ex_options(eap);
      else
  #endif
***************
*** 5774,5780 ****
            buf->b_p_ml_nobin = p_ml_nobin;
            buf->b_p_inf = p_inf;
            COPY_OPT_SCTX(buf, BV_INF);
!           if (cmdmod.noswapfile)
                buf->b_p_swf = FALSE;
            else
            {
--- 5774,5780 ----
            buf->b_p_ml_nobin = p_ml_nobin;
            buf->b_p_inf = p_inf;
            COPY_OPT_SCTX(buf, BV_INF);
!           if (cmdmod.cmod_flags & CMOD_NOSWAPFILE)
                buf->b_p_swf = FALSE;
            else
            {
*** ../vim-8.2.1897/src/ops.c   2020-09-16 15:46:04.881061899 +0200
--- src/ops.c   2020-10-24 20:12:01.373810823 +0200
***************
*** 204,210 ****
        msg_attr_keep((char *)IObuff, 0, TRUE);
      }
  
!     if (!cmdmod.lockmarks)
      {
        // Set "'[" and "']" marks.
        curbuf->b_op_start = oap->start;
--- 204,210 ----
        msg_attr_keep((char *)IObuff, 0, TRUE);
      }
  
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        // Set "'[" and "']" marks.
        curbuf->b_op_start = oap->start;
***************
*** 943,949 ****
      msgmore(curbuf->b_ml.ml_line_count - old_lcount);
  
  setmarks:
!     if (!cmdmod.lockmarks)
      {
        if (oap->block_mode)
        {
--- 943,949 ----
      msgmore(curbuf->b_ml.ml_line_count - old_lcount);
  
  setmarks:
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        if (oap->block_mode)
        {
***************
*** 1216,1222 ****
      check_cursor();
      changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, 0L);
  
!     if (!cmdmod.lockmarks)
      {
        // Set "'[" and "']" marks.
        curbuf->b_op_start = oap->start;
--- 1216,1222 ----
      check_cursor();
      changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, 0L);
  
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        // Set "'[" and "']" marks.
        curbuf->b_op_start = oap->start;
***************
*** 1329,1335 ****
        // No change: need to remove the Visual selection
        redraw_curbuf_later(INVERTED);
  
!     if (!cmdmod.lockmarks)
      {
        // Set '[ and '] marks.
        curbuf->b_op_start = oap->start;
--- 1329,1335 ----
        // No change: need to remove the Visual selection
        redraw_curbuf_later(INVERTED);
  
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        // Set '[ and '] marks.
        curbuf->b_op_start = oap->start;
***************
*** 1942,1948 ****
  #ifdef FEAT_PROP_POPUP
        propcount += count_props((linenr_T) (curwin->w_cursor.lnum + t), t > 0);
  #endif
!       if (t == 0 && setmark && !cmdmod.lockmarks)
        {
            // Set the '[ mark.
            curwin->w_buffer->b_op_start.lnum = curwin->w_cursor.lnum;
--- 1942,1948 ----
  #ifdef FEAT_PROP_POPUP
        propcount += count_props((linenr_T) (curwin->w_cursor.lnum + t), t > 0);
  #endif
!       if (t == 0 && setmark && (cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
        {
            // Set the '[ mark.
            curwin->w_buffer->b_op_start.lnum = curwin->w_cursor.lnum;
***************
*** 2088,2094 ****
  
      ml_replace_len(curwin->w_cursor.lnum, newp, (colnr_T)newp_len, TRUE, 
FALSE);
  
!     if (setmark && !cmdmod.lockmarks)
      {
        // Set the '] mark.
        curwin->w_buffer->b_op_end.lnum = curwin->w_cursor.lnum;
--- 2088,2094 ----
  
      ml_replace_len(curwin->w_cursor.lnum, newp, (colnr_T)newp_len, TRUE, 
FALSE);
  
!     if (setmark && (cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        // Set the '] mark.
        curwin->w_buffer->b_op_end.lnum = curwin->w_cursor.lnum;
***************
*** 2405,2411 ****
  
        // Set '[ mark if something changed. Keep the last end
        // position from do_addsub().
!       if (change_cnt > 0 && !cmdmod.lockmarks)
            curbuf->b_op_start = startpos;
  
        if (change_cnt > p_report)
--- 2405,2411 ----
  
        // Set '[ mark if something changed. Keep the last end
        // position from do_addsub().
!       if (change_cnt > 0 && (cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
            curbuf->b_op_start = startpos;
  
        if (change_cnt > p_report)
***************
*** 2852,2858 ****
            --curwin->w_cursor.col;
      }
  
!     if (did_change && !cmdmod.lockmarks)
      {
        // set the '[ and '] marks
        curbuf->b_op_start = startpos;
--- 2852,2858 ----
            --curwin->w_cursor.col;
      }
  
!     if (did_change && (cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        // set the '[ and '] marks
        curbuf->b_op_start = startpos;
***************
*** 3301,3307 ****
        (void)call_func_retnr(p_opfunc, 1, argv);
  
        virtual_op = save_virtual_op;
!       if (cmdmod.lockmarks)
        {
            curbuf->b_op_start = orig_start;
            curbuf->b_op_end = orig_end;
--- 3301,3307 ----
        (void)call_func_retnr(p_opfunc, 1, argv);
  
        virtual_op = save_virtual_op;
!       if (cmdmod.cmod_flags & CMOD_LOCKMARKS)
        {
            curbuf->b_op_start = orig_start;
            curbuf->b_op_end = orig_end;
*** ../vim-8.2.1897/src/os_unix.c       2020-10-24 13:30:46.280240528 +0200
--- src/os_unix.c       2020-10-24 19:44:18.640068048 +0200
***************
*** 7868,7882 ****
      static void
  xsmp_handle_interaction(SmcConn smc_conn, SmPointer client_data UNUSED)
  {
!     cmdmod_T  save_cmdmod;
      int               cancel_shutdown = False;
  
!     save_cmdmod = cmdmod;
!     cmdmod.confirm = TRUE;
      if (check_changed_any(FALSE, FALSE))
        // Mustn't logout
        cancel_shutdown = True;
!     cmdmod = save_cmdmod;
      setcursor();              // position cursor
      out_flush();
  
--- 7868,7882 ----
      static void
  xsmp_handle_interaction(SmcConn smc_conn, SmPointer client_data UNUSED)
  {
!     int               save_cmod_flags;
      int               cancel_shutdown = False;
  
!     save_cmod_flags = cmdmod.cmod_flags;
!     cmdmod.cmod_flags |= CMOD_CONFIRM;
      if (check_changed_any(FALSE, FALSE))
        // Mustn't logout
        cancel_shutdown = True;
!     cmdmod.cmod_flags = save_cmod_flags;
      setcursor();              // position cursor
      out_flush();
  
*** ../vim-8.2.1897/src/quickfix.c      2020-10-20 14:59:08.689104235 +0200
--- src/quickfix.c      2020-10-24 19:32:52.389937937 +0200
***************
*** 2834,2840 ****
      win_T     *wp;
      int               flags;
  
!     if (cmdmod.tab != 0 || newwin)
        wp = NULL;
      else
        wp = qf_find_help_win();
--- 2834,2840 ----
      win_T     *wp;
      int               flags;
  
!     if (cmdmod.cmod_tab != 0 || newwin)
        wp = NULL;
      else
        wp = qf_find_help_win();
***************
*** 2845,2851 ****
        // Split off help window; put it at far top if no position
        // specified, the current window is vertically split and narrow.
        flags = WSP_HELP;
!       if (cmdmod.split == 0 && curwin->w_width != Columns
                && curwin->w_width < 80)
            flags |= WSP_TOP;
        // If the user asks to open a new window, then copy the location list.
--- 2845,2851 ----
        // Split off help window; put it at far top if no position
        // specified, the current window is vertically split and narrow.
        flags = WSP_HELP;
!       if (cmdmod.cmod_split == 0 && curwin->w_width != Columns
                && curwin->w_width < 80)
            flags |= WSP_TOP;
        // If the user asks to open a new window, then copy the location list.
***************
*** 3278,3284 ****
      qfltype_T qfl_type = qfl->qfl_type;
  
      // For ":helpgrep" find a help window or open one.
!     if (qf_ptr->qf_type == 1 && (!bt_help(curwin->w_buffer) || cmdmod.tab != 
0))
        if (jump_to_help_window(qi, newwin, opened_window) == FAIL)
            return FAIL;
      if (old_qf_curlist != qi->qf_curlist
--- 3278,3285 ----
      qfltype_T qfl_type = qfl->qfl_type;
  
      // For ":helpgrep" find a help window or open one.
!     if (qf_ptr->qf_type == 1 && (!bt_help(curwin->w_buffer)
!                                                     || cmdmod.cmod_tab != 0))
        if (jump_to_help_window(qi, newwin, opened_window) == FAIL)
            return FAIL;
      if (old_qf_curlist != qi->qf_curlist
***************
*** 4125,4136 ****
      // The current window becomes the previous window afterwards.
      win = curwin;
  
!     if (IS_QF_STACK(qi) && cmdmod.split == 0)
        // Create the new quickfix window at the very bottom, except when
        // :belowright or :aboveleft is used.
        win_goto(lastwin);
      // Default is to open the window below the current window
!     if (cmdmod.split == 0)
        flags = WSP_BELOW;
      flags |= WSP_NEWLOC;
      if (win_split(height, flags) == FAIL)
--- 4126,4137 ----
      // The current window becomes the previous window afterwards.
      win = curwin;
  
!     if (IS_QF_STACK(qi) && cmdmod.cmod_split == 0)
        // Create the new quickfix window at the very bottom, except when
        // :belowright or :aboveleft is used.
        win_goto(lastwin);
      // Default is to open the window below the current window
!     if (cmdmod.cmod_split == 0)
        flags = WSP_BELOW;
      flags |= WSP_NEWLOC;
      if (win_split(height, flags) == FAIL)
***************
*** 4208,4216 ****
  #endif
  
      // Find an existing quickfix window, or open a new one.
!     if (cmdmod.tab == 0)
        status = qf_goto_cwindow(qi, eap->addr_count != 0, height,
!                                               cmdmod.split & WSP_VERT);
      if (status == FAIL)
        if (qf_open_new_cwindow(qi, height) == FAIL)
        {
--- 4209,4217 ----
  #endif
  
      // Find an existing quickfix window, or open a new one.
!     if (cmdmod.cmod_tab == 0)
        status = qf_goto_cwindow(qi, eap->addr_count != 0, height,
!                                               cmdmod.cmod_split & WSP_VERT);
      if (status == FAIL)
        if (qf_open_new_cwindow(qi, height) == FAIL)
        {
***************
*** 5693,5699 ****
  
      enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
  #ifdef FEAT_BROWSE
!     if (cmdmod.browse)
      {
        char_u *browse_file = do_browse(0, (char_u *)_("Error file"), eap->arg,
                                   NULL, NULL,
--- 5694,5700 ----
  
      enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
  #ifdef FEAT_BROWSE
!     if (cmdmod.cmod_flags & CMOD_BROWSE)
      {
        char_u *browse_file = do_browse(0, (char_u *)_("Error file"), eap->arg,
                                   NULL, NULL,
***************
*** 6164,6170 ****
                    wipe_dummy_buffer(buf, dirname_start);
                    buf = NULL;
                }
!               else if (!cmdmod.hide
                            || buf->b_p_bh[0] == 'u'    // "unload"
                            || buf->b_p_bh[0] == 'w'    // "wipe"
                            || buf->b_p_bh[0] == 'd')   // "delete"
--- 6165,6171 ----
                    wipe_dummy_buffer(buf, dirname_start);
                    buf = NULL;
                }
!               else if ((cmdmod.cmod_flags & CMOD_HIDE) == 0
                            || buf->b_p_bh[0] == 'u'    // "unload"
                            || buf->b_p_bh[0] == 'w'    // "wipe"
                            || buf->b_p_bh[0] == 'd')   // "delete"
*** ../vim-8.2.1897/src/register.c      2020-09-08 22:45:31.113504961 +0200
--- src/register.c      2020-10-24 20:12:16.561759228 +0200
***************
*** 1358,1364 ****
        }
      }
  
!     if (!cmdmod.lockmarks)
      {
        // Set "'[" and "']" marks.
        curbuf->b_op_start = oap->start;
--- 1358,1364 ----
        }
      }
  
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
      {
        // Set "'[" and "']" marks.
        curbuf->b_op_start = oap->start;
***************
*** 2170,2176 ****
      curwin->w_set_curswant = TRUE;
  
  end:
!     if (cmdmod.lockmarks)
      {
        curbuf->b_op_start = orig_start;
        curbuf->b_op_end = orig_end;
--- 2170,2176 ----
      curwin->w_set_curswant = TRUE;
  
  end:
!     if (cmdmod.cmod_flags & CMOD_LOCKMARKS)
      {
        curbuf->b_op_start = orig_start;
        curbuf->b_op_end = orig_end;
*** ../vim-8.2.1897/src/scriptfile.c    2020-10-14 19:39:16.041002546 +0200
--- src/scriptfile.c    2020-10-24 19:33:04.217905766 +0200
***************
*** 979,985 ****
  ex_source(exarg_T *eap)
  {
  #ifdef FEAT_BROWSE
!     if (cmdmod.browse)
      {
        char_u *fname = NULL;
  
--- 979,985 ----
  ex_source(exarg_T *eap)
  {
  #ifdef FEAT_BROWSE
!     if (cmdmod.cmod_flags & CMOD_BROWSE)
      {
        char_u *fname = NULL;
  
*** ../vim-8.2.1897/src/search.c        2020-10-23 16:49:30.112311448 +0200
--- src/search.c        2020-10-24 20:14:40.805275636 +0200
***************
*** 189,195 ****
       * Save the currently used pattern in the appropriate place,
       * unless the pattern should not be remembered.
       */
!     if (!(options & SEARCH_KEEP) && !cmdmod.keeppatterns)
      {
        // search or global command
        if (pat_save == RE_SEARCH || pat_save == RE_BOTH)
--- 189,196 ----
       * Save the currently used pattern in the appropriate place,
       * unless the pattern should not be remembered.
       */
!     if (!(options & SEARCH_KEEP)
!                              && (cmdmod.cmod_flags & CMOD_KEEPPATTERNS) == 0)
      {
        // search or global command
        if (pat_save == RE_SEARCH || pat_save == RE_BOTH)
***************
*** 1661,1667 ****
      curwin->w_set_curswant = TRUE;
  
  end_do_search:
!     if ((options & SEARCH_KEEP) || cmdmod.keeppatterns)
        spats[0].off = old_off;
      vim_free(strcopy);
      vim_free(msgbuf);
--- 1662,1668 ----
      curwin->w_set_curswant = TRUE;
  
  end_do_search:
!     if ((options & SEARCH_KEEP) || (cmdmod.cmod_flags & CMOD_KEEPPATTERNS))
        spats[0].off = old_off;
      vim_free(strcopy);
      vim_free(msgbuf);
*** ../vim-8.2.1897/src/session.c       2020-09-11 22:10:17.965597366 +0200
--- src/session.c       2020-10-24 19:33:11.693885439 +0200
***************
*** 1144,1150 ****
        fname = (char_u *)EXRC_FILE;
  
  #ifdef FEAT_BROWSE
!     if (cmdmod.browse)
      {
        browseFile = do_browse(BROWSE_SAVE,
  # ifdef FEAT_SESSION
--- 1144,1150 ----
        fname = (char_u *)EXRC_FILE;
  
  #ifdef FEAT_BROWSE
!     if (cmdmod.cmod_flags & CMOD_BROWSE)
      {
        browseFile = do_browse(BROWSE_SAVE,
  # ifdef FEAT_SESSION
*** ../vim-8.2.1897/src/tag.c   2020-08-30 19:26:40.736556825 +0200
--- src/tag.c   2020-10-24 18:08:33.411759588 +0200
***************
*** 3463,3469 ****
        }
      }
      if (getfile_result == GETFILE_UNUSED
!                                      && (postponed_split || cmdmod.tab != 0))
      {
        if (win_split(postponed_split > 0 ? postponed_split : 0,
                                                postponed_split_flags) == FAIL)
--- 3463,3469 ----
        }
      }
      if (getfile_result == GETFILE_UNUSED
!                                 && (postponed_split || cmdmod.cmod_tab != 0))
      {
        if (win_split(postponed_split > 0 ? postponed_split : 0,
                                                postponed_split_flags) == FAIL)
*** ../vim-8.2.1897/src/terminal.c      2020-10-23 15:40:35.651287923 +0200
--- src/terminal.c      2020-10-24 19:44:31.660032502 +0200
***************
*** 440,446 ****
      buf_T     *old_curbuf = NULL;
      int               res;
      buf_T     *newbuf;
!     int               vertical = opt->jo_vertical || (cmdmod.split & 
WSP_VERT);
      jobopt_T  orig_opt;  // only partly filled
  
      if (check_restricted() || check_secure())
--- 440,446 ----
      buf_T     *old_curbuf = NULL;
      int               res;
      buf_T     *newbuf;
!     int               vertical = opt->jo_vertical || (cmdmod.cmod_split & 
WSP_VERT);
      jobopt_T  orig_opt;  // only partly filled
  
      if (check_restricted() || check_secure())
***************
*** 529,535 ****
        }
  
        if (vertical)
!           cmdmod.split |= WSP_VERT;
        ex_splitview(&split_ea);
        if (curwin == old_curwin)
        {
--- 529,535 ----
        }
  
        if (vertical)
!           cmdmod.cmod_split |= WSP_VERT;
        ex_splitview(&split_ea);
        if (curwin == old_curwin)
        {
***************
*** 1592,1598 ****
      char    *how = (char *)buf->b_term->tl_kill;
  
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!     if ((how == NULL || *how == NUL) && (p_confirm || cmdmod.confirm))
      {
        char_u  buff[DIALOG_MSG_SIZE];
        int     ret;
--- 1592,1599 ----
      char    *how = (char *)buf->b_term->tl_kill;
  
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!     if ((how == NULL || *how == NUL)
!                         && (p_confirm || (cmdmod.cmod_flags & CMOD_CONFIRM)))
      {
        char_u  buff[DIALOG_MSG_SIZE];
        int     ret;
*** ../vim-8.2.1897/src/textformat.c    2020-06-04 18:21:56.046395485 +0200
--- src/textformat.c    2020-10-24 20:12:25.457729088 +0200
***************
*** 819,825 ****
        // When there is no change: need to remove the Visual selection
        redraw_curbuf_later(INVERTED);
  
!     if (!cmdmod.lockmarks)
        // Set '[ mark at the start of the formatted area
        curbuf->b_op_start = oap->start;
  
--- 819,825 ----
        // When there is no change: need to remove the Visual selection
        redraw_curbuf_later(INVERTED);
  
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
        // Set '[ mark at the start of the formatted area
        curbuf->b_op_start = oap->start;
  
***************
*** 839,845 ****
      old_line_count = curbuf->b_ml.ml_line_count - old_line_count;
      msgmore(old_line_count);
  
!     if (!cmdmod.lockmarks)
        // put '] mark on the end of the formatted area
        curbuf->b_op_end = curwin->w_cursor;
  
--- 839,845 ----
      old_line_count = curbuf->b_ml.ml_line_count - old_line_count;
      msgmore(old_line_count);
  
!     if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
        // put '] mark on the end of the formatted area
        curbuf->b_op_end = curwin->w_cursor;
  
*** ../vim-8.2.1897/src/usercmd.c       2020-10-20 23:11:30.172481858 +0200
--- src/usercmd.c       2020-10-24 20:21:04.528028294 +0200
***************
*** 1235,1242 ****
  }
  
  /*
!  * Add modifiers from "cmdmod.split" to "buf".  Set "multi_mods" when one was
!  * added.  Return the number of bytes added.
   */
      size_t
  add_win_cmd_modifers(char_u *buf, int *multi_mods)
--- 1235,1242 ----
  }
  
  /*
!  * Add modifiers from "cmdmod.cmod_split" to "buf".  Set "multi_mods" when one
!  * was added.  Return the number of bytes added.
   */
      size_t
  add_win_cmd_modifers(char_u *buf, int *multi_mods)
***************
*** 1244,1266 ****
      size_t result = 0;
  
      // :aboveleft and :leftabove
!     if (cmdmod.split & WSP_ABOVE)
        result += add_cmd_modifier(buf, "aboveleft", multi_mods);
      // :belowright and :rightbelow
!     if (cmdmod.split & WSP_BELOW)
        result += add_cmd_modifier(buf, "belowright", multi_mods);
      // :botright
!     if (cmdmod.split & WSP_BOT)
        result += add_cmd_modifier(buf, "botright", multi_mods);
  
      // :tab
!     if (cmdmod.tab > 0)
        result += add_cmd_modifier(buf, "tab", multi_mods);
      // :topleft
!     if (cmdmod.split & WSP_TOP)
        result += add_cmd_modifier(buf, "topleft", multi_mods);
      // :vertical
!     if (cmdmod.split & WSP_VERT)
        result += add_cmd_modifier(buf, "vertical", multi_mods);
      return result;
  }
--- 1244,1266 ----
      size_t result = 0;
  
      // :aboveleft and :leftabove
!     if (cmdmod.cmod_split & WSP_ABOVE)
        result += add_cmd_modifier(buf, "aboveleft", multi_mods);
      // :belowright and :rightbelow
!     if (cmdmod.cmod_split & WSP_BELOW)
        result += add_cmd_modifier(buf, "belowright", multi_mods);
      // :botright
!     if (cmdmod.cmod_split & WSP_BOT)
        result += add_cmd_modifier(buf, "botright", multi_mods);
  
      // :tab
!     if (cmdmod.cmod_tab > 0)
        result += add_cmd_modifier(buf, "tab", multi_mods);
      // :topleft
!     if (cmdmod.cmod_split & WSP_TOP)
        result += add_cmd_modifier(buf, "topleft", multi_mods);
      // :vertical
!     if (cmdmod.cmod_split & WSP_VERT)
        result += add_cmd_modifier(buf, "vertical", multi_mods);
      return result;
  }
***************
*** 1454,1477 ****
      {
        int multi_mods = 0;
        typedef struct {
!           int *varp;
            char *name;
        } mod_entry_T;
        static mod_entry_T mod_entries[] = {
  #ifdef FEAT_BROWSE_CMD
!           {&cmdmod.browse, "browse"},
  #endif
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!           {&cmdmod.confirm, "confirm"},
  #endif
!           {&cmdmod.hide, "hide"},
!           {&cmdmod.keepalt, "keepalt"},
!           {&cmdmod.keepjumps, "keepjumps"},
!           {&cmdmod.keepmarks, "keepmarks"},
!           {&cmdmod.keeppatterns, "keeppatterns"},
!           {&cmdmod.lockmarks, "lockmarks"},
!           {&cmdmod.noswapfile, "noswapfile"},
!           {NULL, NULL}
        };
        int i;
  
--- 1454,1477 ----
      {
        int multi_mods = 0;
        typedef struct {
!           int flag;
            char *name;
        } mod_entry_T;
        static mod_entry_T mod_entries[] = {
  #ifdef FEAT_BROWSE_CMD
!           {CMOD_BROWSE, "browse"},
  #endif
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!           {CMOD_CONFIRM, "confirm"},
  #endif
!           {CMOD_HIDE, "hide"},
!           {CMOD_KEEPALT, "keepalt"},
!           {CMOD_KEEPJUMPS, "keepjumps"},
!           {CMOD_KEEPMARKS, "keepmarks"},
!           {CMOD_KEEPPATTERNS, "keeppatterns"},
!           {CMOD_LOCKMARKS, "lockmarks"},
!           {CMOD_NOSWAPFILE, "noswapfile"},
!           {0, NULL}
        };
        int i;
  
***************
*** 1484,1491 ****
        }
  
        // the modifiers that are simple flags
!       for (i = 0; mod_entries[i].varp != NULL; ++i)
!           if (*mod_entries[i].varp)
                result += add_cmd_modifier(buf, mod_entries[i].name,
                                                                 &multi_mods);
  
--- 1484,1491 ----
        }
  
        // the modifiers that are simple flags
!       for (i = 0; mod_entries[i].name != NULL; ++i)
!           if (cmdmod.cmod_flags & mod_entries[i].flag)
                result += add_cmd_modifier(buf, mod_entries[i].name,
                                                                 &multi_mods);
  
***************
*** 1501,1507 ****
        // :verbose
        if (p_verbose > 0)
            result += add_cmd_modifier(buf, "verbose", &multi_mods);
!       // flags from cmdmod.split
        result += add_win_cmd_modifers(buf, &multi_mods);
        if (quote && buf != NULL)
        {
--- 1501,1507 ----
        // :verbose
        if (p_verbose > 0)
            result += add_cmd_modifier(buf, "verbose", &multi_mods);
!       // flags from cmdmod.cmod_split
        result += add_win_cmd_modifers(buf, &multi_mods);
        if (quote && buf != NULL)
        {
*** ../vim-8.2.1897/src/vim9compile.c   2020-10-24 17:19:12.135743402 +0200
--- src/vim9compile.c   2020-10-24 18:48:11.933299524 +0200
***************
*** 1826,1842 ****
   * Generate any instructions for side effects of "cmdmod".
   */
      static int
! generate_cmdmods(cctx_T *cctx)
  {
      isn_T     *isn;
  
      // TODO: use more modifiers in the command
!     if (cmdmod.cmod_flags & (CMOD_SILENT | CMOD_ERRSILENT))
      {
        if ((isn = generate_instr(cctx, ISN_SILENT)) == NULL)
            return FAIL;
!       isn->isn_arg.number = (cmdmod.cmod_flags & CMOD_ERRSILENT) != 0;
!       cctx->ctx_silent = (cmdmod.cmod_flags & CMOD_ERRSILENT) ? 2 : 1;
      }
      return OK;
  }
--- 1826,1842 ----
   * Generate any instructions for side effects of "cmdmod".
   */
      static int
! generate_cmdmods(cctx_T *cctx, cmdmod_T *cmod)
  {
      isn_T     *isn;
  
      // TODO: use more modifiers in the command
!     if (cmod->cmod_flags & (CMOD_SILENT | CMOD_ERRSILENT))
      {
        if ((isn = generate_instr(cctx, ISN_SILENT)) == NULL)
            return FAIL;
!       isn->isn_arg.number = (cmod->cmod_flags & CMOD_ERRSILENT) != 0;
!       cctx->ctx_silent = (cmod->cmod_flags & CMOD_ERRSILENT) ? 2 : 1;
      }
      return OK;
  }
***************
*** 7092,7101 ****
      for (;;)
      {
        exarg_T     ea;
!       cmdmod_T    save_cmdmod;
        int         starts_with_colon = FALSE;
        char_u      *cmd;
-       int         save_msg_scroll = msg_scroll;
  
        // Bail out on the first error to avoid a flood of errors and report
        // the right line number when inside try/catch.
--- 7092,7100 ----
      for (;;)
      {
        exarg_T     ea;
!       cmdmod_T    local_cmdmod;
        int         starts_with_colon = FALSE;
        char_u      *cmd;
  
        // Bail out on the first error to avoid a flood of errors and report
        // the right line number when inside try/catch.
***************
*** 7176,7183 ****
        /*
         * COMMAND MODIFIERS
         */
!       save_cmdmod = cmdmod;
!       if (parse_command_modifiers(&ea, &errormsg, FALSE) == FAIL)
        {
            if (errormsg != NULL)
                goto erret;
--- 7175,7183 ----
        /*
         * COMMAND MODIFIERS
         */
!       CLEAR_FIELD(local_cmdmod);
!       if (parse_command_modifiers(&ea, &errormsg, &local_cmdmod, FALSE)
!                                                                      == FAIL)
        {
            if (errormsg != NULL)
                goto erret;
***************
*** 7185,7194 ****
            line = (char_u *)"";
            continue;
        }
!       generate_cmdmods(&cctx);
! 
!       undo_cmdmod(save_msg_scroll);
!       cmdmod = save_cmdmod;
  
        // Skip ":call" to get to the function name.
        p = ea.cmd;
--- 7185,7192 ----
            line = (char_u *)"";
            continue;
        }
!       generate_cmdmods(&cctx, &local_cmdmod);
!       undo_cmdmod(&local_cmdmod);
  
        // Skip ":call" to get to the function name.
        p = ea.cmd;
*** ../vim-8.2.1897/src/window.c        2020-10-01 22:37:36.403376674 +0200
--- src/window.c        2020-10-24 19:44:59.551956422 +0200
***************
*** 615,621 ****
  #ifdef FEAT_SEARCHPATH
                    case 'f':       // CTRL-W gf: "gf" in a new tab page
                    case 'F':       // CTRL-W gF: "gF" in a new tab page
!                       cmdmod.tab = tabpage_index(curtab) + 1;
                        nchar = xchar;
                        goto wingotofile;
  #endif
--- 615,621 ----
  #ifdef FEAT_SEARCHPATH
                    case 'f':       // CTRL-W gf: "gf" in a new tab page
                    case 'F':       // CTRL-W gF: "gF" in a new tab page
!                       cmdmod.cmod_tab = tabpage_index(curtab) + 1;
                        nchar = xchar;
                        goto wingotofile;
  #endif
***************
*** 798,804 ****
        return OK;
  
      // Add flags from ":vertical", ":topleft" and ":botright".
!     flags |= cmdmod.split;
      if ((flags & WSP_TOP) && (flags & WSP_BOT))
      {
        emsg(_("E442: Can't split topleft and botright at the same time"));
--- 798,804 ----
        return OK;
  
      // Add flags from ":vertical", ":topleft" and ":botright".
!     flags |= cmdmod.cmod_split;
      if ((flags & WSP_TOP) && (flags & WSP_BOT))
      {
        emsg(_("E442: Can't split topleft and botright at the same time"));
***************
*** 3568,3574 ****
            if (!r)
            {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!               if (message && (p_confirm || cmdmod.confirm) && p_write)
                {
                    dialog_changed(wp->w_buffer, FALSE);
                    if (!win_valid(wp))         // autocommands messed wp up
--- 3568,3575 ----
            if (!r)
            {
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
!               if (message && (p_confirm
!                            || (cmdmod.cmod_flags & CMOD_CONFIRM)) && p_write)
                {
                    dialog_changed(wp->w_buffer, FALSE);
                    if (!win_valid(wp))         // autocommands messed wp up
***************
*** 3925,3935 ****
      static int
  may_open_tabpage(void)
  {
!     int               n = (cmdmod.tab == 0) ? postponed_split_tab : 
cmdmod.tab;
  
      if (n != 0)
      {
!       cmdmod.tab = 0;     // reset it to avoid doing it twice
        postponed_split_tab = 0;
        return win_new_tabpage(n);
      }
--- 3926,3937 ----
      static int
  may_open_tabpage(void)
  {
!     int               n = (cmdmod.cmod_tab == 0)
!                                      ? postponed_split_tab : cmdmod.cmod_tab;
  
      if (n != 0)
      {
!       cmdmod.cmod_tab = 0;        // reset it to avoid doing it twice
        postponed_split_tab = 0;
        return win_new_tabpage(n);
      }
*** ../vim-8.2.1897/src/proto/ex_docmd.pro      2020-10-24 17:19:12.135743402 
+0200
--- src/proto/ex_docmd.pro      2020-10-24 18:41:12.222471404 +0200
***************
*** 6,14 ****
  void *getline_cookie(char_u *(*fgetline)(int, void *, int, getline_opt_T), 
void *cookie);
  char_u *getline_peek(char_u *(*fgetline)(int, void *, int, getline_opt_T), 
void *cookie);
  char *ex_errmsg(char *msg, char_u *arg);
! int parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only);
  void apply_cmdmod(cmdmod_T *cmod);
! void undo_cmdmod(int save_msg_scroll);
  int parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
  int checkforcmd(char_u **pp, char *cmd, int len);
  char_u *skip_option_env_lead(char_u *start);
--- 6,14 ----
  void *getline_cookie(char_u *(*fgetline)(int, void *, int, getline_opt_T), 
void *cookie);
  char_u *getline_peek(char_u *(*fgetline)(int, void *, int, getline_opt_T), 
void *cookie);
  char *ex_errmsg(char *msg, char_u *arg);
! int parse_command_modifiers(exarg_T *eap, char **errormsg, cmdmod_T *cmod, 
int skip_only);
  void apply_cmdmod(cmdmod_T *cmod);
! void undo_cmdmod(cmdmod_T *cmod);
  int parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
  int checkforcmd(char_u **pp, char *cmd, int len);
  char_u *skip_option_env_lead(char_u *start);
*** ../vim-8.2.1897/src/version.c       2020-10-24 17:19:12.135743402 +0200
--- src/version.c       2020-10-24 20:39:31.500559570 +0200
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     1898,
  /**/

-- 
Would you care for a drink?   I mean, if it were, like,
disabled and you had to look after it?

 /// 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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202010241851.09OIp1wS1100404%40masaka.moolenaar.net.

Raspunde prin e-mail lui