Loading ...
Sorry, an error occurred while loading the content.

Patch 6.2.302

Expand Messages
  • Bram Moolenaar
    Patch 6.2.302 Problem: Using CTRL-O . in Insert mode doesn t work properly. (Benji Fisher) Solution: Restore restart_edit after an insert command that
    Message 1 of 1 , Mar 1, 2004
    • 0 Attachment
      Patch 6.2.302
      Problem: Using "CTRL-O ." in Insert mode doesn't work properly. (Benji
      Fisher)
      Solution: Restore "restart_edit" after an insert command that was not typed.
      Avoid waiting with displaying the mode when there is no text to be
      overwritten.
      Fix that "CTRL-O ." sometimes doesn't put the cursor back after
      the end-of-line. Only reset the flag that CTRL-O was used past
      the end of the line when restarting editing. Update "o_lnum"
      number when inserting text and "o_eol" is set.
      Files: src/edit.c, src/normal.c


      *** ../vim-6.2.301/src/edit.c Sun Feb 29 20:46:43 2004
      --- src/edit.c Mon Mar 1 14:47:55 2004
      ***************
      *** 422,431 ****
      }
      #endif
      }
      }
      else
      arrow_used = FALSE;
      - o_eol = FALSE;

      /* we are in insert mode now, don't need to start it anymore */
      need_start_insertmode = FALSE;
      --- 422,431 ----
      }
      #endif
      }
      + o_eol = FALSE;
      }
      else
      arrow_used = FALSE;

      /* we are in insert mode now, don't need to start it anymore */
      need_start_insertmode = FALSE;
      ***************
      *** 779,785 ****
      restart_edit = 'R';
      else
      restart_edit = 'I';
      - o_lnum = curwin->w_cursor.lnum;
      #ifdef FEAT_VIRTUALEDIT
      if (virtual_active())
      o_eol = FALSE; /* cursor always keeps its column */
      --- 779,784 ----
      ***************
      *** 849,854 ****
      --- 848,858 ----
      /*
      * This is the ONLY return from edit()!
      */
      + /* Always update o_lnum, so that a "CTRL-O ." that adds a line
      + * still puts the cursor back after the inserted text. */
      + if (o_eol && gchar_cursor() == NUL)
      + o_lnum = curwin->w_cursor.lnum;
      +
      if (ins_esc(&count, cmdchar))
      return (c == Ctrl_O);
      continue;
      *** ../vim-6.2.301/src/normal.c Sun Feb 29 21:06:13 2004
      --- src/normal.c Mon Mar 1 16:50:17 2004
      ***************
      *** 153,158 ****
      --- 153,159 ----
      static void nv_normal __ARGS((cmdarg_T *cap));
      static void nv_esc __ARGS((cmdarg_T *oap));
      static void nv_edit __ARGS((cmdarg_T *cap));
      + static void invoke_edit __ARGS((cmdarg_T *cap, int repl, int cmd, int startln));
      #ifdef FEAT_TEXTOBJ
      static void nv_object __ARGS((cmdarg_T *cap));
      #endif
      ***************
      *** 1149,1155 ****
      )
      && (clear_cmdline
      || redraw_cmdline)
      ! && msg_didany
      && !msg_nowait
      && KeyTyped)
      || (restart_edit != 0
      --- 1150,1156 ----
      )
      && (clear_cmdline
      || redraw_cmdline)
      ! && (msg_didout || (msg_didany && msg_scroll))
      && !msg_nowait
      && KeyTyped)
      || (restart_edit != 0
      ***************
      *** 6114,6124 ****
      #endif
      stuffcharReadbuff('\r');
      stuffcharReadbuff(ESC);
      ! /*
      ! * Give 'r' to edit(), to get the redo command right.
      ! */
      ! if (edit('r', FALSE, cap->count1))
      ! cap->retval |= CA_COMMAND_BUSY;
      }
      else
      {
      --- 6115,6123 ----
      #endif
      stuffcharReadbuff('\r');
      stuffcharReadbuff(ESC);
      !
      ! /* Give 'r' to edit(), to get the redo command right. */
      ! invoke_edit(cap, TRUE, 'r', FALSE);
      }
      else
      {
      ***************
      *** 6282,6292 ****
      if (virtual_active())
      coladvance(getviscol());
      #endif
      ! /* This is a new edit command, not a restart. We don't edit
      ! * recursively. */
      ! restart_edit = 0;
      ! if (edit(cap->arg ? 'V' : 'R', FALSE, cap->count1))
      ! cap->retval |= CA_COMMAND_BUSY;
      }
      }
      }
      --- 6281,6287 ----
      if (virtual_active())
      coladvance(getviscol());
      #endif
      ! invoke_edit(cap, FALSE, cap->arg ? 'V' : 'R', FALSE);
      }
      }
      }
      ***************
      *** 6299,6306 ****
      nv_vreplace(cap)
      cmdarg_T *cap;
      {
      - int restart_edit_save;
      -
      # ifdef FEAT_VISUAL
      if (VIsual_active)
      {
      --- 6294,6299 ----
      ***************
      *** 6324,6337 ****
      if (virtual_active())
      coladvance(getviscol());
      # endif
      ! /* This is a new edit command, not a restart. Do allow using
      ! * CTRL-O rx from Insert mode. */
      ! restart_edit_save = restart_edit;
      ! restart_edit = 0;
      ! if (edit('v', FALSE, cap->count1))
      ! cap->retval |= CA_COMMAND_BUSY;
      ! if (restart_edit == 0)
      ! restart_edit = restart_edit_save;
      }
      }
      }
      --- 6317,6323 ----
      if (virtual_active())
      coladvance(getviscol());
      # endif
      ! invoke_edit(cap, TRUE, 'v', FALSE);
      }
      }
      }
      ***************
      *** 7205,7217 ****
      case 'I':
      beginline(0);
      if (!checkclearopq(oap))
      ! {
      ! /* This is a new edit command, not a restart. We don't edit
      ! * recursively. */
      ! restart_edit = 0;
      ! if (edit('g', FALSE, cap->count1))
      ! cap->retval |= CA_COMMAND_BUSY;
      ! }
      break;

      #ifdef FEAT_SEARCHPATH
      --- 7198,7204 ----
      case 'I':
      beginline(0);
      if (!checkclearopq(oap))
      ! invoke_edit(cap, FALSE, 'g', FALSE);
      break;

      #ifdef FEAT_SEARCHPATH
      ***************
      *** 7394,7404 ****
      #endif
      0, 0))
      {
      ! /* This is a new edit command, not a restart. We don't edit
      ! * recursively. */
      ! restart_edit = 0;
      ! if (edit(cap->cmdchar, TRUE, cap->count1))
      ! cap->retval |= CA_COMMAND_BUSY;
      }
      }
      }
      --- 7381,7387 ----
      #endif
      0, 0))
      {
      ! invoke_edit(cap, FALSE, cap->cmdchar, TRUE);
      }
      }
      }
      ***************
      *** 7413,7421 ****
      if (!checkclearopq(cap->oap))
      {
      /*
      ! * if restart_edit is TRUE, the last but one command is repeated
      * instead of the last command (inserting text). This is used for
      ! * CTRL-O <.> in insert mode
      */
      if (start_redo(cap->count0, restart_edit != 0 && !arrow_used) == FAIL)
      clearopbeep(cap->oap);
      --- 7396,7404 ----
      if (!checkclearopq(cap->oap))
      {
      /*
      ! * If "restart_edit" is TRUE, the last but one command is repeated
      * instead of the last command (inserting text). This is used for
      ! * CTRL-O <.> in insert mode.
      */
      if (start_redo(cap->count0, restart_edit != 0 && !arrow_used) == FAIL)
      clearopbeep(cap->oap);
      ***************
      *** 7979,7990 ****
      }
      #endif

      ! /* This is a new edit command, not a restart. We don't edit
      ! * recursively. */
      ! restart_edit = 0;
      ! if (edit(cap->cmdchar, FALSE, cap->count1))
      ! cap->retval |= CA_COMMAND_BUSY;
      }
      }

      #ifdef FEAT_TEXTOBJ
      --- 7962,7999 ----
      }
      #endif

      ! invoke_edit(cap, FALSE, cap->cmdchar, FALSE);
      }
      + }
      +
      + /*
      + * Invoke edit() and take care of "restart_edit" and the return value.
      + */
      + static void
      + invoke_edit(cap, repl, cmd, startln)
      + cmdarg_T *cap;
      + int repl; /* "r" or "gr" command */
      + int cmd;
      + int startln;
      + {
      + int restart_edit_save = 0;
      +
      + /* Complicated: When the user types "a<C-O>a" we don't want to do Insert
      + * mode recursively. But when doing "a<C-O>." or "a<C-O>rx" we do allow
      + * it. */
      + if (repl || !stuff_empty())
      + restart_edit_save = restart_edit;
      + else
      + restart_edit_save = 0;
      +
      + /* Always reset "restart_edit", this is not a restarted edit. */
      + restart_edit = 0;
      +
      + if (edit(cmd, startln, cap->count1))
      + cap->retval |= CA_COMMAND_BUSY;
      +
      + if (restart_edit == 0)
      + restart_edit = restart_edit_save;
      }

      #ifdef FEAT_TEXTOBJ
      *** ../vim-6.2.301/src/version.c Mon Mar 1 16:43:34 2004
      --- src/version.c Mon Mar 1 16:46:22 2004
      ***************
      *** 639,640 ****
      --- 639,642 ----
      { /* Add new patch number below this line */
      + /**/
      + 302,
      /**/

      --
      MORTICIAN: Bring out your dead!
      [clang]
      Bring out your dead!
      [clang]
      Bring out your dead!
      CUSTOMER: Here's one -- nine pence.
      DEAD PERSON: I'm not dead!
      The Quest for the Holy Grail (Monty Python)

      /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
      /// Sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
      \\\ Project leader for A-A-P -- http://www.A-A-P.org ///
      \\\ Buy at Amazon and help AIDS victims -- http://ICCF.nl/click1.html ///
    Your message has been successfully submitted and would be delivered to recipients shortly.