diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/charset.c | 11 | ||||
-rw-r--r-- | src/nvim/edit.c | 64 | ||||
-rw-r--r-- | src/nvim/eval.c | 37 | ||||
-rw-r--r-- | src/nvim/ex_getln.c | 3 | ||||
-rw-r--r-- | src/nvim/ex_getln.h | 19 | ||||
-rw-r--r-- | src/nvim/fileio.c | 2 | ||||
-rw-r--r-- | src/nvim/message.c | 3 | ||||
-rw-r--r-- | src/nvim/path.c | 39 | ||||
-rw-r--r-- | src/nvim/path.h | 1 | ||||
-rw-r--r-- | src/nvim/regexp_nfa.c | 52 | ||||
-rw-r--r-- | src/nvim/screen.c | 3 | ||||
-rw-r--r-- | src/nvim/search.c | 50 | ||||
-rw-r--r-- | src/nvim/testdir/Makefile | 1 | ||||
-rw-r--r-- | src/nvim/testdir/test83-tags2 | 2 | ||||
-rw-r--r-- | src/nvim/testdir/test83-tags3 | 102 | ||||
-rw-r--r-- | src/nvim/testdir/test83.in | 75 | ||||
-rw-r--r-- | src/nvim/testdir/test83.ok | 4 | ||||
-rw-r--r-- | src/nvim/version.c | 10 | ||||
-rw-r--r-- | src/nvim/window.c | 291 |
19 files changed, 318 insertions, 451 deletions
diff --git a/src/nvim/charset.c b/src/nvim/charset.c index e0c9443511..9c63eca1f2 100644 --- a/src/nvim/charset.c +++ b/src/nvim/charset.c @@ -1791,7 +1791,6 @@ void vim_str2nr(char_u *start, int *prep, int *len, int pre = 0; // default is decimal int negative = false; unsigned long un = 0; - int n; if (ptr[0] == '-') { negative = true; @@ -1818,7 +1817,7 @@ void vim_str2nr(char_u *start, int *prep, int *len, if (dooct) { // Don't interpret "0", "08" or "0129" as octal. - for (n = 1; ascii_isdigit(ptr[n]); ++n) { + for (int n = 1; ascii_isdigit(ptr[n]); ++n) { if (ptr[n] > '7') { // can't be octal pre = 0; @@ -1836,9 +1835,6 @@ void vim_str2nr(char_u *start, int *prep, int *len, // Do the string-to-numeric conversion "manually" to avoid sscanf quirks. if ((pre == 'B') || (pre == 'b') || (dobin > 1)) { // bin - if (pre != 0) { - n += 2; // skip over "0b" - } while ('0' <= *ptr && *ptr <= '1') { un = 2 * un + (unsigned long)(*ptr - '0'); ptr++; @@ -1849,11 +1845,8 @@ void vim_str2nr(char_u *start, int *prep, int *len, un = 8 * un + (unsigned long)(*ptr - '0'); ptr++; } - } else if (pre != 0 || dohex > 1) { + } else if ((pre == 'X') || (pre == 'x') || dohex > 1) { // hex - if (pre != 0) { - n += 2; // skip over "0x" - } while (ascii_isxdigit(*ptr)) { un = 16 * un + (unsigned long)hex2nr(*ptr); ptr++; diff --git a/src/nvim/edit.c b/src/nvim/edit.c index ccfc9b4803..dbbcf4f1b9 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -7586,27 +7586,35 @@ static int ins_bs(int c, int mode, int *inserted_space_p) * happen when using 'sts' and 'linebreak'. */ if (vcol >= start_vcol) ins_bs_one(&vcol); - } - /* - * Delete upto starting point, start of line or previous word. - */ - else do { - if (!revins_on) /* put cursor on char to be deleted */ - dec_cursor(); - /* start of word? */ - if (mode == BACKSPACE_WORD && !ascii_isspace(gchar_cursor())) { - mode = BACKSPACE_WORD_NOT_SPACE; - temp = vim_iswordc(gchar_cursor()); + // Delete upto starting point, start of line or previous word. + } else { + int cclass = 0, prev_cclass = 0; + + if (has_mbyte) { + cclass = mb_get_class(get_cursor_pos_ptr()); + } + do { + if (!revins_on) { // put cursor on char to be deleted + dec_cursor(); } - /* end of word? */ - else if (mode == BACKSPACE_WORD_NOT_SPACE - && (ascii_isspace(cc = gchar_cursor()) - || vim_iswordc(cc) != temp)) { - if (!revins_on) + cc = gchar_cursor(); + // look multi-byte character class + if (has_mbyte) { + prev_cclass = cclass; + cclass = mb_get_class(get_cursor_pos_ptr()); + } + if (mode == BACKSPACE_WORD && !ascii_isspace(cc)) { // start of word? + mode = BACKSPACE_WORD_NOT_SPACE; + temp = vim_iswordc(cc); + } else if (mode == BACKSPACE_WORD_NOT_SPACE + && ((ascii_isspace(cc) || vim_iswordc(cc) != temp) + || prev_cclass != cclass)) { // end of word? + if (!revins_on) { inc_cursor(); - else if (State & REPLACE_FLAG) + } else if (State & REPLACE_FLAG) { dec_cursor(); + } break; } if (State & REPLACE_FLAG) @@ -7639,18 +7647,18 @@ static int ins_bs(int c, int mode, int *inserted_space_p) (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; } - did_si = FALSE; - can_si = FALSE; - can_si_back = FALSE; - if (curwin->w_cursor.col <= 1) - did_ai = FALSE; - /* - * It's a little strange to put backspaces into the redo - * buffer, but it makes auto-indent a lot easier to deal - * with. - */ + did_si = false; + can_si = false; + can_si_back = false; + if (curwin->w_cursor.col <= 1) { + did_ai = false; + } + // It's a little strange to put backspaces into the redo + // buffer, but it makes auto-indent a lot easier to deal + // with. AppendCharToRedobuff(c); /* If deleted before the insertion point, adjust it */ diff --git a/src/nvim/eval.c b/src/nvim/eval.c index a5a8671697..219bd38d82 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -4638,10 +4638,13 @@ static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate) int n, nr; int c = toupper(*p); - if (c == 'X') + if (c == 'X') { n = 2; - else + } else if (*p == 'u') { n = 4; + } else { + n = 8; + } nr = 0; while (--n >= 0 && ascii_isxdigit(p[1])) { ++p; @@ -7188,9 +7191,9 @@ static struct fst { { "getwinposx", 0, 0, f_getwinposx }, { "getwinposy", 0, 0, f_getwinposy }, { "getwinvar", 2, 3, f_getwinvar }, - { "glob", 1, 3, f_glob }, + { "glob", 1, 4, f_glob }, { "glob2regpat", 1, 1, f_glob2regpat }, - { "globpath", 2, 4, f_globpath }, + { "globpath", 2, 5, f_globpath }, { "has", 1, 1, f_has }, { "has_key", 2, 2, f_has_key }, { "haslocaldir", 0, 0, f_haslocaldir }, @@ -10701,10 +10704,15 @@ static void f_glob(typval_T *argvars, typval_T *rettv) if (argvars[1].v_type != VAR_UNKNOWN) { if (get_tv_number_chk(&argvars[1], &error)) options |= WILD_KEEP_ALL; - if (argvars[2].v_type != VAR_UNKNOWN - && get_tv_number_chk(&argvars[2], &error)) { - rettv->v_type = VAR_LIST; - rettv->vval.v_list = NULL; + if (argvars[2].v_type != VAR_UNKNOWN) { + if (get_tv_number_chk(&argvars[2], &error)) { + rettv->v_type = VAR_LIST; + rettv->vval.v_list = NULL; + } + if (argvars[3].v_type != VAR_UNKNOWN + && get_tv_number_chk(&argvars[3], &error)) { + options |= WILD_ALLLINKS; + } } } if (!error) { @@ -10743,10 +10751,15 @@ static void f_globpath(typval_T *argvars, typval_T *rettv) flags |= WILD_KEEP_ALL; } - if (argvars[3].v_type != VAR_UNKNOWN - && get_tv_number_chk(&argvars[3], &error)) { - rettv->v_type = VAR_LIST; - rettv->vval.v_list = NULL; + if (argvars[3].v_type != VAR_UNKNOWN) { + if (get_tv_number_chk(&argvars[3], &error)) { + rettv->v_type = VAR_LIST; + rettv->vval.v_list = NULL; + } + if (argvars[4].v_type != VAR_UNKNOWN + && get_tv_number_chk(&argvars[4], &error)) { + flags |= WILD_ALLLINKS; + } } } diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 87a6bf8901..b19331ad06 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -3701,6 +3701,9 @@ ExpandFromContext ( flags |= EW_KEEPALL; if (options & WILD_SILENT) flags |= EW_SILENT; + if (options & WILD_ALLLINKS) { + flags |= EW_ALLLINKS; + } if (xp->xp_context == EXPAND_FILES || xp->xp_context == EXPAND_DIRECTORIES diff --git a/src/nvim/ex_getln.h b/src/nvim/ex_getln.h index c537d681c6..21da8b9d42 100644 --- a/src/nvim/ex_getln.h +++ b/src/nvim/ex_getln.h @@ -14,15 +14,16 @@ #define WILD_LONGEST 7 #define WILD_ALL_KEEP 8 -#define WILD_LIST_NOTFOUND 1 -#define WILD_HOME_REPLACE 2 -#define WILD_USE_NL 4 -#define WILD_NO_BEEP 8 -#define WILD_ADD_SLASH 16 -#define WILD_KEEP_ALL 32 -#define WILD_SILENT 64 -#define WILD_ESCAPE 128 -#define WILD_ICASE 256 +#define WILD_LIST_NOTFOUND 0x01 +#define WILD_HOME_REPLACE 0x02 +#define WILD_USE_NL 0x04 +#define WILD_NO_BEEP 0x08 +#define WILD_ADD_SLASH 0x10 +#define WILD_KEEP_ALL 0x20 +#define WILD_SILENT 0x40 +#define WILD_ESCAPE 0x80 +#define WILD_ICASE 0x100 +#define WILD_ALLLINKS 0x200 /// Present history tables typedef enum { diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 26376afa27..c095a7d27f 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -6305,7 +6305,7 @@ bool has_event(int event) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT /// @param force When true, ignore autocmd_busy /// @param group autocmd group ID or AUGROUP_ALL /// @param buf Buffer for <abuf> -/// @param exarg Ex command arguments +/// @param eap Ex command arguments /// /// @return true if some commands were executed. static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io, diff --git a/src/nvim/message.c b/src/nvim/message.c index 00f4c0a85c..1dd71baaa4 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -1396,7 +1396,8 @@ void msg_prt_line(char_u *s, int list) c = *p_extra++; } else if (has_mbyte && (l = (*mb_ptr2len)(s)) > 1) { col += (*mb_ptr2cells)(s); - if (lcs_nbsp != NUL && list && mb_ptr2char(s) == 160) { + if (lcs_nbsp != NUL && list + && (mb_ptr2char(s) == 160 || mb_ptr2char(s) == 0x202f)) { mb_char2bytes(lcs_nbsp, buf); buf[(*mb_ptr2len)(buf)] = NUL; } else { diff --git a/src/nvim/path.c b/src/nvim/path.c index 5ac3d07f67..8b9a49dfc0 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -681,11 +681,16 @@ static size_t do_path_expand(garray_T *gap, const char_u *path, /* remove backslashes for the remaining components only */ (void)do_path_expand(gap, buf, len + 1, flags, false); } else { - /* no more wildcards, check if there is a match */ - /* remove backslashes for the remaining components only */ - if (*path_end != NUL) + FileInfo file_info; + + // no more wildcards, check if there is a match + // remove backslashes for the remaining components only + if (*path_end != NUL) { backslash_halve(buf + len + 1); - if (os_file_exists(buf)) { /* add existing file */ + } + // add existing file or symbolic link + if ((flags & EW_ALLLINKS) ? os_fileinfo_link((char *)buf, &file_info) + : os_file_exists(buf)) { addfile(gap, buf, flags); } } @@ -1294,26 +1299,28 @@ expand_backtick ( return cnt; } -/* - * Add a file to a file list. Accepted flags: - * EW_DIR add directories - * EW_FILE add files - * EW_EXEC add executable files - * EW_NOTFOUND add even when it doesn't exist - * EW_ADDSLASH add slash after directory name - */ -void -addfile ( +// Add a file to a file list. Accepted flags: +// EW_DIR add directories +// EW_FILE add files +// EW_EXEC add executable files +// EW_NOTFOUND add even when it doesn't exist +// EW_ADDSLASH add slash after directory name +// EW_ALLLINKS add symlink also when the referred file does not exist +void addfile( garray_T *gap, char_u *f, /* filename */ int flags ) { bool isdir; + FileInfo file_info; - /* if the file/dir doesn't exist, may not add it */ - if (!(flags & EW_NOTFOUND) && !os_file_exists(f)) + // if the file/dir/link doesn't exist, may not add it + if (!(flags & EW_NOTFOUND) && + ((flags & EW_ALLLINKS) ? + !os_fileinfo_link((char *)f, &file_info) : !os_file_exists(f))) { return; + } #ifdef FNAME_ILLEGAL /* if the file/dir contains illegal characters, don't add it */ diff --git a/src/nvim/path.h b/src/nvim/path.h index 628ea335ed..eac367d0ac 100644 --- a/src/nvim/path.h +++ b/src/nvim/path.h @@ -20,6 +20,7 @@ #define EW_KEEPDOLLAR 0x800 /* do not escape $, $var is expanded */ /* Note: mostly EW_NOTFOUND and EW_SILENT are mutually exclusive: EW_NOTFOUND * is used when executing commands and EW_SILENT for interactive expanding. */ +#define EW_ALLLINKS 0x1000 // also links not pointing to existing file /// Return value for the comparison of two files. Also @see path_full_compare. typedef enum file_comparison { diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 1fd024a062..4020fa6e28 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -4762,48 +4762,54 @@ static int skip_to_start(int c, colnr_T *colp) */ static long find_match_text(colnr_T startcol, int regstart, char_u *match_text) { - colnr_T col = startcol; - int c1, c2; - int len1, len2; - int match; +#define PTR2LEN(x) enc_utf8 ? utf_ptr2len(x) : MB_PTR2LEN(x) - for (;; ) { - match = TRUE; - len2 = MB_CHAR2LEN(regstart); /* skip regstart */ - for (len1 = 0; match_text[len1] != NUL; len1 += MB_CHAR2LEN(c1)) { - c1 = PTR2CHAR(match_text + len1); - c2 = PTR2CHAR(regline + col + len2); - if (c1 != c2 && (!ireg_ic || vim_tolower(c1) != vim_tolower(c2))) { - match = FALSE; + colnr_T col = startcol; + int regstart_len = PTR2LEN(regline + startcol); + + for (;;) { + bool match = true; + char_u *s1 = match_text; + char_u *s2 = regline + col + regstart_len; // skip regstart + while (*s1) { + int c1_len = PTR2LEN(s1); + int c1 = PTR2CHAR(s1); + int c2_len = PTR2LEN(s2); + int c2 = PTR2CHAR(s2); + + if ((c1 != c2 && (!ireg_ic || vim_tolower(c1) != vim_tolower(c2))) || + c1_len != c2_len) { + match = false; break; } - len2 += MB_CHAR2LEN(c2); + s1 += c1_len; + s2 += c2_len; } if (match - /* check that no composing char follows */ - && !(enc_utf8 - && STRLEN(regline) > (size_t)(col + len2) - && utf_iscomposing(PTR2CHAR(regline + col + len2))) - ) { + // check that no composing char follows + && !(enc_utf8 && utf_iscomposing(PTR2CHAR(s2)))) { cleanup_subexpr(); if (REG_MULTI) { reg_startpos[0].lnum = reglnum; reg_startpos[0].col = col; reg_endpos[0].lnum = reglnum; - reg_endpos[0].col = col + len2; + reg_endpos[0].col = s2 - regline; } else { reg_startp[0] = regline + col; - reg_endp[0] = regline + col + len2; + reg_endp[0] = s2; } return 1L; } - /* Try finding regstart after the current match. */ - col += MB_CHAR2LEN(regstart); /* skip regstart */ - if (skip_to_start(regstart, &col) == FAIL) + // Try finding regstart after the current match. + col += regstart_len; // skip regstart + if (skip_to_start(regstart, &col) == FAIL) { break; + } } return 0L; + +#undef PTR2LEN } /* diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 9a64a7c3a9..c6d1ea790e 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -3202,7 +3202,8 @@ win_line ( // 'list': change char 160 to lcs_nbsp and space to lcs_space. if (wp->w_p_list - && (((c == 160 || (mb_utf8 && mb_c == 160)) && lcs_nbsp) + && (((c == 160 || (mb_utf8 && (mb_c == 160 || mb_c == 0x202f))) + && lcs_nbsp) || (c == ' ' && lcs_space && ptr - line <= trailcol))) { c = (c == ' ') ? lcs_space : lcs_nbsp; if (area_attr == 0 && search_attr == 0) { diff --git a/src/nvim/search.c b/src/nvim/search.c index 18a72524cb..d393ee7d02 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -621,43 +621,39 @@ int searchit( break; } matchcol = endpos.col; - /* for empty match: advance one char */ - if (matchcol == matchpos.col - && ptr[matchcol] != NUL) { - if (has_mbyte) - matchcol += - (*mb_ptr2len)(ptr + matchcol); - else - ++matchcol; - } + // for empty match (matchcol == matchpos.col): advance one char } else { + // Prepare to start after first matched character. matchcol = matchpos.col; - if (ptr[matchcol] != NUL) { - if (has_mbyte) - matchcol += (*mb_ptr2len)(ptr - + matchcol); - else - ++matchcol; - } } - if (matchcol == 0 && (options & SEARCH_START)) + + if (matchcol == matchpos.col && ptr[matchcol] != NUL) { + matchcol += MB_PTR2LEN(ptr + matchcol); + } + + if (matchcol == 0 && (options & SEARCH_START)) { break; - if (STRLEN(ptr) <= (size_t)matchcol || ptr[matchcol] == NUL - || (nmatched = vim_regexec_multi(®match, - win, buf, lnum + matchpos.lnum, - matchcol, - tm - )) == 0) { - match_ok = FALSE; + } + + if (ptr[matchcol] == NUL || + (nmatched = vim_regexec_multi(®match, win, buf, lnum, + matchcol, tm)) == 0) { + match_ok = false; break; } matchpos = regmatch.startpos[0]; endpos = regmatch.endpos[0]; submatch = first_submatch(®match); - /* Need to get the line pointer again, a - * multi-line search may have made it invalid. */ - ptr = ml_get_buf(buf, lnum + matchpos.lnum, FALSE); + // This while-loop only works with matchpos.lnum == 0. + // For bigger values the next line pointer ptr might not be a + // buffer line. + if (matchpos.lnum != 0) { + break; + } + // Need to get the line pointer again, a multi-line search may + // have made it invalid. + ptr = ml_get_buf(buf, lnum, false); } if (!match_ok) continue; diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile index aaa6f4b97e..e27ac227c8 100644 --- a/src/nvim/testdir/Makefile +++ b/src/nvim/testdir/Makefile @@ -22,7 +22,6 @@ SCRIPTS := test_eval.out \ test68.out test69.out \ test73.out \ test79.out \ - test83.out \ test88.out \ test_listlbr.out \ test_breakindent.out \ diff --git a/src/nvim/testdir/test83-tags2 b/src/nvim/testdir/test83-tags2 deleted file mode 100644 index 7f9f21b0eb..0000000000 --- a/src/nvim/testdir/test83-tags2 +++ /dev/null @@ -1,2 +0,0 @@ -!_TAG_FILE_ENCODING cp932 // -‚`‚a‚b Xtags2.txt /‚`‚a‚b diff --git a/src/nvim/testdir/test83-tags3 b/src/nvim/testdir/test83-tags3 deleted file mode 100644 index 0cb6591562..0000000000 --- a/src/nvim/testdir/test83-tags3 +++ /dev/null @@ -1,102 +0,0 @@ -!_TAG_FILE_SORTED 1 // -!_TAG_FILE_ENCODING cp932 // -abc1 Xtags3.txt /‚`‚a‚b -abc2 Xtags3.txt /‚`‚a‚b -abc3 Xtags3.txt /‚`‚a‚b -abc4 Xtags3.txt /‚`‚a‚b -abc5 Xtags3.txt /‚`‚a‚b -abc6 Xtags3.txt /‚`‚a‚b -abc7 Xtags3.txt /‚`‚a‚b -abc8 Xtags3.txt /‚`‚a‚b -abc9 Xtags3.txt /‚`‚a‚b -abc10 Xtags3.txt /‚`‚a‚b -abc11 Xtags3.txt /‚`‚a‚b -abc12 Xtags3.txt /‚`‚a‚b -abc13 Xtags3.txt /‚`‚a‚b -abc14 Xtags3.txt /‚`‚a‚b -abc15 Xtags3.txt /‚`‚a‚b -abc16 Xtags3.txt /‚`‚a‚b -abc17 Xtags3.txt /‚`‚a‚b -abc18 Xtags3.txt /‚`‚a‚b -abc19 Xtags3.txt /‚`‚a‚b -abc20 Xtags3.txt /‚`‚a‚b -abc21 Xtags3.txt /‚`‚a‚b -abc22 Xtags3.txt /‚`‚a‚b -abc23 Xtags3.txt /‚`‚a‚b -abc24 Xtags3.txt /‚`‚a‚b -abc25 Xtags3.txt /‚`‚a‚b -abc26 Xtags3.txt /‚`‚a‚b -abc27 Xtags3.txt /‚`‚a‚b -abc28 Xtags3.txt /‚`‚a‚b -abc29 Xtags3.txt /‚`‚a‚b -abc30 Xtags3.txt /‚`‚a‚b -abc31 Xtags3.txt /‚`‚a‚b -abc32 Xtags3.txt /‚`‚a‚b -abc33 Xtags3.txt /‚`‚a‚b -abc34 Xtags3.txt /‚`‚a‚b -abc35 Xtags3.txt /‚`‚a‚b -abc36 Xtags3.txt /‚`‚a‚b -abc37 Xtags3.txt /‚`‚a‚b -abc38 Xtags3.txt /‚`‚a‚b -abc39 Xtags3.txt /‚`‚a‚b -abc40 Xtags3.txt /‚`‚a‚b -abc41 Xtags3.txt /‚`‚a‚b -abc42 Xtags3.txt /‚`‚a‚b -abc43 Xtags3.txt /‚`‚a‚b -abc44 Xtags3.txt /‚`‚a‚b -abc45 Xtags3.txt /‚`‚a‚b -abc46 Xtags3.txt /‚`‚a‚b -abc47 Xtags3.txt /‚`‚a‚b -abc48 Xtags3.txt /‚`‚a‚b -abc49 Xtags3.txt /‚`‚a‚b -abc50 Xtags3.txt /‚`‚a‚b -abc51 Xtags3.txt /‚`‚a‚b -abc52 Xtags3.txt /‚`‚a‚b -abc53 Xtags3.txt /‚`‚a‚b -abc54 Xtags3.txt /‚`‚a‚b -abc55 Xtags3.txt /‚`‚a‚b -abc56 Xtags3.txt /‚`‚a‚b -abc57 Xtags3.txt /‚`‚a‚b -abc58 Xtags3.txt /‚`‚a‚b -abc59 Xtags3.txt /‚`‚a‚b -abc60 Xtags3.txt /‚`‚a‚b -abc61 Xtags3.txt /‚`‚a‚b -abc62 Xtags3.txt /‚`‚a‚b -abc63 Xtags3.txt /‚`‚a‚b -abc64 Xtags3.txt /‚`‚a‚b -abc65 Xtags3.txt /‚`‚a‚b -abc66 Xtags3.txt /‚`‚a‚b -abc67 Xtags3.txt /‚`‚a‚b -abc68 Xtags3.txt /‚`‚a‚b -abc69 Xtags3.txt /‚`‚a‚b -abc70 Xtags3.txt /‚`‚a‚b -abc71 Xtags3.txt /‚`‚a‚b -abc72 Xtags3.txt /‚`‚a‚b -abc73 Xtags3.txt /‚`‚a‚b -abc74 Xtags3.txt /‚`‚a‚b -abc75 Xtags3.txt /‚`‚a‚b -abc76 Xtags3.txt /‚`‚a‚b -abc77 Xtags3.txt /‚`‚a‚b -abc78 Xtags3.txt /‚`‚a‚b -abc79 Xtags3.txt /‚`‚a‚b -abc80 Xtags3.txt /‚`‚a‚b -abc81 Xtags3.txt /‚`‚a‚b -abc82 Xtags3.txt /‚`‚a‚b -abc83 Xtags3.txt /‚`‚a‚b -abc84 Xtags3.txt /‚`‚a‚b -abc85 Xtags3.txt /‚`‚a‚b -abc86 Xtags3.txt /‚`‚a‚b -abc87 Xtags3.txt /‚`‚a‚b -abc88 Xtags3.txt /‚`‚a‚b -abc89 Xtags3.txt /‚`‚a‚b -abc90 Xtags3.txt /‚`‚a‚b -abc91 Xtags3.txt /‚`‚a‚b -abc92 Xtags3.txt /‚`‚a‚b -abc93 Xtags3.txt /‚`‚a‚b -abc94 Xtags3.txt /‚`‚a‚b -abc95 Xtags3.txt /‚`‚a‚b -abc96 Xtags3.txt /‚`‚a‚b -abc97 Xtags3.txt /‚`‚a‚b -abc98 Xtags3.txt /‚`‚a‚b -abc99 Xtags3.txt /‚`‚a‚b -abc100 Xtags3.txt /‚`‚a‚b diff --git a/src/nvim/testdir/test83.in b/src/nvim/testdir/test83.in deleted file mode 100644 index d54b1bcddd..0000000000 --- a/src/nvim/testdir/test83.in +++ /dev/null @@ -1,75 +0,0 @@ -Tests for tag search with !_TAG_FILE_ENCODING. - -STARTTEST -:so mbyte.vim -:if !has('iconv') || iconv("\x82\x60", "cp932", "utf-8") != "\uff21" -: e! test.ok -: w! test.out -: qa! -:endif - -:/^text for tags1$/,/^text for tags1$/+1w! Xtags1.txt -:/^text for tags2$/,/^text for tags2$/+1w! Xtags2.txt -:/^text for tags3$/,/^text for tags3$/+1w! Xtags3.txt -:/^tags1$/+1,/^tags1-end$/-1w! Xtags1 - -ggdG - -:call setline('.', 'Results of test83') - -:" case1: -:new -:set tags=Xtags1 -:let v:errmsg = '' -:tag abcdefghijklmnopqrs -:if v:errmsg =~ 'E426:' || getline('.') != 'abcdefghijklmnopqrs' -: close -: put ='case1: failed' -:else -: close -: put ='case1: ok' -:endif - -:" case2: -:new -:set tags=test83-tags2 -:let v:errmsg = '' -:tag /.BC -:if v:errmsg =~ 'E426:' || getline('.') != 'ABC' -: close -: put ='case2: failed' -:else -: close -: put ='case2: ok' -:endif - -:" case3: -:new -:set tags=test83-tags3 -:let v:errmsg = '' -:tag abc50 -:if v:errmsg =~ 'E426:' || getline('.') != 'ABC' -: close -: put ='case3: failed' -:else -: close -: put ='case3: ok' -:endif -:close - -:wq! test.out -ENDTEST - -text for tags1 -abcdefghijklmnopqrs - -text for tags2 -ABC - -text for tags3 -ABC - -tags1 -!_TAG_FILE_ENCODING utf-8 // -abcdefghijklmnopqrs Xtags1.txt /abcdefghijklmnopqrs -tags1-end diff --git a/src/nvim/testdir/test83.ok b/src/nvim/testdir/test83.ok deleted file mode 100644 index 61a1a04a18..0000000000 --- a/src/nvim/testdir/test83.ok +++ /dev/null @@ -1,4 +0,0 @@ -Results of test83 -case1: ok -case2: ok -case3: ok diff --git a/src/nvim/version.c b/src/nvim/version.c index 03fa3ca9df..178d242587 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -385,7 +385,7 @@ static int included_patches[] = { // 742, // 741, // 740, - // 739, + 739, // 738 NA // 737, 736, @@ -402,7 +402,7 @@ static int included_patches[] = { // 725, // 724 NA 723, - // 722, + 722, 721, // 720 NA 719, @@ -444,7 +444,7 @@ static int included_patches[] = { // 683 NA 682, // 681 NA - // 680, + 680, // 679 NA // 678 NA // 677 NA @@ -468,9 +468,9 @@ static int included_patches[] = { 659, 658, // 657 NA - // 656, + 656, 655, - // 654, + 654, 653, // 652 NA 651, diff --git a/src/nvim/window.c b/src/nvim/window.c index f0c6cacdf0..853f8755c3 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -1044,19 +1044,21 @@ static void win_init_some(win_T *newp, win_T *oldp) } -/* - * Check if "win" is a pointer to an existing window. - */ -int win_valid(win_T *win) +/// Check if "win" is a pointer to an existing window in the current tabpage. +/// +/// @param win window to check +bool win_valid(win_T *win) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { - if (win == NULL) - return FALSE; + if (win == NULL) { + return false; + } + FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { if (wp == win) { - return TRUE; + return true; } } - return FALSE; + return false; } /* @@ -1732,21 +1734,18 @@ close_windows ( shell_new_rows(); } -/* - * Return TRUE if the current window is the only window that exists (ignoring - * "aucmd_win"). - * Returns FALSE if there is a window, possibly in another tab page. - */ -static int last_window(void) +/// Check that current window is the last one. +/// +/// @return true if the current window is the only window that exists, false if +/// there is another, possibly in another tab page. +static bool last_window(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { return one_window() && first_tabpage->tp_next == NULL; } -/* - * Return TRUE if there is only one window other than "aucmd_win" in the - * current tab page. - */ -bool one_window(void) +/// Check that current tab page contains no more then one window other than +/// "aucmd_win". +bool one_window(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { bool seen_one = false; @@ -1761,14 +1760,20 @@ bool one_window(void) return true; } -/* - * Close the possibly last window in a tab page. - * Returns TRUE when the window was closed already. - */ -static int close_last_window_tabpage(win_T *win, int free_buf, tabpage_T *prev_curtab) +/// Close the possibly last window in a tab page. +/// +/// @param win window to close +/// @param free_buf whether to free the window's current buffer +/// @param prev_curtab previous tabpage that will be closed if "win" is the +/// last window in the tabpage +/// +/// @return true when the window was closed already. +static bool close_last_window_tabpage(win_T *win, bool free_buf, + tabpage_T *prev_curtab) + FUNC_ATTR_NONNULL_ARG(1) { if (firstwin != lastwin) { - return FALSE; + return false; } buf_T *old_curbuf = curbuf; @@ -1809,14 +1814,15 @@ static int close_last_window_tabpage(win_T *win, int free_buf, tabpage_T *prev_c terminal_resize(term, 0, 0); } - /* Since goto_tabpage_tp above did not trigger *Enter autocommands, do - * that now. */ - apply_autocmds(EVENT_TABCLOSED, prev_idx, prev_idx, FALSE, curbuf); - apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf); - apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); - if (old_curbuf != curbuf) - apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf); - return TRUE; + // Since goto_tabpage_tp above did not trigger *Enter autocommands, do + // that now. + apply_autocmds(EVENT_TABCLOSED, prev_idx, prev_idx, false, curbuf); + apply_autocmds(EVENT_WINENTER, NULL, NULL, false, curbuf); + apply_autocmds(EVENT_TABENTER, NULL, NULL, false, curbuf); + if (old_curbuf != curbuf) { + apply_autocmds(EVENT_BUFENTER, NULL, NULL, false, curbuf); + } + return true; } /* @@ -2301,20 +2307,22 @@ static win_T *frame2win(frame_T *frp) return frp->fr_win; } -/* - * Return TRUE if frame "frp" contains window "wp". - */ -static int frame_has_win(frame_T *frp, win_T *wp) +/// Check that the frame "frp" contains the window "wp". +/// +/// @param frp frame +/// @param wp window +static bool frame_has_win(frame_T *frp, win_T *wp) + FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ARG(1) { - frame_T *p; - - if (frp->fr_layout == FR_LEAF) + if (frp->fr_layout == FR_LEAF) { return frp->fr_win == wp; - - for (p = frp->fr_child; p != NULL; p = p->fr_next) - if (frame_has_win(p, wp)) - return TRUE; - return FALSE; + } + for (frame_T *p = frp->fr_child; p != NULL; p = p->fr_next) { + if (frame_has_win(p, wp)) { + return true; + } + } + return false; } /* @@ -2406,58 +2414,72 @@ frame_new_height ( topfrp->fr_height = height; } -/* - * Return TRUE if height of frame "frp" should not be changed because of - * the 'winfixheight' option. - */ -static int frame_fixed_height(frame_T *frp) +/// Return true if height of frame "frp" should not be changed because of +/// the 'winfixheight' option. +/// +/// @param frp frame +/// +/// @return true if the frame has a fixed height +static bool frame_fixed_height(frame_T *frp) + FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL { - /* frame with one window: fixed height if 'winfixheight' set. */ - if (frp->fr_win != NULL) + // frame with one window: fixed height if 'winfixheight' set. + if (frp->fr_win != NULL) { return frp->fr_win->w_p_wfh; - + } if (frp->fr_layout == FR_ROW) { - /* The frame is fixed height if one of the frames in the row is fixed - * height. */ - for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) - if (frame_fixed_height(frp)) - return TRUE; - return FALSE; + // The frame is fixed height if one of the frames in the row is fixed + // height. + for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) { + if (frame_fixed_height(frp)) { + return true; + } + } + return false; } - /* frp->fr_layout == FR_COL: The frame is fixed height if all of the - * frames in the row are fixed height. */ - for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) - if (!frame_fixed_height(frp)) - return FALSE; - return TRUE; + // frp->fr_layout == FR_COL: The frame is fixed height if all of the + // frames in the row are fixed height. + for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) { + if (!frame_fixed_height(frp)) { + return false; + } + } + return true; } -/* - * Return TRUE if width of frame "frp" should not be changed because of - * the 'winfixwidth' option. - */ -static int frame_fixed_width(frame_T *frp) +/// Return true if width of frame "frp" should not be changed because of +/// the 'winfixwidth' option. +/// +/// @param frp frame +/// +/// @return true if the frame has a fixed width +static bool frame_fixed_width(frame_T *frp) + FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL { - /* frame with one window: fixed width if 'winfixwidth' set. */ - if (frp->fr_win != NULL) + // frame with one window: fixed width if 'winfixwidth' set. + if (frp->fr_win != NULL) { return frp->fr_win->w_p_wfw; - + } if (frp->fr_layout == FR_COL) { - /* The frame is fixed width if one of the frames in the row is fixed - * width. */ - for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) - if (frame_fixed_width(frp)) - return TRUE; - return FALSE; + // The frame is fixed width if one of the frames in the row is fixed + // width. + for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) { + if (frame_fixed_width(frp)) { + return true; + } + } + return false; } - /* frp->fr_layout == FR_ROW: The frame is fixed width if all of the - * frames in the row are fixed width. */ - for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) - if (!frame_fixed_width(frp)) - return FALSE; - return TRUE; + // frp->fr_layout == FR_ROW: The frame is fixed width if all of the + // frames in the row are fixed width. + for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) { + if (!frame_fixed_width(frp)) { + return false; + } + } + return true; } /* @@ -3028,10 +3050,10 @@ int make_tabpages(int maxcount) return count - todo; } -/* - * Return TRUE when "tpc" points to a valid tab page. - */ -bool valid_tabpage(tabpage_T *tpc) +/// Check that tpc points to a valid tab page. +/// +/// @param[in] tpc Tabpage to check. +bool valid_tabpage(tabpage_T *tpc) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { FOR_ALL_TABS(tp) { if (tp == tpc) { @@ -5052,27 +5074,22 @@ int min_rows(void) return total; } -/* - * Return TRUE if there is only one window (in the current tab page), not - * counting a help or preview window, unless it is the current window. - * Does not count "aucmd_win". - */ -int only_one_window(void) +/// Check that there is only one window (and only one tab page), not counting a +/// help or preview window, unless it is the current window. Does not count +/// "aucmd_win". +bool only_one_window(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { - int count = 0; - - /* If there is another tab page there always is another window. */ - if (first_tabpage->tp_next != NULL) - return FALSE; + // If there is another tab page there always is another window. + if (first_tabpage->tp_next != NULL) { + return false; + } + int count = 0; FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { if (wp->w_buffer != NULL && (!((wp->w_buffer->b_help && !curbuf->b_help) - || wp->w_p_pvw - ) || wp == curwin) - && wp != aucmd_win - ) { - ++count; + || wp->w_p_pvw) || wp == curwin) && wp != aucmd_win) { + count++; } } return count <= 1; @@ -5571,38 +5588,42 @@ matchitem_T *get_match(win_T *wp, int id) } -/* - * Return TRUE if "topfrp" and its children are at the right height. - */ -static int frame_check_height(frame_T *topfrp, int height) +/// Check that "topfrp" and its children are at the right height. +/// +/// @param topfrp top frame pointer +/// @param height expected height +static bool frame_check_height(frame_T *topfrp, int height) + FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL { - frame_T *frp; - - if (topfrp->fr_height != height) - return FALSE; - - if (topfrp->fr_layout == FR_ROW) - for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) - if (frp->fr_height != height) - return FALSE; - - return TRUE; + if (topfrp->fr_height != height) { + return false; + } + if (topfrp->fr_layout == FR_ROW) { + for (frame_T *frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { + if (frp->fr_height != height) { + return false; + } + } + } + return true; } -/* - * Return TRUE if "topfrp" and its children are at the right width. - */ -static int frame_check_width(frame_T *topfrp, int width) +/// Check that "topfrp" and its children are at the right width. +/// +/// @param topfrp top frame pointer +/// @param width expected width +static bool frame_check_width(frame_T *topfrp, int width) + FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL { - frame_T *frp; - - if (topfrp->fr_width != width) - return FALSE; - - if (topfrp->fr_layout == FR_COL) - for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) - if (frp->fr_width != width) - return FALSE; - - return TRUE; + if (topfrp->fr_width != width) { + return false; + } + if (topfrp->fr_layout == FR_COL) { + for (frame_T *frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { + if (frp->fr_width != width) { + return false; + } + } + } + return true; } |