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

Patch 7.2.266

Expand Messages
  • Bram Moolenaar
    Patch 7.2.266 Problem: When an expression abbreviation is triggered, the typed character is unknown. Solution: Make the typed character available in
    Message 1 of 1 , Sep 30, 2009
    • 0 Attachment
      Patch 7.2.266
      Problem: When an expression abbreviation is triggered, the typed character
      is unknown.
      Solution: Make the typed character available in v:char.
      Files: runtime/doc/map.txt, src/eval.c, src/getchar.c, src/ops.c,
      src/proto/eval.pro


      *** ../vim-7.2.265/runtime/doc/map.txt 2008-08-09 19:36:49.000000000 +0200
      --- runtime/doc/map.txt 2009-09-23 19:39:19.000000000 +0200
      ***************
      *** 224,229 ****
      --- 224,233 ----
      The result of the InsertDot() function will be inserted. It could check the
      text before the cursor and start omni completion when some condition is met.

      + For abbreviations |v:char| is set to the character that was typed to trigger
      + the abbreviation. You can use this to decide how to expand the {lhs}. You
      + can't change v:char and you should not insert it.
      +
      Be very careful about side effects! The expression is evaluated while
      obtaining characters, you may very well make the command dysfunctional.
      For this reason the following is blocked:
      *** ../vim-7.2.265/src/eval.c 2009-06-03 14:25:47.000000000 +0200
      --- src/eval.c 2009-09-23 19:36:32.000000000 +0200
      ***************
      *** 18101,18106 ****
      --- 18101,18131 ----
      }

      /*
      + * Set v:char to character "c".
      + */
      + void
      + set_vim_var_char(c)
      + int c;
      + {
      + #ifdef FEAT_MBYTE
      + char_u buf[MB_MAXBYTES];
      + #else
      + char_u buf[2];
      + #endif
      +
      + #ifdef FEAT_MBYTE
      + if (has_mbyte)
      + buf[(*mb_char2bytes)(c, buf)] = NUL;
      + else
      + #endif
      + {
      + buf[0] = c;
      + buf[1] = NUL;
      + }
      + set_vim_var_string(VV_CHAR, buf, -1);
      + }
      +
      + /*
      * Set v:count to "count" and v:count1 to "count1".
      * When "set_prevcount" is TRUE first set v:prevcount from v:count.
      */
      *** ../vim-7.2.265/src/getchar.c 2009-07-14 13:44:43.000000000 +0200
      --- src/getchar.c 2009-09-23 19:35:54.000000000 +0200
      ***************
      *** 129,135 ****
      static void validate_maphash __ARGS((void));
      static void showmap __ARGS((mapblock_T *mp, int local));
      #ifdef FEAT_EVAL
      ! static char_u *eval_map_expr __ARGS((char_u *str));
      #endif

      /*
      --- 129,135 ----
      static void validate_maphash __ARGS((void));
      static void showmap __ARGS((mapblock_T *mp, int local));
      #ifdef FEAT_EVAL
      ! static char_u *eval_map_expr __ARGS((char_u *str, int c));
      #endif

      /*
      ***************
      *** 2446,2452 ****
      if (tabuf.typebuf_valid)
      {
      vgetc_busy = 0;
      ! s = eval_map_expr(mp->m_str);
      vgetc_busy = save_vgetc_busy;
      }
      else
      --- 2446,2452 ----
      if (tabuf.typebuf_valid)
      {
      vgetc_busy = 0;
      ! s = eval_map_expr(mp->m_str, NUL);
      vgetc_busy = save_vgetc_busy;
      }
      else
      ***************
      *** 4367,4375 ****
      * abbreviation, but is not inserted into the input stream.
      */
      j = 0;
      - /* special key code, split up */
      if (c != Ctrl_RSB)
      {
      if (IS_SPECIAL(c) || c == K_SPECIAL)
      {
      tb[j++] = K_SPECIAL;
      --- 4367,4375 ----
      * abbreviation, but is not inserted into the input stream.
      */
      j = 0;
      if (c != Ctrl_RSB)
      {
      + /* special key code, split up */
      if (IS_SPECIAL(c) || c == K_SPECIAL)
      {
      tb[j++] = K_SPECIAL;
      ***************
      *** 4398,4404 ****
      }
      #ifdef FEAT_EVAL
      if (mp->m_expr)
      ! s = eval_map_expr(mp->m_str);
      else
      #endif
      s = mp->m_str;
      --- 4398,4404 ----
      }
      #ifdef FEAT_EVAL
      if (mp->m_expr)
      ! s = eval_map_expr(mp->m_str, c);
      else
      #endif
      s = mp->m_str;
      ***************
      *** 4434,4441 ****
      * special characters.
      */
      static char_u *
      ! eval_map_expr(str)
      char_u *str;
      {
      char_u *res;
      char_u *p;
      --- 4434,4442 ----
      * special characters.
      */
      static char_u *
      ! eval_map_expr(str, c)
      char_u *str;
      + int c; /* NUL or typed character for abbreviation */
      {
      char_u *res;
      char_u *p;
      ***************
      *** 4452,4457 ****
      --- 4453,4459 ----
      #ifdef FEAT_EX_EXTRA
      ++ex_normal_lock;
      #endif
      + set_vim_var_char(c); /* set v:char to the typed character */
      save_cursor = curwin->w_cursor;
      p = eval_to_string(str, NULL, FALSE);
      --textlock;
      *** ../vim-7.2.265/src/ops.c 2009-07-01 18:04:30.000000000 +0200
      --- src/ops.c 2009-09-23 19:11:40.000000000 +0200
      ***************
      *** 4473,4483 ****
      int use_sandbox = was_set_insecurely((char_u *)"formatexpr",
      OPT_LOCAL);
      int r;
      - #ifdef FEAT_MBYTE
      - char_u buf[MB_MAXBYTES];
      - #else
      - char_u buf[2];
      - #endif

      /*
      * Set v:lnum to the first line number and v:count to the number of lines.
      --- 4473,4478 ----
      ***************
      *** 4485,4501 ****
      */
      set_vim_var_nr(VV_LNUM, lnum);
      set_vim_var_nr(VV_COUNT, count);
      !
      ! #ifdef FEAT_MBYTE
      ! if (has_mbyte)
      ! buf[(*mb_char2bytes)(c, buf)] = NUL;
      ! else
      ! #endif
      ! {
      ! buf[0] = c;
      ! buf[1] = NUL;
      ! }
      ! set_vim_var_string(VV_CHAR, buf, -1);

      /*
      * Evaluate the function.
      --- 4480,4486 ----
      */
      set_vim_var_nr(VV_LNUM, lnum);
      set_vim_var_nr(VV_COUNT, count);
      ! set_vim_var_char(c);

      /*
      * Evaluate the function.
      *** ../vim-7.2.265/src/proto/eval.pro 2008-11-20 16:11:03.000000000 +0100
      --- src/proto/eval.pro 2009-09-23 19:36:30.000000000 +0200
      ***************
      *** 61,66 ****
      --- 61,67 ----
      long get_vim_var_nr __ARGS((int idx));
      char_u *get_vim_var_str __ARGS((int idx));
      list_T *get_vim_var_list __ARGS((int idx));
      + void set_vim_var_char __ARGS((int c));
      void set_vcount __ARGS((long count, long count1, int set_prevcount));
      void set_vim_var_string __ARGS((int idx, char_u *val, int len));
      void set_vim_var_list __ARGS((int idx, list_T *val));
      *** ../vim-7.2.265/src/version.c 2009-09-30 13:23:57.000000000 +0200
      --- src/version.c 2009-09-30 15:11:29.000000000 +0200
      ***************
      *** 678,679 ****
      --- 678,681 ----
      { /* Add new patch number below this line */
      + /**/
      + 266,
      /**/

      --
      Life would be so much easier if we could just look at the source code.

      /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
      /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
      \\\ download, build and distribute -- http://www.A-A-P.org ///
      \\\ help me help AIDS victims -- http://ICCF-Holland.org ///

      --~--~---------~--~----~------------~-------~--~----~
      You received this message from the "vim_dev" maillist.
      For more information, visit http://www.vim.org/maillist.php
      -~----------~----~----~----~------~----~------~--~---
    Your message has been successfully submitted and would be delivered to recipients shortly.