]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.680 v7.4.680
authorBram Moolenaar <Bram@vim.org>
Tue, 24 Mar 2015 16:49:51 +0000 (17:49 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 24 Mar 2015 16:49:51 +0000 (17:49 +0100)
Problem:    CTRL-W in Insert mode does not work well for multi-byte
            characters.
Solution:   Use mb_get_class(). (Yasuhiro Matsumoto)

src/edit.c
src/testdir/Make_amiga.mak
src/testdir/Make_dos.mak
src/testdir/Make_ming.mak
src/testdir/Make_os2.mak
src/testdir/Make_vms.mms
src/testdir/Makefile
src/version.c

index 9f7f1d6a284612627aa6d9408fcc492d9c60ba79..75fe691724b246497430736abe8d1bc02f0de2b9 100644 (file)
@@ -9047,72 +9047,94 @@ ins_bs(c, mode, inserted_space_p)
        /*
         * Delete upto starting point, start of line or previous word.
         */
-       else do
+       else
        {
+#ifdef FEAT_MBYTE
+           int cclass = 0, prev_cclass = 0;
+
+           if (has_mbyte)
+               cclass = mb_get_class(ml_get_cursor());
+#endif
+           do
+           {
 #ifdef FEAT_RIGHTLEFT
-           if (!revins_on) /* put cursor on char to be deleted */
+               if (!revins_on) /* put cursor on char to be deleted */
 #endif
-               dec_cursor();
+                   dec_cursor();
 
-           /* start of word? */
-           if (mode == BACKSPACE_WORD && !vim_isspace(gchar_cursor()))
-           {
-               mode = BACKSPACE_WORD_NOT_SPACE;
-               temp = vim_iswordc(gchar_cursor());
-           }
-           /* end of word? */
-           else if (mode == BACKSPACE_WORD_NOT_SPACE
-                   && (vim_isspace(cc = gchar_cursor())
-                           || vim_iswordc(cc) != temp))
-           {
+               cc = gchar_cursor();
+#ifdef FEAT_MBYTE
+               /* look multi-byte character class */
+               if (has_mbyte)
+               {
+                   prev_cclass = cclass;
+                   cclass = mb_get_class(ml_get_cursor());
+               }
+#endif
+
+               /* start of word? */
+               if (mode == BACKSPACE_WORD && !vim_isspace(cc))
+               {
+                   mode = BACKSPACE_WORD_NOT_SPACE;
+                   temp = vim_iswordc(cc);
+               }
+               /* end of word? */
+               else if (mode == BACKSPACE_WORD_NOT_SPACE
+                       && ((vim_isspace(cc) || vim_iswordc(cc) != temp)
+#ifdef FEAT_MBYTE
+                       || prev_cclass != cclass
+#endif
+                       ))
+               {
 #ifdef FEAT_RIGHTLEFT
-               if (!revins_on)
+                   if (!revins_on)
 #endif
-                   inc_cursor();
+                       inc_cursor();
 #ifdef FEAT_RIGHTLEFT
-               else if (State & REPLACE_FLAG)
-                   dec_cursor();
+                   else if (State & REPLACE_FLAG)
+                       dec_cursor();
 #endif
-               break;
-           }
-           if (State & REPLACE_FLAG)
-               replace_do_bs(-1);
-           else
-           {
+                   break;
+               }
+               if (State & REPLACE_FLAG)
+                   replace_do_bs(-1);
+               else
+               {
 #ifdef FEAT_MBYTE
-               if (enc_utf8 && p_deco)
-                   (void)utfc_ptr2char(ml_get_cursor(), cpc);
+                   if (enc_utf8 && p_deco)
+                       (void)utfc_ptr2char(ml_get_cursor(), cpc);
 #endif
-               (void)del_char(FALSE);
+                   (void)del_char(FALSE);
 #ifdef FEAT_MBYTE
-               /*
-                * If there are combining characters and 'delcombine' is set
-                * move the cursor back.  Don't back up before the base
-                * character.
-                */
-               if (enc_utf8 && p_deco && cpc[0] != NUL)
-                   inc_cursor();
+                   /*
+                    * If there are combining characters and 'delcombine' is set
+                    * move the cursor back.  Don't back up before the base
+                    * character.
+                    */
+                   if (enc_utf8 && p_deco && cpc[0] != NUL)
+                       inc_cursor();
 #endif
 #ifdef FEAT_RIGHTLEFT
-               if (revins_chars)
-               {
-                   revins_chars--;
-                   revins_legal++;
+                   if (revins_chars)
+                   {
+                       revins_chars--;
+                       revins_legal++;
+                   }
+                   if (revins_on && gchar_cursor() == NUL)
+                       break;
+#endif
                }
-               if (revins_on && gchar_cursor() == NUL)
+               /* Just a single backspace?: */
+               if (mode == BACKSPACE_CHAR)
                    break;
-#endif
-           }
-           /* Just a single backspace?: */
-           if (mode == BACKSPACE_CHAR)
-               break;
-       } while (
+           } while (
 #ifdef FEAT_RIGHTLEFT
-               revins_on ||
+                   revins_on ||
 #endif
-               (curwin->w_cursor.col > mincol
-                && (curwin->w_cursor.lnum != Insstart_orig.lnum
-                    || curwin->w_cursor.col != Insstart_orig.col)));
+                   (curwin->w_cursor.col > mincol
+                   && (curwin->w_cursor.lnum != Insstart_orig.lnum
+                       || curwin->w_cursor.col != Insstart_orig.col)));
+       }
        did_backspace = TRUE;
     }
 #ifdef FEAT_SMARTINDENT
