# HG changeset patch # User Bram Moolenaar # Date 1427215791 -3600 # Node ID c939d19bd86edd083bd690e2b6e1315877b098d7 # Parent 746596b122c8293feb32dcd301895283dfc74515 updated for version 7.4.680 Problem: CTRL-W in Insert mode does not work well for multi-byte characters. Solution: Use mb_get_class(). (Yasuhiro Matsumoto) diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -9047,72 +9047,94 @@ ins_bs(c, mode, inserted_space_p) /* * Delete upto starting point, start of line or previous word. */ - else do - { -#ifdef FEAT_RIGHTLEFT - if (!revins_on) /* put cursor on char to be deleted */ -#endif - 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)) + 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) -#endif - inc_cursor(); -#ifdef FEAT_RIGHTLEFT - else if (State & REPLACE_FLAG) + if (!revins_on) /* put cursor on char to be deleted */ +#endif dec_cursor(); -#endif - break; - } - if (State & REPLACE_FLAG) - replace_do_bs(-1); - else - { + + 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 - if (enc_utf8 && p_deco) - (void)utfc_ptr2char(ml_get_cursor(), cpc); -#endif - (void)del_char(FALSE); + || prev_cclass != cclass +#endif + )) + { +#ifdef FEAT_RIGHTLEFT + if (!revins_on) +#endif + inc_cursor(); +#ifdef FEAT_RIGHTLEFT + else if (State & REPLACE_FLAG) + dec_cursor(); +#endif + break; + } + if (State & REPLACE_FLAG) + replace_do_bs(-1); + else + { #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 (enc_utf8 && p_deco) + (void)utfc_ptr2char(ml_get_cursor(), cpc); +#endif + (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(); #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 || -#endif - (curwin->w_cursor.col > mincol - && (curwin->w_cursor.lnum != Insstart_orig.lnum - || curwin->w_cursor.col != Insstart_orig.col))); + revins_on || +#endif + (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 diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak --- a/src/testdir/Make_amiga.mak +++ b/src/testdir/Make_amiga.mak @@ -43,6 +43,7 @@ SCRIPTS = test1.out test3.out test4.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.i 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 diff --git a/src/testdir/Make_dos.mak b/src/testdir/Make_dos.mak --- a/src/testdir/Make_dos.mak +++ b/src/testdir/Make_dos.mak @@ -42,6 +42,7 @@ SCRIPTS = 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 \ diff --git a/src/testdir/Make_ming.mak b/src/testdir/Make_ming.mak --- a/src/testdir/Make_ming.mak +++ b/src/testdir/Make_ming.mak @@ -64,6 +64,7 @@ SCRIPTS = 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 \ diff --git a/src/testdir/Make_os2.mak b/src/testdir/Make_os2.mak --- a/src/testdir/Make_os2.mak +++ b/src/testdir/Make_os2.mak @@ -44,6 +44,7 @@ SCRIPTS = test1.out test3.out test4.out test_changelist.out \ test_close_count.out \ test_command_count.out \ + test_erasebackword.out \ test_eval.out \ test_insertcount.out \ test_listlbr.out \ diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms --- a/src/testdir/Make_vms.mms +++ b/src/testdir/Make_vms.mms @@ -4,7 +4,7 @@ # Authors: Zoltan Arpadffy, # Sandor Kopanyi, # -# 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 test_changelist.out \ test_close_count.out \ test_command_count.out \ + test_erasebackword.out \ test_eval.out \ test_insertcount.out \ test_listlbr.out \ diff --git a/src/testdir/Makefile b/src/testdir/Makefile --- a/src/testdir/Makefile +++ b/src/testdir/Makefile @@ -40,6 +40,7 @@ SCRIPTS = test1.out test2.out test3.out test_changelist.out \ test_close_count.out \ test_command_count.out \ + test_erasebackword.out \ test_eval.out \ test_insertcount.out \ test_listlbr.out \ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 680, +/**/ 679, /**/ 678,