1
0
forked from aniani/vim

patch 9.1.0218: Unnecessary multiplications in backspace code

Problem:  Unnecessary multiplications in backspace code, as
          "col / ts * ts" is the same as "col - col % ts".
Solution: Change "col / ts * ts" to "col - col % ts".  Adjust the loop
          and the comments ins_bs() to be easier to understand.  Update
          tests to reset 'smarttab' properly.
          (zeertzjq)

closes: #14308

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq
2024-03-28 10:30:08 +01:00
committed by Christian Brabandt
parent 2ca7d5f483
commit 8ede7a0694
4 changed files with 47 additions and 26 deletions

View File

@@ -4210,12 +4210,11 @@ ins_bs(
&& (!*inserted_space_p
|| arrow_used))))))
{
int ts;
colnr_T vcol = 0;
colnr_T want_vcol;
char_u *line;
char_u *ptr;
char_u *end_ptr;
char_u *cursor_ptr;
char_u *space_ptr;
colnr_T space_vcol = 0;
int prev_space = FALSE;
@@ -4224,11 +4223,13 @@ ins_bs(
*inserted_space_p = FALSE;
space_ptr = ptr = line = ml_get_curline();
end_ptr = line + curwin->w_cursor.col;
cursor_ptr = line + curwin->w_cursor.col;
// Find the last whitespace that is preceded by non-whitespace.
// Compute virtual column of cursor position, and find the last
// whitespace before cursor that is preceded by non-whitespace.
// Use chartabsize() so that virtual text and wrapping are ignored.
do {
while (ptr < cursor_ptr)
{
int cur_space = VIM_ISWHITE(*ptr);
if (!prev_space && cur_space)
@@ -4239,25 +4240,18 @@ ins_bs(
vcol += chartabsize(ptr, vcol);
MB_PTR_ADV(ptr);
prev_space = cur_space;
} while (ptr < end_ptr);
}
// Compute the virtual column where we want to be.
want_vcol = vcol - 1;
#ifdef FEAT_VARTABS
want_vcol = vcol > 0 ? vcol - 1 : 0;
if (p_sta && in_indent)
{
ts = (int)get_sw_value(curbuf);
want_vcol = (want_vcol / ts) * ts;
}
want_vcol -= want_vcol % (int)get_sw_value(curbuf);
else
#ifdef FEAT_VARTABS
want_vcol = tabstop_start(want_vcol, get_sts_value(),
curbuf->b_p_vsts_array);
#else
if (p_sta && in_indent)
ts = (int)get_sw_value(curbuf);
else
ts = (int)get_sts_value();
want_vcol = (want_vcol / ts) * ts;
want_vcol -= want_vcol % (int)get_sts_value();
#endif
// Find the position to stop backspacing.