aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/getchar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/getchar.c')
-rw-r--r--src/nvim/getchar.c181
1 files changed, 77 insertions, 104 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index 456979be00..a5c81b2795 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -563,9 +563,7 @@ void AppendToRedobuffLit(const char_u *str, int len)
// Handle a special or multibyte character.
// Composing chars separately are handled separately.
- const int c = (has_mbyte
- ? mb_cptr2char_adv((const char_u **)&s)
- : (uint8_t)(*s++));
+ const int c = mb_cptr2char_adv((const char_u **)&s);
if (c < ' ' || c == DEL || (*s == NUL && (c == '0' || c == '^'))) {
add_char_buff(&redobuff, Ctrl_V);
}
@@ -684,15 +682,16 @@ static int read_redo(bool init, bool old_redo)
if ((c = *p) == NUL) {
return c;
}
- /* Reverse the conversion done by add_char_buff() */
- /* For a multi-byte character get all the bytes and return the
- * converted character. */
- if (has_mbyte && (c != K_SPECIAL || p[1] == KS_SPECIAL))
+ // Reverse the conversion done by add_char_buff() */
+ // For a multi-byte character get all the bytes and return the
+ // converted character.
+ if (c != K_SPECIAL || p[1] == KS_SPECIAL) {
n = MB_BYTE2LEN_CHECK(c);
- else
+ } else {
n = 1;
- for (i = 0;; ++i) {
- if (c == K_SPECIAL) { /* special key or escaped K_SPECIAL */
+ }
+ for (i = 0;; i++) {
+ if (c == K_SPECIAL) { // special key or escaped K_SPECIAL
c = TO_SPECIAL(p[1], p[2]);
p += 2;
}
@@ -2161,14 +2160,11 @@ static int vgetorpeek(bool advance)
col = vcol = curwin->w_wcol = 0;
ptr = get_cursor_line_ptr();
while (col < curwin->w_cursor.col) {
- if (!ascii_iswhite(ptr[col]))
+ if (!ascii_iswhite(ptr[col])) {
curwin->w_wcol = vcol;
- vcol += lbr_chartabsize(ptr, ptr + col,
- (colnr_T)vcol);
- if (has_mbyte)
- col += (*mb_ptr2len)(ptr + col);
- else
- ++col;
+ }
+ vcol += lbr_chartabsize(ptr, ptr + col, (colnr_T)vcol);
+ col += utfc_ptr2len(ptr + col);
}
curwin->w_wrow = curwin->w_cline_row
+ curwin->w_wcol / curwin->w_width_inner;
@@ -2813,33 +2809,23 @@ int buf_do_map(int maptype, MapArguments *args, int mode, bool is_abbrev,
// Otherwise we won't be able to find the start of it in a
// vi-compatible way.
//
- if (has_mbyte) {
- int first, last;
- int same = -1;
-
- first = vim_iswordp(lhs);
- last = first;
- p = lhs + (*mb_ptr2len)(lhs);
- n = 1;
- while (p < lhs + len) {
- n++; // nr of (multi-byte) chars
- last = vim_iswordp(p); // type of last char
- if (same == -1 && last != first) {
- same = n - 1; // count of same char type
- }
- p += (*mb_ptr2len)(p);
- }
- if (last && n > 2 && same >= 0 && same < n - 1) {
- retval = 1;
- goto theend;
+ int same = -1;
+
+ const int first = vim_iswordp(lhs);
+ int last = first;
+ p = lhs + utfc_ptr2len(lhs);
+ n = 1;
+ while (p < lhs + len) {
+ n++; // nr of (multi-byte) chars
+ last = vim_iswordp(p); // type of last char
+ if (same == -1 && last != first) {
+ same = n - 1; // count of same char type
}
- } else if (vim_iswordc(lhs[len - 1])) { // ends in keyword char
- for (n = 0; n < len - 2; n++) {
- if (vim_iswordc(lhs[n]) != vim_iswordc(lhs[len - 2])) {
- retval = 1;
- goto theend;
- }
- } // for
+ p += (*mb_ptr2len)(p);
+ }
+ if (last && n > 2 && same >= 0 && same < n - 1) {
+ retval = 1;
+ goto theend;
}
// An abbreviation cannot contain white space.
for (n = 0; n < len; n++) {
@@ -3700,25 +3686,23 @@ int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file)
return count == 0 ? FAIL : OK;
}
-/*
- * Check for an abbreviation.
- * Cursor is at ptr[col].
- * When inserting, mincol is where insert started.
- * For the command line, mincol is what is to be skipped over.
- * "c" is the character typed before check_abbr was called. It may have
- * ABBR_OFF added to avoid prepending a CTRL-V to it.
- *
- * Historic vi practice: The last character of an abbreviation must be an id
- * character ([a-zA-Z0-9_]). The characters in front of it must be all id
- * characters or all non-id characters. This allows for abbr. "#i" to
- * "#include".
- *
- * Vim addition: Allow for abbreviations that end in a non-keyword character.
- * Then there must be white space before the abbr.
- *
- * return TRUE if there is an abbreviation, FALSE if not
- */
-int check_abbr(int c, char_u *ptr, int col, int mincol)
+// Check for an abbreviation.
+// Cursor is at ptr[col].
+// When inserting, mincol is where insert started.
+// For the command line, mincol is what is to be skipped over.
+// "c" is the character typed before check_abbr was called. It may have
+// ABBR_OFF added to avoid prepending a CTRL-V to it.
+//
+// Historic vi practice: The last character of an abbreviation must be an id
+// character ([a-zA-Z0-9_]). The characters in front of it must be all id
+// characters or all non-id characters. This allows for abbr. "#i" to
+// "#include".
+//
+// Vim addition: Allow for abbreviations that end in a non-keyword character.
+// Then there must be white space before the abbr.
+//
+// Return true if there is an abbreviation, false if not.
+bool check_abbr(int c, char_u *ptr, int col, int mincol)
{
int len;
int scol; /* starting column of the abbr. */
@@ -3727,36 +3711,36 @@ int check_abbr(int c, char_u *ptr, int col, int mincol)
char_u tb[MB_MAXBYTES + 4];
mapblock_T *mp;
mapblock_T *mp2;
- int clen = 0; /* length in characters */
- int is_id = TRUE;
- int vim_abbr;
-
- if (typebuf.tb_no_abbr_cnt) /* abbrev. are not recursive */
- return FALSE;
+ int clen = 0; // length in characters
+ bool is_id = true;
- /* no remapping implies no abbreviation, except for CTRL-] */
- if ((KeyNoremap & (RM_NONE|RM_SCRIPT)) != 0 && c != Ctrl_RSB)
- return FALSE;
+ if (typebuf.tb_no_abbr_cnt) { // abbrev. are not recursive
+ return false;
+ }
- /*
- * Check for word before the cursor: If it ends in a keyword char all
- * chars before it must be keyword chars or non-keyword chars, but not
- * white space. If it ends in a non-keyword char we accept any characters
- * before it except white space.
- */
- if (col == 0) /* cannot be an abbr. */
- return FALSE;
+ // no remapping implies no abbreviation, except for CTRL-]
+ if ((KeyNoremap & (RM_NONE|RM_SCRIPT)) != 0 && c != Ctrl_RSB) {
+ return false;
+ }
- if (has_mbyte) {
- char_u *p;
+ // Check for word before the cursor: If it ends in a keyword char all
+ // chars before it must be keyword chars or non-keyword chars, but not
+ // white space. If it ends in a non-keyword char we accept any characters
+ // before it except white space.
+ if (col == 0) { // cannot be an abbr.
+ return false;
+ }
- p = mb_prevptr(ptr, ptr + col);
- if (!vim_iswordp(p))
- vim_abbr = TRUE; /* Vim added abbr. */
- else {
- vim_abbr = FALSE; /* vi compatible abbr. */
- if (p > ptr)
+ {
+ bool vim_abbr;
+ char_u *p = mb_prevptr(ptr, ptr + col);
+ if (!vim_iswordp(p)) {
+ vim_abbr = true; // Vim added abbr.
+ } else {
+ vim_abbr = false; // vi compatible abbr.
+ if (p > ptr) {
is_id = vim_iswordp(mb_prevptr(ptr, p));
+ }
}
clen = 1;
while (p > ptr + mincol) {
@@ -3768,17 +3752,6 @@ int check_abbr(int c, char_u *ptr, int col, int mincol)
++clen;
}
scol = (int)(p - ptr);
- } else {
- if (!vim_iswordc(ptr[col - 1]))
- vim_abbr = TRUE; /* Vim added abbr. */
- else {
- vim_abbr = FALSE; /* vi compatible abbr. */
- if (col > 1)
- is_id = vim_iswordc(ptr[col - 2]);
- }
- for (scol = col - 1; scol > 0 && !ascii_isspace(ptr[scol - 1])
- && (vim_abbr || is_id == vim_iswordc(ptr[scol - 1])); --scol)
- ;
}
if (scol < mincol)
@@ -3866,14 +3839,14 @@ int check_abbr(int c, char_u *ptr, int col, int mincol)
tb[0] = Ctrl_H;
tb[1] = NUL;
- if (has_mbyte)
- len = clen; /* Delete characters instead of bytes */
- while (len-- > 0) /* delete the from string */
- (void)ins_typebuf(tb, 1, 0, TRUE, mp->m_silent);
- return TRUE;
+ len = clen; // Delete characters instead of bytes
+ while (len-- > 0) { // delete the from string
+ (void)ins_typebuf(tb, 1, 0, true, mp->m_silent);
+ }
+ return true;
}
}
- return FALSE;
+ return false;
}
/*