index cc4af8934bcf91ba41e6e7398d08a8f9d1ef52ec..a9a6fa63e70d8c9f3365188877c2ad00b5be9098 100644 (file)
@@ -43,6 +43,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
                test_changelist.out \
                test_close_count.out \
                test_command_count.out \
+               test_erasebackword.out \
                test_eval.out \
                test_insertcount.out \
                test_listlbr.out \
@@ -185,6 +186,7 @@ test_breakindent.out: test_breakindent.in
 test_changelist.out: test_changelist.in
 test_close_count.out: test_close_count.in
 test_command_count.out: test_command_count.in
+test_erasebackword.out: test_erasebackword.in
 test_eval.out: test_eval.in
 test_insertcount.out: test_insertcount.in
 test_listlbr.out: test_listlbr.in
index fcd81b54dfa22def4ffa39a9bf9aa0bbd0108b69..e11027756609d2c91dc5a2d64bee3f6c8e30459f 100644 (file)
@@ -42,6 +42,7 @@ SCRIPTS =     test3.out test4.out test5.out test6.out test7.out \
                test_changelist.out \
                test_close_count.out \
                test_command_count.out \
+               test_erasebackword.out \
                test_eval.out \
                test_insertcount.out \
                test_listlbr.out \
index 3e6a50fb415203e07ec98d1254801e76dd0e56a6..4ec49d505f8342000377fd7b20661c879b55c5f6 100644 (file)
@@ -64,6 +64,7 @@ SCRIPTS =     test3.out test4.out test5.out test6.out test7.out \
                test_changelist.out \
                test_close_count.out \
                test_command_count.out \
+               test_erasebackword.out \
                test_eval.out \
                test_insertcount.out \
                test_listlbr.out \
index 31023ea85e80494c3f61cdddda959be715a46d59..7cdfcb105f72b22e5fb1d24990143d1b1c3fc4b1 100644 (file)
@@ -44,6 +44,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
                test_changelist.out \
                test_close_count.out \
                test_command_count.out \
+               test_erasebackword.out \
                test_eval.out \
                test_insertcount.out \
                test_listlbr.out \
index 7448d724fc50aa88d4f91d67b63aadebd2b2c84f..496f8228ae12cd8094f3ac44dd8e217f4a517966 100644 (file)
@@ -4,7 +4,7 @@
 # Authors:     Zoltan Arpadffy, <arpadffy@polarhome.com>
 #              Sandor Kopanyi,  <sandor.kopanyi@mailbox.hu>
 #
-# Last change:  2015 Mar 13
+# Last change:  2015 Mar 24
 #
 # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
 # Edit the lines in the Configuration section below to select.
@@ -103,6 +103,7 @@ SCRIPT = test1.out  test2.out  test3.out  test4.out  test5.out  \
         test_changelist.out \
         test_close_count.out \
         test_command_count.out \
+        test_erasebackword.out \
         test_eval.out \
         test_insertcount.out \
         test_listlbr.out \
index 966183686e588fe1061fc88deb21241f789d0e70..bc094e1763654fc7d7f3febb4aa8e956486c9a99 100644 (file)
@@ -40,6 +40,7 @@ SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
                test_changelist.out \
                test_close_count.out \
                test_command_count.out \
+               test_erasebackword.out \
                test_eval.out \
                test_insertcount.out \
                test_listlbr.out \
index a43522eee6676f165c61f5f259673ff1985f1a30..b08c010fa38051461786d707c8405e1cec41ce73 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    680,
 /**/
     679,
 /**/