mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge #8863 'refactor: Remove mb_head_off()'
This commit is contained in:
commit
461d46d8ac
@ -1962,12 +1962,10 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_mbyte) {
|
// Move back to first byte of character in both lines (may
|
||||||
// Move back to first byte of character in both lines (may
|
// have "nn^" in line_org and "n^ in line_new).
|
||||||
// have "nn^" in line_org and "n^ in line_new).
|
si_org -= utf_head_off(line_org, line_org + si_org);
|
||||||
si_org -= (*mb_head_off)(line_org, line_org + si_org);
|
si_new -= utf_head_off(line_new, line_new + si_new);
|
||||||
si_new -= (*mb_head_off)(line_new, line_new + si_new);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*startp > si_org) {
|
if (*startp > si_org) {
|
||||||
*startp = si_org;
|
*startp = si_org;
|
||||||
|
@ -1556,14 +1556,11 @@ void display_dollar(colnr_T col)
|
|||||||
|
|
||||||
save_col = curwin->w_cursor.col;
|
save_col = curwin->w_cursor.col;
|
||||||
curwin->w_cursor.col = col;
|
curwin->w_cursor.col = col;
|
||||||
if (has_mbyte) {
|
|
||||||
char_u *p;
|
|
||||||
|
|
||||||
/* If on the last byte of a multi-byte move to the first byte. */
|
// If on the last byte of a multi-byte move to the first byte.
|
||||||
p = get_cursor_line_ptr();
|
char_u *p = get_cursor_line_ptr();
|
||||||
curwin->w_cursor.col -= (*mb_head_off)(p, p + col);
|
curwin->w_cursor.col -= utf_head_off(p, p + col);
|
||||||
}
|
curs_columns(false); // Recompute w_wrow and w_wcol
|
||||||
curs_columns(FALSE); /* recompute w_wrow and w_wcol */
|
|
||||||
if (curwin->w_wcol < curwin->w_width) {
|
if (curwin->w_wcol < curwin->w_width) {
|
||||||
edit_putchar('$', FALSE);
|
edit_putchar('$', FALSE);
|
||||||
dollar_vcol = curwin->w_virtcol;
|
dollar_vcol = curwin->w_virtcol;
|
||||||
@ -3448,10 +3445,10 @@ static void ins_compl_fixRedoBufForLeader(char_u *ptr_arg)
|
|||||||
}
|
}
|
||||||
if (compl_orig_text != NULL) {
|
if (compl_orig_text != NULL) {
|
||||||
p = compl_orig_text;
|
p = compl_orig_text;
|
||||||
for (len = 0; p[len] != NUL && p[len] == ptr[len]; ++len)
|
for (len = 0; p[len] != NUL && p[len] == ptr[len]; len++) {}
|
||||||
;
|
if (len > 0) {
|
||||||
if (len > 0)
|
len -= utf_head_off(p, p + len);
|
||||||
len -= (*mb_head_off)(p, p + len);
|
}
|
||||||
for (p += len; *p != NUL; MB_PTR_ADV(p)) {
|
for (p += len; *p != NUL; MB_PTR_ADV(p)) {
|
||||||
AppendCharToRedobuff(K_BS);
|
AppendCharToRedobuff(K_BS);
|
||||||
}
|
}
|
||||||
@ -4587,24 +4584,17 @@ static int ins_complete(int c, bool enable_pum)
|
|||||||
compl_col += curs_col;
|
compl_col += curs_col;
|
||||||
compl_length = 0;
|
compl_length = 0;
|
||||||
} else {
|
} else {
|
||||||
/* Search the point of change class of multibyte character
|
// Search the point of change class of multibyte character
|
||||||
* or not a word single byte character backward. */
|
// or not a word single byte character backward.
|
||||||
if (has_mbyte) {
|
startcol -= utf_head_off(line, line + startcol);
|
||||||
int base_class;
|
int base_class = mb_get_class(line + startcol);
|
||||||
int head_off;
|
while (--startcol >= 0) {
|
||||||
|
int head_off = utf_head_off(line, line + startcol);
|
||||||
startcol -= (*mb_head_off)(line, line + startcol);
|
if (base_class != mb_get_class(line + startcol - head_off)) {
|
||||||
base_class = mb_get_class(line + startcol);
|
break;
|
||||||
while (--startcol >= 0) {
|
|
||||||
head_off = (*mb_head_off)(line, line + startcol);
|
|
||||||
if (base_class != mb_get_class(line + startcol
|
|
||||||
- head_off))
|
|
||||||
break;
|
|
||||||
startcol -= head_off;
|
|
||||||
}
|
}
|
||||||
} else
|
startcol -= head_off;
|
||||||
while (--startcol >= 0 && vim_iswordc(line[startcol]))
|
}
|
||||||
;
|
|
||||||
compl_col += ++startcol;
|
compl_col += ++startcol;
|
||||||
compl_length = (int)curs_col - startcol;
|
compl_length = (int)curs_col - startcol;
|
||||||
if (compl_length == 1) {
|
if (compl_length == 1) {
|
||||||
|
@ -722,9 +722,7 @@ static int command_line_execute(VimState *state, int key)
|
|||||||
s->j = ccline.cmdpos;
|
s->j = ccline.cmdpos;
|
||||||
s->i = (int)(s->xpc.xp_pattern - ccline.cmdbuff);
|
s->i = (int)(s->xpc.xp_pattern - ccline.cmdbuff);
|
||||||
while (--s->j > s->i) {
|
while (--s->j > s->i) {
|
||||||
if (has_mbyte) {
|
s->j -= utf_head_off(ccline.cmdbuff, ccline.cmdbuff + s->j);
|
||||||
s->j -= (*mb_head_off)(ccline.cmdbuff, ccline.cmdbuff + s->j);
|
|
||||||
}
|
|
||||||
if (vim_ispathsep(ccline.cmdbuff[s->j])) {
|
if (vim_ispathsep(ccline.cmdbuff[s->j])) {
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
@ -744,9 +742,7 @@ static int command_line_execute(VimState *state, int key)
|
|||||||
s->j = ccline.cmdpos - 1;
|
s->j = ccline.cmdpos - 1;
|
||||||
s->i = (int)(s->xpc.xp_pattern - ccline.cmdbuff);
|
s->i = (int)(s->xpc.xp_pattern - ccline.cmdbuff);
|
||||||
while (--s->j > s->i) {
|
while (--s->j > s->i) {
|
||||||
if (has_mbyte) {
|
s->j -= utf_head_off(ccline.cmdbuff, ccline.cmdbuff + s->j);
|
||||||
s->j -= (*mb_head_off)(ccline.cmdbuff, ccline.cmdbuff + s->j);
|
|
||||||
}
|
|
||||||
if (vim_ispathsep(ccline.cmdbuff[s->j])
|
if (vim_ispathsep(ccline.cmdbuff[s->j])
|
||||||
#ifdef BACKSLASH_IN_FILENAME
|
#ifdef BACKSLASH_IN_FILENAME
|
||||||
&& vim_strchr((const char_u *)" *?[{`$%#", ccline.cmdbuff[s->j + 1])
|
&& vim_strchr((const char_u *)" *?[{`$%#", ccline.cmdbuff[s->j + 1])
|
||||||
@ -1432,20 +1428,17 @@ static int command_line_handle_key(CommandLineState *s)
|
|||||||
return command_line_not_changed(s);
|
return command_line_not_changed(s);
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
--ccline.cmdpos;
|
ccline.cmdpos--;
|
||||||
if (has_mbyte) { // move to first byte of char
|
// Move to first byte of possibly multibyte char.
|
||||||
ccline.cmdpos -= (*mb_head_off)(ccline.cmdbuff,
|
ccline.cmdpos -= utf_head_off(ccline.cmdbuff,
|
||||||
ccline.cmdbuff + ccline.cmdpos);
|
ccline.cmdbuff + ccline.cmdpos);
|
||||||
}
|
|
||||||
ccline.cmdspos -= cmdline_charsize(ccline.cmdpos);
|
ccline.cmdspos -= cmdline_charsize(ccline.cmdpos);
|
||||||
} while (ccline.cmdpos > 0
|
} while (ccline.cmdpos > 0
|
||||||
&& (s->c == K_S_LEFT || s->c == K_C_LEFT
|
&& (s->c == K_S_LEFT || s->c == K_C_LEFT
|
||||||
|| (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL)))
|
|| (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL)))
|
||||||
&& ccline.cmdbuff[ccline.cmdpos - 1] != ' ');
|
&& ccline.cmdbuff[ccline.cmdpos - 1] != ' ');
|
||||||
|
|
||||||
if (has_mbyte) {
|
set_cmdspos_cursor();
|
||||||
set_cmdspos_cursor();
|
|
||||||
}
|
|
||||||
|
|
||||||
return command_line_not_changed(s);
|
return command_line_not_changed(s);
|
||||||
|
|
||||||
@ -2271,14 +2264,10 @@ getexmodeline (
|
|||||||
|
|
||||||
if (c1 == BS || c1 == K_BS || c1 == DEL || c1 == K_DEL || c1 == K_KDEL) {
|
if (c1 == BS || c1 == K_BS || c1 == DEL || c1 == K_DEL || c1 == K_KDEL) {
|
||||||
if (!GA_EMPTY(&line_ga)) {
|
if (!GA_EMPTY(&line_ga)) {
|
||||||
if (has_mbyte) {
|
p = (char_u *)line_ga.ga_data;
|
||||||
p = (char_u *)line_ga.ga_data;
|
p[line_ga.ga_len] = NUL;
|
||||||
p[line_ga.ga_len] = NUL;
|
len = utf_head_off(p, p + line_ga.ga_len - 1) + 1;
|
||||||
len = (*mb_head_off)(p, p + line_ga.ga_len - 1) + 1;
|
line_ga.ga_len -= len;
|
||||||
line_ga.ga_len -= len;
|
|
||||||
} else {
|
|
||||||
line_ga.ga_len--;
|
|
||||||
}
|
|
||||||
goto redraw;
|
goto redraw;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
@ -3159,18 +3148,15 @@ void put_on_cmdline(char_u *str, int len, int redraw)
|
|||||||
i = 0;
|
i = 0;
|
||||||
c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos);
|
c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos);
|
||||||
while (ccline.cmdpos > 0 && utf_iscomposing(c)) {
|
while (ccline.cmdpos > 0 && utf_iscomposing(c)) {
|
||||||
i = (*mb_head_off)(ccline.cmdbuff,
|
i = utf_head_off(ccline.cmdbuff, ccline.cmdbuff + ccline.cmdpos - 1) + 1;
|
||||||
ccline.cmdbuff + ccline.cmdpos - 1) + 1;
|
|
||||||
ccline.cmdpos -= i;
|
ccline.cmdpos -= i;
|
||||||
len += i;
|
len += i;
|
||||||
c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos);
|
c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos);
|
||||||
}
|
}
|
||||||
if (i == 0 && ccline.cmdpos > 0 && arabic_maycombine(c)) {
|
if (i == 0 && ccline.cmdpos > 0 && arabic_maycombine(c)) {
|
||||||
/* Check the previous character for Arabic combining pair. */
|
// Check the previous character for Arabic combining pair.
|
||||||
i = (*mb_head_off)(ccline.cmdbuff,
|
i = utf_head_off(ccline.cmdbuff, ccline.cmdbuff + ccline.cmdpos - 1) + 1;
|
||||||
ccline.cmdbuff + ccline.cmdpos - 1) + 1;
|
if (arabic_combine(utf_ptr2char(ccline.cmdbuff + ccline.cmdpos - i), c)) {
|
||||||
if (arabic_combine(utf_ptr2char(ccline.cmdbuff
|
|
||||||
+ ccline.cmdpos - i), c)) {
|
|
||||||
ccline.cmdpos -= i;
|
ccline.cmdpos -= i;
|
||||||
len += i;
|
len += i;
|
||||||
} else
|
} else
|
||||||
|
@ -2129,13 +2129,14 @@ static int vgetorpeek(int advance)
|
|||||||
curwin->w_wcol = curwin->w_width - 1;
|
curwin->w_wcol = curwin->w_width - 1;
|
||||||
col = curwin->w_cursor.col - 1;
|
col = curwin->w_cursor.col - 1;
|
||||||
}
|
}
|
||||||
if (has_mbyte && col > 0 && curwin->w_wcol > 0) {
|
if (col > 0 && curwin->w_wcol > 0) {
|
||||||
/* Correct when the cursor is on the right halve
|
// Correct when the cursor is on the right halve
|
||||||
* of a double-wide character. */
|
// of a double-wide character.
|
||||||
ptr = get_cursor_line_ptr();
|
ptr = get_cursor_line_ptr();
|
||||||
col -= (*mb_head_off)(ptr, ptr + col);
|
col -= utf_head_off(ptr, ptr + col);
|
||||||
if ((*mb_ptr2cells)(ptr + col) > 1)
|
if (utf_ptr2cells(ptr + col) > 1) {
|
||||||
--curwin->w_wcol;
|
curwin->w_wcol--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setcursor();
|
setcursor();
|
||||||
|
@ -118,7 +118,8 @@
|
|||||||
// Advance multi-byte pointer, do not skip over composing chars.
|
// Advance multi-byte pointer, do not skip over composing chars.
|
||||||
# define MB_CPTR_ADV(p) (p += utf_ptr2len(p))
|
# define MB_CPTR_ADV(p) (p += utf_ptr2len(p))
|
||||||
// Backup multi-byte pointer. Only use with "p" > "s" !
|
// Backup multi-byte pointer. Only use with "p" > "s" !
|
||||||
# define MB_PTR_BACK(s, p) (p -= mb_head_off((char_u *)s, (char_u *)p - 1) + 1)
|
# define MB_PTR_BACK(s, p) \
|
||||||
|
(p -= utf_head_off((char_u *)s, (char_u *)p - 1) + 1)
|
||||||
// get length of multi-byte char, not including composing chars
|
// get length of multi-byte char, not including composing chars
|
||||||
# define MB_CPTR2LEN(p) utf_ptr2len(p)
|
# define MB_CPTR2LEN(p) utf_ptr2len(p)
|
||||||
|
|
||||||
|
@ -1468,7 +1468,7 @@ void mark_mb_adjustpos(buf_T *buf, pos_T *lp)
|
|||||||
if (*p == NUL || (int)STRLEN(p) < lp->col) {
|
if (*p == NUL || (int)STRLEN(p) < lp->col) {
|
||||||
lp->col = 0;
|
lp->col = 0;
|
||||||
} else {
|
} else {
|
||||||
lp->col -= (*mb_head_off)(p, p + lp->col);
|
lp->col -= utf_head_off(p, p + lp->col);
|
||||||
}
|
}
|
||||||
// Reset "coladd" when the cursor would be on the right half of a
|
// Reset "coladd" when the cursor would be on the right half of a
|
||||||
// double-wide character.
|
// double-wide character.
|
||||||
|
@ -1710,7 +1710,7 @@ void mb_check_adjust_col(void *win_)
|
|||||||
win->w_cursor.col = len - 1;
|
win->w_cursor.col = len - 1;
|
||||||
}
|
}
|
||||||
// Move the cursor to the head byte.
|
// Move the cursor to the head byte.
|
||||||
win->w_cursor.col -= (*mb_head_off)(p, p + win->w_cursor.col);
|
win->w_cursor.col -= utf_head_off(p, p + win->w_cursor.col);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset `coladd` when the cursor would be on the right half of a
|
// Reset `coladd` when the cursor would be on the right half of a
|
||||||
|
@ -53,7 +53,6 @@ enum { MAX_MCO = 6 };
|
|||||||
#define mb_ptr2cells utf_ptr2cells
|
#define mb_ptr2cells utf_ptr2cells
|
||||||
#define mb_ptr2cells_len utf_ptr2cells_len
|
#define mb_ptr2cells_len utf_ptr2cells_len
|
||||||
#define mb_char2cells utf_char2cells
|
#define mb_char2cells utf_char2cells
|
||||||
#define mb_head_off utf_head_off
|
|
||||||
|
|
||||||
/// Flags for vimconv_T
|
/// Flags for vimconv_T
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -4035,24 +4035,18 @@ int incl(pos_T *lp)
|
|||||||
|
|
||||||
int dec(pos_T *lp)
|
int dec(pos_T *lp)
|
||||||
{
|
{
|
||||||
char_u *p;
|
|
||||||
|
|
||||||
lp->coladd = 0;
|
lp->coladd = 0;
|
||||||
if (lp->col > 0) { // still within line
|
if (lp->col > 0) { // still within line
|
||||||
lp->col--;
|
lp->col--;
|
||||||
if (has_mbyte) {
|
char_u *p = ml_get(lp->lnum);
|
||||||
p = ml_get(lp->lnum);
|
lp->col -= utf_head_off(p, p + lp->col);
|
||||||
lp->col -= (*mb_head_off)(p, p + lp->col);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (lp->lnum > 1) { // there is a prior line
|
if (lp->lnum > 1) { // there is a prior line
|
||||||
lp->lnum--;
|
lp->lnum--;
|
||||||
p = ml_get(lp->lnum);
|
char_u *p = ml_get(lp->lnum);
|
||||||
lp->col = (colnr_T)STRLEN(p);
|
lp->col = (colnr_T)STRLEN(p);
|
||||||
if (has_mbyte) {
|
lp->col -= utf_head_off(p, p + lp->col);
|
||||||
lp->col -= (*mb_head_off)(p, p + lp->col);
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return -1; // at start of file
|
return -1; // at start of file
|
||||||
|
@ -548,7 +548,7 @@ open_line (
|
|||||||
|
|
||||||
/* blank-out any other chars from the old leader. */
|
/* blank-out any other chars from the old leader. */
|
||||||
while (--p >= leader) {
|
while (--p >= leader) {
|
||||||
int l = mb_head_off(leader, p);
|
int l = utf_head_off(leader, p);
|
||||||
|
|
||||||
if (l > 1) {
|
if (l > 1) {
|
||||||
p -= l;
|
p -= l;
|
||||||
@ -1652,9 +1652,7 @@ int del_bytes(colnr_T count, bool fixpos_arg, bool use_delcombine)
|
|||||||
) {
|
) {
|
||||||
--curwin->w_cursor.col;
|
--curwin->w_cursor.col;
|
||||||
curwin->w_cursor.coladd = 0;
|
curwin->w_cursor.coladd = 0;
|
||||||
if (has_mbyte)
|
curwin->w_cursor.col -= utf_head_off(oldp, oldp + curwin->w_cursor.col);
|
||||||
curwin->w_cursor.col -=
|
|
||||||
(*mb_head_off)(oldp, oldp + curwin->w_cursor.col);
|
|
||||||
}
|
}
|
||||||
count = oldlen - col;
|
count = oldlen - col;
|
||||||
movelen = 1;
|
movelen = 1;
|
||||||
|
@ -2858,9 +2858,10 @@ static void find_start_of_word(pos_T *pos)
|
|||||||
|
|
||||||
while (pos->col > 0) {
|
while (pos->col > 0) {
|
||||||
col = pos->col - 1;
|
col = pos->col - 1;
|
||||||
col -= (*mb_head_off)(line, line + col);
|
col -= utf_head_off(line, line + col);
|
||||||
if (get_mouse_class(line + col) != cclass)
|
if (get_mouse_class(line + col) != cclass) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
pos->col = col;
|
pos->col = col;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2877,8 +2878,8 @@ static void find_end_of_word(pos_T *pos)
|
|||||||
|
|
||||||
line = ml_get(pos->lnum);
|
line = ml_get(pos->lnum);
|
||||||
if (*p_sel == 'e' && pos->col > 0) {
|
if (*p_sel == 'e' && pos->col > 0) {
|
||||||
--pos->col;
|
pos->col--;
|
||||||
pos->col -= (*mb_head_off)(line, line + pos->col);
|
pos->col -= utf_head_off(line, line + pos->col);
|
||||||
}
|
}
|
||||||
cclass = get_mouse_class(line + pos->col);
|
cclass = get_mouse_class(line + pos->col);
|
||||||
while (line[pos->col] != NUL) {
|
while (line[pos->col] != NUL) {
|
||||||
@ -3094,9 +3095,9 @@ size_t find_ident_at_pos(win_T *wp, linenr_T lnum, colnr_T startcol,
|
|||||||
// When starting on a ']' count it, so that we include the '['.
|
// When starting on a ']' count it, so that we include the '['.
|
||||||
bn = ptr[col] == ']';
|
bn = ptr[col] == ']';
|
||||||
|
|
||||||
/*
|
//
|
||||||
* 2. Back up to start of identifier/string.
|
// 2. Back up to start of identifier/string.
|
||||||
*/
|
//
|
||||||
// Remember class of character under cursor.
|
// Remember class of character under cursor.
|
||||||
if ((find_type & FIND_EVAL) && ptr[col] == ']') {
|
if ((find_type & FIND_EVAL) && ptr[col] == ']') {
|
||||||
this_class = mb_get_class((char_u *)"a");
|
this_class = mb_get_class((char_u *)"a");
|
||||||
@ -3129,7 +3130,7 @@ size_t find_ident_at_pos(win_T *wp, linenr_T lnum, colnr_T startcol,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ptr[col] == NUL || (i == 0 && this_class != 2)) {
|
if (ptr[col] == NUL || (i == 0 && this_class != 2)) {
|
||||||
// didn't find an identifier or string
|
// Didn't find an identifier or string.
|
||||||
if (find_type & FIND_STRING) {
|
if (find_type & FIND_STRING) {
|
||||||
EMSG(_("E348: No string under cursor"));
|
EMSG(_("E348: No string under cursor"));
|
||||||
} else {
|
} else {
|
||||||
|
@ -520,12 +520,12 @@ static void block_insert(oparg_T *oap, char_u *s, int b_insert, struct block_def
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_mbyte && spaces > 0) {
|
if (spaces > 0) {
|
||||||
int off;
|
int off;
|
||||||
|
|
||||||
// Avoid starting halfway through a multi-byte character.
|
// Avoid starting halfway through a multi-byte character.
|
||||||
if (b_insert) {
|
if (b_insert) {
|
||||||
off = (*mb_head_off)(oldp, oldp + offset + spaces);
|
off = utf_head_off(oldp, oldp + offset + spaces);
|
||||||
} else {
|
} else {
|
||||||
off = (*mb_off_next)(oldp, oldp + offset);
|
off = (*mb_off_next)(oldp, oldp + offset);
|
||||||
offset += off;
|
offset += off;
|
||||||
@ -2460,11 +2460,10 @@ static void op_yank_reg(oparg_T *oap, bool message, yankreg_T *reg, bool append)
|
|||||||
if (virtual_op) {
|
if (virtual_op) {
|
||||||
getvcol(curwin, &oap->end, &cs, NULL, &ce);
|
getvcol(curwin, &oap->end, &cs, NULL, &ce);
|
||||||
if (p[endcol] == NUL || (cs + oap->end.coladd < ce
|
if (p[endcol] == NUL || (cs + oap->end.coladd < ce
|
||||||
/* Don't add space for double-wide
|
// Don't add space for double-wide
|
||||||
* char; endcol will be on last byte
|
// char; endcol will be on last byte
|
||||||
* of multi-byte char. */
|
// of multi-byte char.
|
||||||
&& (*mb_head_off)(p, p + endcol) == 0
|
&& utf_head_off(p, p + endcol) == 0)) {
|
||||||
)) {
|
|
||||||
if (oap->start.lnum == oap->end.lnum
|
if (oap->start.lnum == oap->end.lnum
|
||||||
&& oap->start.col == oap->end.col) {
|
&& oap->start.col == oap->end.col) {
|
||||||
/* Special case: inside a single char */
|
/* Special case: inside a single char */
|
||||||
@ -3021,7 +3020,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
|
|||||||
bd.startspaces = incr - bd.endspaces;
|
bd.startspaces = incr - bd.endspaces;
|
||||||
--bd.textcol;
|
--bd.textcol;
|
||||||
delcount = 1;
|
delcount = 1;
|
||||||
bd.textcol -= (*mb_head_off)(oldp, oldp + bd.textcol);
|
bd.textcol -= utf_head_off(oldp, oldp + bd.textcol);
|
||||||
if (oldp[bd.textcol] != TAB) {
|
if (oldp[bd.textcol] != TAB) {
|
||||||
/* Only a Tab can be split into spaces. Other
|
/* Only a Tab can be split into spaces. Other
|
||||||
* characters will have to be moved to after the
|
* characters will have to be moved to after the
|
||||||
|
@ -1819,7 +1819,7 @@ void path_fix_case(char_u *name)
|
|||||||
int after_pathsep(const char *b, const char *p)
|
int after_pathsep(const char *b, const char *p)
|
||||||
{
|
{
|
||||||
return p > b && vim_ispathsep(p[-1])
|
return p > b && vim_ispathsep(p[-1])
|
||||||
&& (!has_mbyte || (*mb_head_off)((char_u *)b, (char_u *)p - 1) == 0);
|
&& utf_head_off((char_u *)b, (char_u *)p - 1) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3653,8 +3653,7 @@ static long regtry(bt_regprog_T *prog, colnr_T col)
|
|||||||
static int reg_prev_class(void)
|
static int reg_prev_class(void)
|
||||||
{
|
{
|
||||||
if (reginput > regline) {
|
if (reginput > regline) {
|
||||||
return mb_get_class_tab(reginput - 1 - (*mb_head_off)(regline,
|
return mb_get_class_tab(reginput - 1 - utf_head_off(regline, reginput - 1),
|
||||||
reginput - 1),
|
|
||||||
rex.reg_buf->b_chartab);
|
rex.reg_buf->b_chartab);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -4639,10 +4639,10 @@ static int recursive_regmatch(nfa_state_T *state, nfa_pim_T *pim, nfa_regprog_T
|
|||||||
}
|
}
|
||||||
if ((int)(reginput - regline) >= state->val) {
|
if ((int)(reginput - regline) >= state->val) {
|
||||||
reginput -= state->val;
|
reginput -= state->val;
|
||||||
if (has_mbyte)
|
reginput -= utf_head_off(regline, reginput);
|
||||||
reginput -= mb_head_off(regline, reginput);
|
} else {
|
||||||
} else
|
|
||||||
reginput = regline;
|
reginput = regline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3435,7 +3435,7 @@ win_line (
|
|||||||
// Found last space before word: check for line break.
|
// Found last space before word: check for line break.
|
||||||
if (wp->w_p_lbr && c0 == c && vim_isbreak(c)
|
if (wp->w_p_lbr && c0 == c && vim_isbreak(c)
|
||||||
&& !vim_isbreak((int)(*ptr))) {
|
&& !vim_isbreak((int)(*ptr))) {
|
||||||
int mb_off = has_mbyte ? (*mb_head_off)(line, ptr - 1) : 0;
|
int mb_off = utf_head_off(line, ptr - 1);
|
||||||
char_u *p = ptr - (mb_off + 1);
|
char_u *p = ptr - (mb_off + 1);
|
||||||
// TODO: is passing p for start of the line OK?
|
// TODO: is passing p for start of the line OK?
|
||||||
n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol, NULL) - 1;
|
n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol, NULL) - 1;
|
||||||
|
@ -821,11 +821,10 @@ int searchit(
|
|||||||
pos->lnum, FALSE));
|
pos->lnum, FALSE));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
--pos->col;
|
pos->col--;
|
||||||
if (has_mbyte
|
if (pos->lnum <= buf->b_ml.ml_line_count) {
|
||||||
&& pos->lnum <= buf->b_ml.ml_line_count) {
|
ptr = ml_get_buf(buf, pos->lnum, false);
|
||||||
ptr = ml_get_buf(buf, pos->lnum, FALSE);
|
pos->col -= utf_head_off(ptr, ptr + pos->col);
|
||||||
pos->col -= (*mb_head_off)(ptr, ptr + pos->col);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1423,7 +1422,7 @@ int searchc(cmdarg_T *cap, int t_cmd)
|
|||||||
} else {
|
} else {
|
||||||
if (col == 0)
|
if (col == 0)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
col -= (*mb_head_off)(p, p + col - 1) + 1;
|
col -= utf_head_off(p, p + col - 1) + 1;
|
||||||
}
|
}
|
||||||
if (lastc_bytelen == 1) {
|
if (lastc_bytelen == 1) {
|
||||||
if (p[col] == c && stop) {
|
if (p[col] == c && stop) {
|
||||||
@ -1446,15 +1445,14 @@ int searchc(cmdarg_T *cap, int t_cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (t_cmd) {
|
if (t_cmd) {
|
||||||
/* backup to before the character (possibly double-byte) */
|
// Backup to before the character (possibly double-byte).
|
||||||
col -= dir;
|
col -= dir;
|
||||||
if (has_mbyte) {
|
if (dir < 0) {
|
||||||
if (dir < 0)
|
// Landed on the search char which is lastc_bytelen long.
|
||||||
/* Landed on the search char which is lastc_bytelen long */
|
col += lastc_bytelen - 1;
|
||||||
col += lastc_bytelen - 1;
|
} else {
|
||||||
else
|
// To previous char, which may be multi-byte.
|
||||||
/* To previous char, which may be multi-byte. */
|
col -= utf_head_off(p, p + col);
|
||||||
col -= (*mb_head_off)(p, p + col);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
curwin->w_cursor.col = col;
|
curwin->w_cursor.col = col;
|
||||||
@ -1476,21 +1474,21 @@ pos_T *findmatch(oparg_T *oap, int initc)
|
|||||||
return findmatchlimit(oap, initc, 0, 0);
|
return findmatchlimit(oap, initc, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Return true if the character before "linep[col]" equals "ch".
|
||||||
* Return TRUE if the character before "linep[col]" equals "ch".
|
// Return false if "col" is zero.
|
||||||
* Return FALSE if "col" is zero.
|
// Update "*prevcol" to the column of the previous character, unless "prevcol"
|
||||||
* Update "*prevcol" to the column of the previous character, unless "prevcol"
|
// is NULL.
|
||||||
* is NULL.
|
// Handles multibyte string correctly.
|
||||||
* Handles multibyte string correctly.
|
static bool check_prevcol(char_u *linep, int col, int ch, int *prevcol)
|
||||||
*/
|
|
||||||
static int check_prevcol(char_u *linep, int col, int ch, int *prevcol)
|
|
||||||
{
|
{
|
||||||
--col;
|
col--;
|
||||||
if (col > 0 && has_mbyte)
|
if (col > 0) {
|
||||||
col -= (*mb_head_off)(linep, linep + col);
|
col -= utf_head_off(linep, linep + col);
|
||||||
if (prevcol)
|
}
|
||||||
|
if (prevcol) {
|
||||||
*prevcol = col;
|
*prevcol = col;
|
||||||
return (col >= 0 && linep[col] == ch) ? TRUE : FALSE;
|
}
|
||||||
|
return (col >= 0 && linep[col] == ch) ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1797,9 +1795,8 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel)
|
|||||||
if (lisp && comment_col != MAXCOL)
|
if (lisp && comment_col != MAXCOL)
|
||||||
pos.col = comment_col;
|
pos.col = comment_col;
|
||||||
} else {
|
} else {
|
||||||
--pos.col;
|
pos.col--;
|
||||||
if (has_mbyte)
|
pos.col -= utf_head_off(linep, linep + pos.col);
|
||||||
pos.col -= (*mb_head_off)(linep, linep + pos.col);
|
|
||||||
}
|
}
|
||||||
} else { /* forward search */
|
} else { /* forward search */
|
||||||
if (linep[pos.col] == NUL
|
if (linep[pos.col] == NUL
|
||||||
@ -2386,8 +2383,7 @@ findpar (
|
|||||||
// motion inclusive.
|
// motion inclusive.
|
||||||
if ((curwin->w_cursor.col = (colnr_T)STRLEN(line)) != 0) {
|
if ((curwin->w_cursor.col = (colnr_T)STRLEN(line)) != 0) {
|
||||||
curwin->w_cursor.col--;
|
curwin->w_cursor.col--;
|
||||||
curwin->w_cursor.col -=
|
curwin->w_cursor.col -= utf_head_off(line, line + curwin->w_cursor.col);
|
||||||
(*mb_head_off)(line, line + curwin->w_cursor.col);
|
|
||||||
*pincl = true;
|
*pincl = true;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
@ -3694,8 +3690,8 @@ find_prev_quote(
|
|||||||
int n;
|
int n;
|
||||||
|
|
||||||
while (col_start > 0) {
|
while (col_start > 0) {
|
||||||
--col_start;
|
col_start--;
|
||||||
col_start -= (*mb_head_off)(line, line + col_start);
|
col_start -= utf_head_off(line, line + col_start);
|
||||||
n = 0;
|
n = 0;
|
||||||
if (escape != NULL)
|
if (escape != NULL)
|
||||||
while (col_start - n > 0 && vim_strchr(escape,
|
while (col_start - n > 0 && vim_strchr(escape,
|
||||||
|
@ -688,8 +688,9 @@ static void find_word(matchinf_T *mip, int mode)
|
|||||||
arridx = endidx[endidxcnt];
|
arridx = endidx[endidxcnt];
|
||||||
wlen = endlen[endidxcnt];
|
wlen = endlen[endidxcnt];
|
||||||
|
|
||||||
if ((*mb_head_off)(ptr, ptr + wlen) > 0)
|
if (utf_head_off(ptr, ptr + wlen) > 0) {
|
||||||
continue; // not at first byte of character
|
continue; // not at first byte of character
|
||||||
|
}
|
||||||
if (spell_iswordp(ptr + wlen, mip->mi_win)) {
|
if (spell_iswordp(ptr + wlen, mip->mi_win)) {
|
||||||
if (slang->sl_compprog == NULL && !slang->sl_nobreak)
|
if (slang->sl_compprog == NULL && !slang->sl_nobreak)
|
||||||
continue; // next char is a word character
|
continue; // next char is a word character
|
||||||
|
@ -1726,16 +1726,12 @@ static int syn_current_attr(
|
|||||||
*/
|
*/
|
||||||
if (do_keywords) {
|
if (do_keywords) {
|
||||||
line = syn_getcurline();
|
line = syn_getcurline();
|
||||||
if (vim_iswordp_buf(line + current_col, syn_buf)
|
const char_u *cur_pos = line + current_col;
|
||||||
&& (current_col == 0
|
if (vim_iswordp_buf(cur_pos, syn_buf)
|
||||||
|| !vim_iswordp_buf(line + current_col - 1
|
&& (current_col == 0 || !vim_iswordp_buf(
|
||||||
- (has_mbyte
|
cur_pos - 1 - utf_head_off(line, cur_pos - 1), syn_buf))) {
|
||||||
? (*mb_head_off)(line, line + current_col - 1)
|
syn_id = check_keyword_id(line, (int)current_col, &endcol, &flags,
|
||||||
: 0)
|
&next_list, cur_si, &cchar);
|
||||||
, syn_buf))) {
|
|
||||||
syn_id = check_keyword_id(line, (int)current_col,
|
|
||||||
&endcol, &flags, &next_list, cur_si,
|
|
||||||
&cchar);
|
|
||||||
if (syn_id != 0) {
|
if (syn_id != 0) {
|
||||||
push_current_state(KEYWORD_IDX);
|
push_current_state(KEYWORD_IDX);
|
||||||
{
|
{
|
||||||
|
@ -5162,13 +5162,14 @@ file_name_in_line (
|
|||||||
* Go one char back to ":" before "//" even when ':' is not in 'isfname'.
|
* Go one char back to ":" before "//" even when ':' is not in 'isfname'.
|
||||||
*/
|
*/
|
||||||
while (ptr > line) {
|
while (ptr > line) {
|
||||||
if (has_mbyte && (len = (size_t)((*mb_head_off)(line, ptr - 1))) > 0)
|
if ((len = (size_t)(utf_head_off(line, ptr - 1))) > 0) {
|
||||||
ptr -= len + 1;
|
ptr -= len + 1;
|
||||||
else if (vim_isfilec(ptr[-1])
|
} else if (vim_isfilec(ptr[-1])
|
||||||
|| ((options & FNAME_HYP) && path_is_url((char *)ptr - 1)))
|
|| ((options & FNAME_HYP) && path_is_url((char *)ptr - 1))) {
|
||||||
--ptr;
|
ptr--;
|
||||||
else
|
} else {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user