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)
This commit is contained in:
132
src/edit.c
132
src/edit.c
@ -9047,72 +9047,94 @@ ins_bs(c, mode, inserted_space_p)
|
|||||||
/*
|
/*
|
||||||
* Delete upto starting point, start of line or previous word.
|
* Delete upto starting point, start of line or previous word.
|
||||||
*/
|
*/
|
||||||
else do
|
else
|
||||||
{
|
{
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_MBYTE
|
||||||
if (!revins_on) /* put cursor on char to be deleted */
|
int cclass = 0, prev_cclass = 0;
|
||||||
#endif
|
|
||||||
dec_cursor();
|
|
||||||
|
|
||||||
/* start of word? */
|
if (has_mbyte)
|
||||||
if (mode == BACKSPACE_WORD && !vim_isspace(gchar_cursor()))
|
cclass = mb_get_class(ml_get_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))
|
|
||||||
{
|
|
||||||
#ifdef FEAT_RIGHTLEFT
|
|
||||||
if (!revins_on)
|
|
||||||
#endif
|
#endif
|
||||||
inc_cursor();
|
do
|
||||||
|
{
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
else if (State & REPLACE_FLAG)
|
if (!revins_on) /* put cursor on char to be deleted */
|
||||||
|
#endif
|
||||||
dec_cursor();
|
dec_cursor();
|
||||||
#endif
|
|
||||||
break;
|
cc = gchar_cursor();
|
||||||
}
|
|
||||||
if (State & REPLACE_FLAG)
|
|
||||||
replace_do_bs(-1);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
if (enc_utf8 && p_deco)
|
/* look multi-byte character class */
|
||||||
(void)utfc_ptr2char(ml_get_cursor(), cpc);
|
if (has_mbyte)
|
||||||
#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--;
|
prev_cclass = cclass;
|
||||||
revins_legal++;
|
cclass = mb_get_class(ml_get_cursor());
|
||||||
}
|
}
|
||||||
if (revins_on && gchar_cursor() == NUL)
|
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
/* Just a single backspace?: */
|
/* start of word? */
|
||||||
if (mode == BACKSPACE_CHAR)
|
if (mode == BACKSPACE_WORD && !vim_isspace(cc))
|
||||||
break;
|
{
|
||||||
} while (
|
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
|
#ifdef FEAT_RIGHTLEFT
|
||||||
revins_on ||
|
if (!revins_on)
|
||||||
#endif
|
#endif
|
||||||
(curwin->w_cursor.col > mincol
|
inc_cursor();
|
||||||
&& (curwin->w_cursor.lnum != Insstart_orig.lnum
|
#ifdef FEAT_RIGHTLEFT
|
||||||
|| curwin->w_cursor.col != Insstart_orig.col)));
|
else if (State & REPLACE_FLAG)
|
||||||
|
dec_cursor();
|
||||||
|
#endif
|
||||||
|
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);
|
||||||
|
#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_on && gchar_cursor() == NUL)
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/* Just a single backspace?: */
|
||||||
|
if (mode == BACKSPACE_CHAR)
|
||||||
|
break;
|
||||||
|
} 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)));
|
||||||
|
}
|
||||||
did_backspace = TRUE;
|
did_backspace = TRUE;
|
||||||
}
|
}
|
||||||
#ifdef FEAT_SMARTINDENT
|
#ifdef FEAT_SMARTINDENT
|
||||||
|
|||||||
@ -43,6 +43,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
|
|||||||
test_changelist.out \
|
test_changelist.out \
|
||||||
test_close_count.out \
|
test_close_count.out \
|
||||||
test_command_count.out \
|
test_command_count.out \
|
||||||
|
test_erasebackword.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_insertcount.out \
|
test_insertcount.out \
|
||||||
test_listlbr.out \
|
test_listlbr.out \
|
||||||
@ -185,6 +186,7 @@ test_breakindent.out: test_breakindent.in
|
|||||||
test_changelist.out: test_changelist.in
|
test_changelist.out: test_changelist.in
|
||||||
test_close_count.out: test_close_count.in
|
test_close_count.out: test_close_count.in
|
||||||
test_command_count.out: test_command_count.in
|
test_command_count.out: test_command_count.in
|
||||||
|
test_erasebackword.out: test_erasebackword.in
|
||||||
test_eval.out: test_eval.in
|
test_eval.out: test_eval.in
|
||||||
test_insertcount.out: test_insertcount.in
|
test_insertcount.out: test_insertcount.in
|
||||||
test_listlbr.out: test_listlbr.in
|
test_listlbr.out: test_listlbr.in
|
||||||
|
|||||||
@ -42,6 +42,7 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
|
|||||||
test_changelist.out \
|
test_changelist.out \
|
||||||
test_close_count.out \
|
test_close_count.out \
|
||||||
test_command_count.out \
|
test_command_count.out \
|
||||||
|
test_erasebackword.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_insertcount.out \
|
test_insertcount.out \
|
||||||
test_listlbr.out \
|
test_listlbr.out \
|
||||||
|
|||||||
@ -64,6 +64,7 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
|
|||||||
test_changelist.out \
|
test_changelist.out \
|
||||||
test_close_count.out \
|
test_close_count.out \
|
||||||
test_command_count.out \
|
test_command_count.out \
|
||||||
|
test_erasebackword.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_insertcount.out \
|
test_insertcount.out \
|
||||||
test_listlbr.out \
|
test_listlbr.out \
|
||||||
|
|||||||
@ -44,6 +44,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
|
|||||||
test_changelist.out \
|
test_changelist.out \
|
||||||
test_close_count.out \
|
test_close_count.out \
|
||||||
test_command_count.out \
|
test_command_count.out \
|
||||||
|
test_erasebackword.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_insertcount.out \
|
test_insertcount.out \
|
||||||
test_listlbr.out \
|
test_listlbr.out \
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
# Authors: Zoltan Arpadffy, <arpadffy@polarhome.com>
|
# Authors: Zoltan Arpadffy, <arpadffy@polarhome.com>
|
||||||
# Sandor Kopanyi, <sandor.kopanyi@mailbox.hu>
|
# 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.
|
# 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.
|
# 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_changelist.out \
|
||||||
test_close_count.out \
|
test_close_count.out \
|
||||||
test_command_count.out \
|
test_command_count.out \
|
||||||
|
test_erasebackword.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_insertcount.out \
|
test_insertcount.out \
|
||||||
test_listlbr.out \
|
test_listlbr.out \
|
||||||
|
|||||||
@ -40,6 +40,7 @@ SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
|
|||||||
test_changelist.out \
|
test_changelist.out \
|
||||||
test_close_count.out \
|
test_close_count.out \
|
||||||
test_command_count.out \
|
test_command_count.out \
|
||||||
|
test_erasebackword.out \
|
||||||
test_eval.out \
|
test_eval.out \
|
||||||
test_insertcount.out \
|
test_insertcount.out \
|
||||||
test_listlbr.out \
|
test_listlbr.out \
|
||||||
|
|||||||
@ -741,6 +741,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
680,
|
||||||
/**/
|
/**/
|
||||||
679,
|
679,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user