diff options
author | Sam Bingner <sam@bingner.com> | 2019-06-05 22:02:50 -1000 |
---|---|---|
committer | Sam Bingner <sam@bingner.com> | 2019-06-05 22:02:50 -1000 |
commit | a255618e22152ca2e5fd361a3d0762e9db20dd80 (patch) | |
tree | 5c98f76c0de0785b8d5b58ac622da34f0d024a8f /data/vim/patches/8.1.0874 | |
parent | 1b1fa61507a809a66f053a8523f883b2b6a2f487 (diff) |
Update vim to 8.1.1471
Diffstat (limited to 'data/vim/patches/8.1.0874')
-rw-r--r-- | data/vim/patches/8.1.0874 | 5682 |
1 files changed, 5682 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0874 b/data/vim/patches/8.1.0874 new file mode 100644 index 000000000..ef4c3987b --- /dev/null +++ b/data/vim/patches/8.1.0874 @@ -0,0 +1,5682 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0874 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.0874 +Problem: Using old style comments in new file. +Solution: Convert to // comments in new file. (Yegappan Lakshmanan) +Files: src/indent.c + + +*** ../vim-8.1.0873/src/indent.c 2019-01-31 13:47:51.122632648 +0100 +--- src/indent.c 2019-02-04 20:28:25.798161568 +0100 +*************** +*** 59,71 **** + * Return NULL when not inside a comment. + */ + static pos_T * +! ind_find_start_comment(void) /* XXX */ + { + return find_start_comment(curbuf->b_ind_maxcomment); + } + + pos_T * +! find_start_comment(int ind_maxcomment) /* XXX */ + { + pos_T *pos; + char_u *line; +--- 59,71 ---- + * Return NULL when not inside a comment. + */ + static pos_T * +! ind_find_start_comment(void) // XXX + { + return find_start_comment(curbuf->b_ind_maxcomment); + } + + pos_T * +! find_start_comment(int ind_maxcomment) // XXX + { + pos_T *pos; + char_u *line; +*************** +*** 78,87 **** + if (pos == NULL) + break; + +! /* +! * Check if the comment start we found is inside a string. +! * If it is then restrict the search to below this line and try again. +! */ + line = ml_get(pos->lnum); + for (p = line; *p && (colnr_T)(p - line) < pos->col; ++p) + p = skip_string(p); +--- 78,85 ---- + if (pos == NULL) + break; + +! // Check if the comment start we found is inside a string. +! // If it is then restrict the search to below this line and try again. + line = ml_get(pos->lnum); + for (p = line; *p && (colnr_T)(p - line) < pos->col; ++p) + p = skip_string(p); +*************** +*** 106,112 **** + * "CORS" -> Comment Or Raw String + */ + static pos_T * +! ind_find_start_CORS(linenr_T *is_raw) /* XXX */ + { + static pos_T comment_pos_copy; + pos_T *comment_pos; +--- 104,110 ---- + * "CORS" -> Comment Or Raw String + */ + static pos_T * +! ind_find_start_CORS(linenr_T *is_raw) // XXX + { + static pos_T comment_pos_copy; + pos_T *comment_pos; +*************** +*** 115,129 **** + comment_pos = find_start_comment(curbuf->b_ind_maxcomment); + if (comment_pos != NULL) + { +! /* Need to make a copy of the static pos in findmatchlimit(), +! * calling find_start_rawstring() may change it. */ + comment_pos_copy = *comment_pos; + comment_pos = &comment_pos_copy; + } + rs_pos = find_start_rawstring(curbuf->b_ind_maxcomment); + +! /* If comment_pos is before rs_pos the raw string is inside the comment. +! * If rs_pos is before comment_pos the comment is inside the raw string. */ + if (comment_pos == NULL || (rs_pos != NULL + && LT_POS(*rs_pos, *comment_pos))) + { +--- 113,127 ---- + comment_pos = find_start_comment(curbuf->b_ind_maxcomment); + if (comment_pos != NULL) + { +! // Need to make a copy of the static pos in findmatchlimit(), +! // calling find_start_rawstring() may change it. + comment_pos_copy = *comment_pos; + comment_pos = &comment_pos_copy; + } + rs_pos = find_start_rawstring(curbuf->b_ind_maxcomment); + +! // If comment_pos is before rs_pos the raw string is inside the comment. +! // If rs_pos is before comment_pos the comment is inside the raw string. + if (comment_pos == NULL || (rs_pos != NULL + && LT_POS(*rs_pos, *comment_pos))) + { +*************** +*** 140,146 **** + * Return NULL when not inside a raw string. + */ + static pos_T * +! find_start_rawstring(int ind_maxcomment) /* XXX */ + { + pos_T *pos; + char_u *line; +--- 138,144 ---- + * Return NULL when not inside a raw string. + */ + static pos_T * +! find_start_rawstring(int ind_maxcomment) // XXX + { + pos_T *pos; + char_u *line; +*************** +*** 153,162 **** + if (pos == NULL) + break; + +! /* +! * Check if the raw string start we found is inside a string. +! * If it is then restrict the search to below this line and try again. +! */ + line = ml_get(pos->lnum); + for (p = line; *p && (colnr_T)(p - line) < pos->col; ++p) + p = skip_string(p); +--- 151,158 ---- + if (pos == NULL) + break; + +! // Check if the raw string start we found is inside a string. +! // If it is then restrict the search to below this line and try again. + line = ml_get(pos->lnum); + for (p = line; *p && (colnr_T)(p - line) < pos->col; ++p) + p = skip_string(p); +*************** +*** 181,223 **** + { + int i; + +! /* +! * We loop, because strings may be concatenated: "date""time". +! */ + for ( ; ; ++p) + { +! if (p[0] == '\'') /* 'c' or '\n' or '\000' */ + { +! if (!p[1]) /* ' at end of line */ + break; + i = 2; +! if (p[1] == '\\') /* '\n' or '\000' */ + { + ++i; +! while (vim_isdigit(p[i - 1])) /* '\000' */ + ++i; + } +! if (p[i] == '\'') /* check for trailing ' */ + { + p += i; + continue; + } + } +! else if (p[0] == '"') /* start of string */ + { + for (++p; p[0]; ++p) + { + if (p[0] == '\\' && p[1] != NUL) + ++p; +! else if (p[0] == '"') /* end of string */ + break; + } + if (p[0] == '"') +! continue; /* continue for another string */ + } + else if (p[0] == 'R' && p[1] == '"') + { +! /* Raw string: R"[delim](...)[delim]" */ + char_u *delim = p + 2; + char_u *paren = vim_strchr(delim, '('); + +--- 177,217 ---- + { + int i; + +! // We loop, because strings may be concatenated: "date""time". + for ( ; ; ++p) + { +! if (p[0] == '\'') // 'c' or '\n' or '\000' + { +! if (!p[1]) // ' at end of line + break; + i = 2; +! if (p[1] == '\\') // '\n' or '\000' + { + ++i; +! while (vim_isdigit(p[i - 1])) // '\000' + ++i; + } +! if (p[i] == '\'') // check for trailing ' + { + p += i; + continue; + } + } +! else if (p[0] == '"') // start of string + { + for (++p; p[0]; ++p) + { + if (p[0] == '\\' && p[1] != NUL) + ++p; +! else if (p[0] == '"') // end of string + break; + } + if (p[0] == '"') +! continue; // continue for another string + } + else if (p[0] == 'R' && p[1] == '"') + { +! // Raw string: R"[delim](...)[delim]" + char_u *delim = p + 2; + char_u *paren = vim_strchr(delim, '('); + +*************** +*** 233,248 **** + break; + } + if (p[0] == '"') +! continue; /* continue for another string */ + } + } +! break; /* no string found */ + } + if (!*p) +! --p; /* backup from NUL */ + return p; + } +! #endif /* FEAT_CINDENT || FEAT_SYN_HL */ + + #if defined(FEAT_CINDENT) || defined(PROTO) + +--- 227,242 ---- + break; + } + if (p[0] == '"') +! continue; // continue for another string + } + } +! break; // no string found + } + if (!*p) +! --p; // backup from NUL + return p; + } +! #endif // FEAT_CINDENT || FEAT_SYN_HL + + #if defined(FEAT_CINDENT) || defined(PROTO) + +*************** +*** 259,265 **** + )); + } + +! /* Find result cache for cpp_baseclass */ + typedef struct { + int found; + lpos_T lpos; +--- 253,259 ---- + )); + } + +! // Find result cache for cpp_baseclass + typedef struct { + int found; + lpos_T lpos; +*************** +*** 299,306 **** + + s = skipwhite(s); + +! /* Perl/shell # comment comment continues until eol. Require a space +! * before # to avoid recognizing $#array. */ + if (curbuf->b_ind_hash_comment != 0 && s != prev_s && *s == '#') + { + s += STRLEN(s); +--- 293,300 ---- + + s = skipwhite(s); + +! // Perl/shell # comment comment continues until eol. Require a space +! // before # to avoid recognizing $#array. + if (curbuf->b_ind_hash_comment != 0 && s != prev_s && *s == '#') + { + s += STRLEN(s); +*************** +*** 309,322 **** + if (*s != '/') + break; + ++s; +! if (*s == '/') /* slash-slash comment continues till eol */ + { + s += STRLEN(s); + break; + } + if (*s != '*') + break; +! for (++s; *s; ++s) /* skip slash-star comment */ + if (s[0] == '*' && s[1] == '/') + { + s += 2; +--- 303,316 ---- + if (*s != '/') + break; + ++s; +! if (*s == '/') // slash-slash comment continues till eol + { + s += STRLEN(s); + break; + } + if (*s != '*') + break; +! for (++s; *s; ++s) // skip slash-star comment + if (s[0] == '*' && s[1] == '/') + { + s += 2; +*************** +*** 340,346 **** + * Check previous lines for a "//" line comment, skipping over blank lines. + */ + static pos_T * +! find_line_comment(void) /* XXX */ + { + static pos_T pos; + char_u *line; +--- 334,340 ---- + * Check previous lines for a "//" line comment, skipping over blank lines. + */ + static pos_T * +! find_line_comment(void) // XXX + { + static pos_T pos; + char_u *line; +*************** +*** 373,383 **** + + if (*s == '\'' || *s == '"') + { +! /* can be 'key': or "key": */ + quote = *s; + ++s; + } +! if (!vim_isIDc(*s)) /* need at least one ID character */ + return FALSE; + + while (vim_isIDc(*s)) +--- 367,377 ---- + + if (*s == '\'' || *s == '"') + { +! // can be 'key': or "key": + quote = *s; + ++s; + } +! if (!vim_isIDc(*s)) // need at least one ID character + return FALSE; + + while (vim_isIDc(*s)) +*************** +*** 387,393 **** + + s = cin_skipcomment(s); + +! /* "::" is not a label, it's C++ */ + return (*s == ':' && s[1] != ':'); + } + +--- 381,387 ---- + + s = cin_skipcomment(s); + +! // "::" is not a label, it's C++ + return (*s == ':' && s[1] != ':'); + } + +*************** +*** 398,404 **** + static int + cin_islabel_skip(char_u **s) + { +! if (!vim_isIDc(**s)) /* need at least one ID character */ + return FALSE; + + while (vim_isIDc(**s)) +--- 392,398 ---- + static int + cin_islabel_skip(char_u **s) + { +! if (!vim_isIDc(**s)) // need at least one ID character + return FALSE; + + while (vim_isIDc(**s)) +*************** +*** 406,412 **** + + *s = cin_skipcomment(*s); + +! /* "::" is not a label, it's C++ */ + return (**s == ':' && *++*s != ':'); + } + +--- 400,406 ---- + + *s = cin_skipcomment(*s); + +! // "::" is not a label, it's C++ + return (**s == ':' && *++*s != ':'); + } + +*************** +*** 415,430 **** + * Note: curwin->w_cursor must be where we are looking for the label. + */ + int +! cin_islabel(void) /* XXX */ + { + char_u *s; + + s = cin_skipcomment(ml_get_curline()); + +! /* +! * Exclude "default" from labels, since it should be indented +! * like a switch label. Same for C++ scope declarations. +! */ + if (cin_isdefault(s)) + return FALSE; + if (cin_isscopedecl(s)) +--- 409,422 ---- + * Note: curwin->w_cursor must be where we are looking for the label. + */ + int +! cin_islabel(void) // XXX + { + char_u *s; + + s = cin_skipcomment(ml_get_curline()); + +! // Exclude "default" from labels, since it should be indented +! // like a switch label. Same for C++ scope declarations. + if (cin_isdefault(s)) + return FALSE; + if (cin_isscopedecl(s)) +*************** +*** 432,441 **** + + if (cin_islabel_skip(&s)) + { +! /* +! * Only accept a label if the previous line is terminated or is a case +! * label. +! */ + pos_T cursor_save; + pos_T *trypos; + char_u *line; +--- 424,431 ---- + + if (cin_islabel_skip(&s)) + { +! // Only accept a label if the previous line is terminated or is a case +! // label. + pos_T cursor_save; + pos_T *trypos; + char_u *line; +*************** +*** 445,460 **** + { + --curwin->w_cursor.lnum; + +! /* +! * If we're in a comment or raw string now, skip to the start of +! * it. +! */ + curwin->w_cursor.col = 0; +! if ((trypos = ind_find_start_CORS(NULL)) != NULL) /* XXX */ + curwin->w_cursor = *trypos; + + line = ml_get_curline(); +! if (cin_ispreproc(line)) /* ignore #defines, #if, etc. */ + continue; + if (*(line = cin_skipcomment(line)) == NUL) + continue; +--- 435,448 ---- + { + --curwin->w_cursor.lnum; + +! // If we're in a comment or raw string now, skip to the start of +! // it. + curwin->w_cursor.col = 0; +! if ((trypos = ind_find_start_CORS(NULL)) != NULL) // XXX + curwin->w_cursor = *trypos; + + line = ml_get_curline(); +! if (cin_ispreproc(line)) // ignore #defines, #if, etc. + continue; + if (*(line = cin_skipcomment(line)) == NUL) + continue; +*************** +*** 468,474 **** + return FALSE; + } + curwin->w_cursor = cursor_save; +! return TRUE; /* label at start of file??? */ + } + return FALSE; + } +--- 456,462 ---- + return FALSE; + } + curwin->w_cursor = cursor_save; +! return TRUE; // label at start of file??? + } + return FALSE; + } +*************** +*** 522,528 **** + int + cin_iscase( + char_u *s, +! int strict) /* Allow relaxed check of case statement for JS */ + { + s = cin_skipcomment(s); + if (cin_starts_with(s, "case")) +--- 510,516 ---- + int + cin_iscase( + char_u *s, +! int strict) // Allow relaxed check of case statement for JS + { + s = cin_skipcomment(s); + if (cin_starts_with(s, "case")) +*************** +*** 532,551 **** + s = cin_skipcomment(s); + if (*s == ':') + { +! if (s[1] == ':') /* skip over "::" for C++ */ + ++s; + else + return TRUE; + } + if (*s == '\'' && s[1] && s[2] == '\'') +! s += 2; /* skip over ':' */ + else if (*s == '/' && (s[1] == '*' || s[1] == '/')) +! return FALSE; /* stop at comment */ + else if (*s == '"') + { +! /* JS etc. */ + if (strict) +! return FALSE; /* stop at string */ + else + return TRUE; + } +--- 520,539 ---- + s = cin_skipcomment(s); + if (*s == ':') + { +! if (s[1] == ':') // skip over "::" for C++ + ++s; + else + return TRUE; + } + if (*s == '\'' && s[1] && s[2] == '\'') +! s += 2; // skip over ':' + else if (*s == '/' && (s[1] == '*' || s[1] == '/')) +! return FALSE; // stop at comment + else if (*s == '"') + { +! // JS etc. + if (strict) +! return FALSE; // stop at string + else + return TRUE; + } +*************** +*** 589,595 **** + return (*(s = cin_skipcomment(s + i)) == ':' && s[1] != ':'); + } + +! /* Maximum number of lines to search back for a "namespace" line. */ + #define FIND_NAMESPACE_LIM 20 + + /* +--- 577,583 ---- + return (*(s = cin_skipcomment(s + i)) == ':' && s[1] != ':'); + } + +! // Maximum number of lines to search back for a "namespace" line. + #define FIND_NAMESPACE_LIM 20 + + /* +*************** +*** 610,616 **** + { + if (VIM_ISWHITE(*p)) + { +! has_name = TRUE; /* found end of a name */ + p = cin_skipcomment(skipwhite(p)); + } + else if (*p == '{') +--- 598,604 ---- + { + if (VIM_ISWHITE(*p)) + { +! has_name = TRUE; // found end of a name + p = cin_skipcomment(skipwhite(p)); + } + else if (*p == '{') +*************** +*** 621,634 **** + { + has_name_start = TRUE; + if (has_name) +! return FALSE; /* word character after skipping past name */ + ++p; + } + else if (p[0] == ':' && p[1] == ':' && vim_iswordc(p[2])) + { + if (!has_name_start || has_name) + return FALSE; +! /* C++ 17 nested namespace */ + p += 3; + } + else +--- 609,622 ---- + { + has_name_start = TRUE; + if (has_name) +! return FALSE; // word character after skipping past name + ++p; + } + else if (p[0] == ':' && p[1] == ':' && vim_iswordc(p[2])) + { + if (!has_name_start || has_name) + return FALSE; +! // C++ 17 nested namespace + p += 3; + } + else +*************** +*** 702,714 **** + { + if (*l == ':') + { +! if (l[1] == ':') /* skip over "::" for C++ */ + ++l; + else if (!cin_iscase(l + 1, FALSE)) + break; + } + else if (*l == '\'' && l[1] && l[2] == '\'') +! l += 2; /* skip over 'x' */ + } + if (*l == NUL) + return NULL; +--- 690,702 ---- + { + if (*l == ':') + { +! if (l[1] == ':') // skip over "::" for C++ + ++l; + else if (!cin_iscase(l + 1, FALSE)) + break; + } + else if (*l == '\'' && l[1] && l[2] == '\'') +! l += 2; // skip over 'x' + } + if (*l == NUL) + return NULL; +*************** +*** 723,729 **** + * Return 0 if there is nothing after the label. + */ + static int +! get_indent_nolabel (linenr_T lnum) /* XXX */ + { + char_u *l; + pos_T fp; +--- 711,717 ---- + * Return 0 if there is nothing after the label. + */ + static int +! get_indent_nolabel (linenr_T lnum) // XXX + { + char_u *l; + pos_T fp; +*************** +*** 757,768 **** + cursor_save = curwin->w_cursor; + curwin->w_cursor.lnum = lnum; + l = ml_get_curline(); +! /* XXX */ + if (cin_iscase(l, FALSE) || cin_isscopedecl(l) || cin_islabel()) + { + amount = get_indent_nolabel(lnum); + l = after_label(ml_get_curline()); +! if (l == NULL) /* just in case */ + l = ml_get_curline(); + } + else +--- 745,756 ---- + cursor_save = curwin->w_cursor; + curwin->w_cursor.lnum = lnum; + l = ml_get_curline(); +! // XXX + if (cin_iscase(l, FALSE) || cin_isscopedecl(l) || cin_islabel()) + { + amount = get_indent_nolabel(lnum); + l = after_label(ml_get_curline()); +! if (l == NULL) // just in case + l = ml_get_curline(); + } + else +*************** +*** 852,858 **** + line = s = ml_get(lnum); + while (*s != NUL && vim_strchr((char_u *)"=;{}\"'", *s) == NULL) + { +! if (cin_iscomment(s)) /* ignore comments */ + s = cin_skipcomment(s); + else + ++s; +--- 840,846 ---- + line = s = ml_get(lnum); + while (*s != NUL && vim_strchr((char_u *)"=;{}\"'", *s) == NULL) + { +! if (cin_iscomment(s)) // ignore comments + s = cin_skipcomment(s); + else + ++s; +*************** +*** 864,870 **** + if (cin_nocode(s)) + return 0; + +! if (*s == '"') /* nice alignment for continued strings */ + ++s; + + fp.lnum = lnum; +--- 852,858 ---- + if (cin_nocode(s)) + return 0; + +! if (*s == '"') // nice alignment for continued strings + ++s; + + fp.lnum = lnum; +*************** +*** 953,960 **** + static int + cin_isterminated( + char_u *s, +! int incl_open, /* include '{' at the end as terminator */ +! int incl_comma) /* recognize a trailing comma */ + { + char_u found_start = 0; + unsigned n_open = 0; +--- 941,948 ---- + static int + cin_isterminated( + char_u *s, +! int incl_open, // include '{' at the end as terminator +! int incl_comma) // recognize a trailing comma + { + char_u found_start = 0; + unsigned n_open = 0; +*************** +*** 970,976 **** + + while (*s) + { +! /* skip over comments, "" strings and 'c'haracters */ + s = skip_string(cin_skipcomment(s)); + if (*s == '}' && n_open > 0) + --n_open; +--- 958,964 ---- + + while (*s) + { +! // skip over comments, "" strings and 'c'haracters + s = skip_string(cin_skipcomment(s)); + if (*s == '}' && n_open > 0) + --n_open; +*************** +*** 1035,1072 **** + } + curwin->w_cursor.lnum = save_lnum; + +! /* Ignore line starting with #. */ + if (cin_ispreproc(s)) + return FALSE; + + while (*s && *s != '(' && *s != ';' && *s != '\'' && *s != '"') + { +! if (cin_iscomment(s)) /* ignore comments */ + s = cin_skipcomment(s); + else if (*s == ':') + { + if (*(s + 1) == ':') + s += 2; + else +! /* To avoid a mistake in the following situation: +! * A::A(int a, int b) +! * : a(0) // <--not a function decl +! * , b(0) +! * {... +! */ + return FALSE; + } + else + ++s; + } + if (*s != '(') +! return FALSE; /* ';', ' or " before any () or no '(' */ + + while (*s && *s != ';' && *s != '\'' && *s != '"') + { + if (*s == ')' && cin_nocode(s + 1)) + { +! /* ')' at the end: may have found a match + * Check for he previous line not to end in a backslash: + * #if defined(x) && \ + * defined(y) +--- 1023,1060 ---- + } + curwin->w_cursor.lnum = save_lnum; + +! // Ignore line starting with #. + if (cin_ispreproc(s)) + return FALSE; + + while (*s && *s != '(' && *s != ';' && *s != '\'' && *s != '"') + { +! if (cin_iscomment(s)) // ignore comments + s = cin_skipcomment(s); + else if (*s == ':') + { + if (*(s + 1) == ':') + s += 2; + else +! // To avoid a mistake in the following situation: +! // A::A(int a, int b) +! // : a(0) // <--not a function decl +! // , b(0) +! // {... + return FALSE; + } + else + ++s; + } + if (*s != '(') +! return FALSE; // ';', ' or " before any () or no '(' + + while (*s && *s != ';' && *s != '\'' && *s != '"') + { + if (*s == ')' && cin_nocode(s + 1)) + { +! /* +! * ')' at the end: may have found a match + * Check for he previous line not to end in a backslash: + * #if defined(x) && \ + * defined(y) +*************** +*** 1081,1090 **** + { + int comma = (*s == ','); + +! /* ',' at the end: continue looking in the next line. +! * At the end: check for ',' in the next line, for this style: +! * func(arg1 +! * , arg2) */ + for (;;) + { + if (lnum >= curbuf->b_ml.ml_line_count) +--- 1069,1078 ---- + { + int comma = (*s == ','); + +! // ',' at the end: continue looking in the next line. +! // At the end: check for ',' in the next line, for this style: +! // func(arg1 +! // , arg2) + for (;;) + { + if (lnum >= curbuf->b_ml.ml_line_count) +*************** +*** 1095,1108 **** + } + if (lnum >= curbuf->b_ml.ml_line_count) + break; +! /* Require a comma at end of the line or a comma or ')' at the +! * start of next line. */ + s = skipwhite(s); + if (!just_started && (!comma && *s != ',' && *s != ')')) + break; + just_started = FALSE; + } +! else if (cin_iscomment(s)) /* ignore comments */ + s = cin_skipcomment(s); + else + { +--- 1083,1096 ---- + } + if (lnum >= curbuf->b_ml.ml_line_count) + break; +! // Require a comma at end of the line or a comma or ')' at the +! // start of next line. + s = skipwhite(s); + if (!just_started && (!comma && *s != ',' && *s != ')')) + break; + just_started = FALSE; + } +! else if (cin_iscomment(s)) // ignore comments + s = cin_skipcomment(s); + else + { +*************** +*** 1128,1134 **** + cin_iselse( + char_u *p) + { +! if (*p == '}') /* accept "} else" */ + p = cin_skipcomment(p + 1); + return (STRNCMP(p, "else", 4) == 0 && !vim_isIDc(p[4])); + } +--- 1116,1122 ---- + cin_iselse( + char_u *p) + { +! if (*p == '}') // accept "} else" + p = cin_skipcomment(p + 1); + return (STRNCMP(p, "else", 4) == 0 && !vim_isIDc(p[4])); + } +*************** +*** 1145,1158 **** + * ')' and ';'. The condition may be spread over several lines. + */ + static int +! cin_iswhileofdo (char_u *p, linenr_T lnum) /* XXX */ + { + pos_T cursor_save; + pos_T *trypos; + int retval = FALSE; + + p = cin_skipcomment(p); +! if (*p == '}') /* accept "} while (cond);" */ + p = cin_skipcomment(p + 1); + if (cin_starts_with(p, "while")) + { +--- 1133,1146 ---- + * ')' and ';'. The condition may be spread over several lines. + */ + static int +! cin_iswhileofdo (char_u *p, linenr_T lnum) // XXX + { + pos_T cursor_save; + pos_T *trypos; + int retval = FALSE; + + p = cin_skipcomment(p); +! if (*p == '}') // accept "} while (cond);" + p = cin_skipcomment(p + 1); + if (cin_starts_with(p, "while")) + { +*************** +*** 1160,1166 **** + curwin->w_cursor.lnum = lnum; + curwin->w_cursor.col = 0; + p = ml_get_curline(); +! while (*p && *p != 'w') /* skip any '}', until the 'w' of the "while" */ + { + ++p; + ++curwin->w_cursor.col; +--- 1148,1154 ---- + curwin->w_cursor.lnum = lnum; + curwin->w_cursor.col = 0; + p = ml_get_curline(); +! while (*p && *p != 'w') // skip any '}', until the 'w' of the "while" + { + ++p; + ++curwin->w_cursor.col; +*************** +*** 1235,1241 **** + pos_T *trypos; + int i; + +! if (terminated != ';') /* there must be a ';' at the end */ + return FALSE; + + p = line = ml_get_curline(); +--- 1223,1229 ---- + pos_T *trypos; + int i; + +! if (terminated != ';') // there must be a ';' at the end + return FALSE; + + p = line = ml_get_curline(); +*************** +*** 1247,1261 **** + s = skipwhite(p + 1); + if (*s == ';' && cin_nocode(s + 1)) + { +! /* Found ");" at end of the line, now check there is "while" +! * before the matching '('. XXX */ + i = (int)(p - line); + curwin->w_cursor.col = i; + trypos = find_match_paren(curbuf->b_ind_maxparen); + if (trypos != NULL) + { + s = cin_skipcomment(ml_get(trypos->lnum)); +! if (*s == '}') /* accept "} while (cond);" */ + s = cin_skipcomment(s + 1); + if (cin_starts_with(s, "while")) + { +--- 1235,1249 ---- + s = skipwhite(p + 1); + if (*s == ';' && cin_nocode(s + 1)) + { +! // Found ");" at end of the line, now check there is "while" +! // before the matching '('. XXX + i = (int)(p - line); + curwin->w_cursor.col = i; + trypos = find_match_paren(curbuf->b_ind_maxparen); + if (trypos != NULL) + { + s = cin_skipcomment(ml_get(trypos->lnum)); +! if (*s == '}') // accept "} while (cond);" + s = cin_skipcomment(s + 1); + if (cin_starts_with(s, "while")) + { +*************** +*** 1264,1270 **** + } + } + +! /* Searching may have made "line" invalid, get it again. */ + line = ml_get_curline(); + p = line + i; + } +--- 1252,1258 ---- + } + } + +! // Searching may have made "line" invalid, get it again. + line = ml_get_curline(); + p = line + i; + } +*************** +*** 1296,1316 **** + */ + static int + cin_is_cpp_baseclass( +! cpp_baseclass_cache_T *cached) /* input and output */ + { +! lpos_T *pos = &cached->lpos; /* find position */ + char_u *s; + int class_or_struct, lookfor_ctor_init, cpp_base_class; + linenr_T lnum = curwin->w_cursor.lnum; + char_u *line = ml_get_curline(); + + if (pos->lnum <= lnum) +! return cached->found; /* Use the cached result */ + + pos->col = 0; + + s = skipwhite(line); +! if (*s == '#') /* skip #define FOO x ? (x) : x */ + return FALSE; + s = cin_skipcomment(s); + if (*s == NUL) +--- 1284,1304 ---- + */ + static int + cin_is_cpp_baseclass( +! cpp_baseclass_cache_T *cached) // input and output + { +! lpos_T *pos = &cached->lpos; // find position + char_u *s; + int class_or_struct, lookfor_ctor_init, cpp_base_class; + linenr_T lnum = curwin->w_cursor.lnum; + char_u *line = ml_get_curline(); + + if (pos->lnum <= lnum) +! return cached->found; // Use the cached result + + pos->col = 0; + + s = skipwhite(line); +! if (*s == '#') // skip #define FOO x ? (x) : x + return FALSE; + s = cin_skipcomment(s); + if (*s == NUL) +*************** +*** 1318,1336 **** + + cpp_base_class = lookfor_ctor_init = class_or_struct = FALSE; + +! /* Search for a line starting with '#', empty, ending in ';' or containing +! * '{' or '}' and start below it. This handles the following situations: +! * a = cond ? +! * func() : +! * asdf; +! * func::foo() +! * : something +! * {} +! * Foo::Foo (int one, int two) +! * : something(4), +! * somethingelse(3) +! * {} +! */ + while (lnum > 1) + { + line = ml_get(lnum - 1); +--- 1306,1323 ---- + + cpp_base_class = lookfor_ctor_init = class_or_struct = FALSE; + +! // Search for a line starting with '#', empty, ending in ';' or containing +! // '{' or '}' and start below it. This handles the following situations: +! // a = cond ? +! // func() : +! // asdf; +! // func::foo() +! // : something +! // {} +! // Foo::Foo (int one, int two) +! // : something(4), +! // somethingelse(3) +! // {} + while (lnum > 1) + { + line = ml_get(lnum - 1); +*************** +*** 1360,1372 **** + { + if (lnum == curwin->w_cursor.lnum) + break; +! /* Continue in the cursor line. */ + line = ml_get(++lnum); + s = line; + } + if (s == line) + { +! /* don't recognize "case (foo):" as a baseclass */ + if (cin_iscase(s, FALSE)) + break; + s = cin_skipcomment(line); +--- 1347,1359 ---- + { + if (lnum == curwin->w_cursor.lnum) + break; +! // Continue in the cursor line. + line = ml_get(++lnum); + s = line; + } + if (s == line) + { +! // don't recognize "case (foo):" as a baseclass + if (cin_iscase(s, FALSE)) + break; + s = cin_skipcomment(line); +*************** +*** 1380,1394 **** + { + if (s[1] == ':') + { +! /* skip double colon. It can't be a constructor +! * initialization any more */ + lookfor_ctor_init = FALSE; + s = cin_skipcomment(s + 2); + } + else if (lookfor_ctor_init || class_or_struct) + { +! /* we have something found, that looks like the start of +! * cpp-base-class-declaration or constructor-initialization */ + cpp_base_class = TRUE; + lookfor_ctor_init = class_or_struct = FALSE; + pos->col = 0; +--- 1367,1381 ---- + { + if (s[1] == ':') + { +! // skip double colon. It can't be a constructor +! // initialization any more + lookfor_ctor_init = FALSE; + s = cin_skipcomment(s + 2); + } + else if (lookfor_ctor_init || class_or_struct) + { +! // we have something found, that looks like the start of +! // cpp-base-class-declaration or constructor-initialization + cpp_base_class = TRUE; + lookfor_ctor_init = class_or_struct = FALSE; + pos->col = 0; +*************** +*** 1416,1448 **** + } + else if (s[0] == ')') + { +! /* Constructor-initialization is assumed if we come across +! * something like "):" */ + class_or_struct = FALSE; + lookfor_ctor_init = TRUE; + } + else if (s[0] == '?') + { +! /* Avoid seeing '() :' after '?' as constructor init. */ + return FALSE; + } + else if (!vim_isIDc(s[0])) + { +! /* if it is not an identifier, we are wrong */ + class_or_struct = FALSE; + lookfor_ctor_init = FALSE; + } + else if (pos->col == 0) + { +! /* it can't be a constructor-initialization any more */ + lookfor_ctor_init = FALSE; + +! /* the first statement starts here: lineup with this one... */ + if (cpp_base_class) + pos->col = (colnr_T)(s - line); + } + +! /* When the line ends in a comma don't align with it. */ + if (lnum == curwin->w_cursor.lnum && *s == ',' && cin_nocode(s + 1)) + pos->col = 0; + +--- 1403,1435 ---- + } + else if (s[0] == ')') + { +! // Constructor-initialization is assumed if we come across +! // something like "):" + class_or_struct = FALSE; + lookfor_ctor_init = TRUE; + } + else if (s[0] == '?') + { +! // Avoid seeing '() :' after '?' as constructor init. + return FALSE; + } + else if (!vim_isIDc(s[0])) + { +! // if it is not an identifier, we are wrong + class_or_struct = FALSE; + lookfor_ctor_init = FALSE; + } + else if (pos->col == 0) + { +! // it can't be a constructor-initialization any more + lookfor_ctor_init = FALSE; + +! // the first statement starts here: lineup with this one... + if (cpp_base_class) + pos->col = (colnr_T)(s - line); + } + +! // When the line ends in a comma don't align with it. + if (lnum == curwin->w_cursor.lnum && *s == ',' && cin_nocode(s + 1)) + pos->col = 0; + +*************** +*** 1468,1474 **** + amount = get_indent(); + if (find_last_paren(ml_get_curline(), '(', ')') + && (trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) +! amount = get_indent_lnum(trypos->lnum); /* XXX */ + if (!cin_ends_in(ml_get_curline(), (char_u *)",", NULL)) + amount += curbuf->b_ind_cpp_baseclass; + } +--- 1455,1461 ---- + amount = get_indent(); + if (find_last_paren(ml_get_curline(), '(', ')') + && (trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) +! amount = get_indent_lnum(trypos->lnum); // XXX + if (!cin_ends_in(ml_get_curline(), (char_u *)",", NULL)) + amount += curbuf->b_ind_cpp_baseclass; + } +*************** +*** 1555,1567 **** + * Find the '{' at the start of the block we are in. + * Return NULL if no match found. + * Ignore a '{' that is in a comment, makes indenting the next three lines +! * work. */ + /* foo() */ + /* { */ + /* } */ + + static pos_T * +! find_start_brace(void) /* XXX */ + { + pos_T cursor_save; + pos_T *trypos; +--- 1542,1555 ---- + * Find the '{' at the start of the block we are in. + * Return NULL if no match found. + * Ignore a '{' that is in a comment, makes indenting the next three lines +! * work. +! */ + /* foo() */ + /* { */ + /* } */ + + static pos_T * +! find_start_brace(void) // XXX + { + pos_T cursor_save; + pos_T *trypos; +*************** +*** 1571,1583 **** + cursor_save = curwin->w_cursor; + while ((trypos = findmatchlimit(NULL, '{', FM_BLOCKSTOP, 0)) != NULL) + { +! pos_copy = *trypos; /* copy pos_T, next findmatch will change it */ + trypos = &pos_copy; + curwin->w_cursor = *trypos; + pos = NULL; +! /* ignore the { if it's in a // or / * * / comment */ + if ((colnr_T)cin_skip2pos(trypos) == trypos->col +! && (pos = ind_find_start_CORS(NULL)) == NULL) /* XXX */ + break; + if (pos != NULL) + curwin->w_cursor.lnum = pos->lnum; +--- 1559,1571 ---- + cursor_save = curwin->w_cursor; + while ((trypos = findmatchlimit(NULL, '{', FM_BLOCKSTOP, 0)) != NULL) + { +! pos_copy = *trypos; // copy pos_T, next findmatch will change it + trypos = &pos_copy; + curwin->w_cursor = *trypos; + pos = NULL; +! // ignore the { if it's in a // or / * * / comment + if ((colnr_T)cin_skip2pos(trypos) == trypos->col +! && (pos = ind_find_start_CORS(NULL)) == NULL) // XXX + break; + if (pos != NULL) + curwin->w_cursor.lnum = pos->lnum; +*************** +*** 1591,1603 **** + * Return NULL if no match found. + */ + static pos_T * +! find_match_paren(int ind_maxparen) /* XXX */ + { + return find_match_char('(', ind_maxparen); + } + + static pos_T * +! find_match_char(int c, int ind_maxparen) /* XXX */ + { + pos_T cursor_save; + pos_T *trypos; +--- 1579,1591 ---- + * Return NULL if no match found. + */ + static pos_T * +! find_match_paren(int ind_maxparen) // XXX + { + return find_match_char('(', ind_maxparen); + } + + static pos_T * +! find_match_char(int c, int ind_maxparen) // XXX + { + pos_T cursor_save; + pos_T *trypos; +*************** +*** 1609,1622 **** + retry: + if ((trypos = findmatchlimit(NULL, c, 0, ind_maxp_wk)) != NULL) + { +! /* check if the ( is in a // comment */ + if ((colnr_T)cin_skip2pos(trypos) > trypos->col) + { + ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum - trypos->lnum); + if (ind_maxp_wk > 0) + { + curwin->w_cursor = *trypos; +! curwin->w_cursor.col = 0; /* XXX */ + goto retry; + } + trypos = NULL; +--- 1597,1610 ---- + retry: + if ((trypos = findmatchlimit(NULL, c, 0, ind_maxp_wk)) != NULL) + { +! // check if the ( is in a // comment + if ((colnr_T)cin_skip2pos(trypos) > trypos->col) + { + ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum - trypos->lnum); + if (ind_maxp_wk > 0) + { + curwin->w_cursor = *trypos; +! curwin->w_cursor.col = 0; // XXX + goto retry; + } + trypos = NULL; +*************** +*** 1625,1634 **** + { + pos_T *trypos_wk; + +! pos_copy = *trypos; /* copy trypos, findmatch will change it */ + trypos = &pos_copy; + curwin->w_cursor = *trypos; +! if ((trypos_wk = ind_find_start_CORS(NULL)) != NULL) /* XXX */ + { + ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum + - trypos_wk->lnum); +--- 1613,1622 ---- + { + pos_T *trypos_wk; + +! pos_copy = *trypos; // copy trypos, findmatch will change it + trypos = &pos_copy; + curwin->w_cursor = *trypos; +! if ((trypos_wk = ind_find_start_CORS(NULL)) != NULL) // XXX + { + ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum + - trypos_wk->lnum); +*************** +*** 1651,1657 **** + * Return NULL if no match found. + */ + static pos_T * +! find_match_paren_after_brace (int ind_maxparen) /* XXX */ + { + pos_T *trypos = find_match_paren(ind_maxparen); + +--- 1639,1645 ---- + * Return NULL if no match found. + */ + static pos_T * +! find_match_paren_after_brace (int ind_maxparen) // XXX + { + pos_T *trypos = find_match_paren(ind_maxparen); + +*************** +*** 1659,1666 **** + { + pos_T *tryposBrace = find_start_brace(); + +! /* If both an unmatched '(' and '{' is found. Ignore the '(' +! * position if the '{' is further down. */ + if (tryposBrace != NULL + && (trypos->lnum != tryposBrace->lnum + ? trypos->lnum < tryposBrace->lnum +--- 1647,1654 ---- + { + pos_T *tryposBrace = find_start_brace(); + +! // If both an unmatched '(' and '{' is found. Ignore the '(' +! // position if the '{' is further down. + if (tryposBrace != NULL + && (trypos->lnum != tryposBrace->lnum + ? trypos->lnum < tryposBrace->lnum +*************** +*** 1697,1708 **** + int retval = FALSE; + int open_count = 0; + +! curwin->w_cursor.col = 0; /* default is start of line */ + + for (i = 0; l[i] != NUL; i++) + { +! i = (int)(cin_skipcomment(l + i) - l); /* ignore parens in comments */ +! i = (int)(skip_string(l + i) - l); /* ignore parens in quotes */ + if (l[i] == start) + ++open_count; + else if (l[i] == end) +--- 1685,1696 ---- + int retval = FALSE; + int open_count = 0; + +! curwin->w_cursor.col = 0; // default is start of line + + for (i = 0; l[i] != NUL; i++) + { +! i = (int)(cin_skipcomment(l + i) - l); // ignore parens in comments +! i = (int)(skip_string(l + i) - l); // ignore parens in quotes + if (l[i] == start) + ++open_count; + else if (l[i] == end) +*************** +*** 1734,1867 **** + int fraction = 0; + int sw = (int)get_sw_value(buf); + +! /* +! * Set the default values. +! */ +! /* Spaces from a block's opening brace the prevailing indent for that +! * block should be. */ + buf->b_ind_level = sw; + +! /* Spaces from the edge of the line an open brace that's at the end of a +! * line is imagined to be. */ + buf->b_ind_open_imag = 0; + +! /* Spaces from the prevailing indent for a line that is not preceded by +! * an opening brace. */ + buf->b_ind_no_brace = 0; + +! /* Column where the first { of a function should be located }. */ + buf->b_ind_first_open = 0; + +! /* Spaces from the prevailing indent a leftmost open brace should be +! * located. */ + buf->b_ind_open_extra = 0; + +! /* Spaces from the matching open brace (real location for one at the left +! * edge; imaginary location from one that ends a line) the matching close +! * brace should be located. */ + buf->b_ind_close_extra = 0; + +! /* Spaces from the edge of the line an open brace sitting in the leftmost +! * column is imagined to be. */ + buf->b_ind_open_left_imag = 0; + +! /* Spaces jump labels should be shifted to the left if N is non-negative, +! * otherwise the jump label will be put to column 1. */ + buf->b_ind_jump_label = -1; + +! /* Spaces from the switch() indent a "case xx" label should be located. */ + buf->b_ind_case = sw; + +! /* Spaces from the "case xx:" code after a switch() should be located. */ + buf->b_ind_case_code = sw; + +! /* Lineup break at end of case in switch() with case label. */ + buf->b_ind_case_break = 0; + +! /* Spaces from the class declaration indent a scope declaration label +! * should be located. */ + buf->b_ind_scopedecl = sw; + +! /* Spaces from the scope declaration label code should be located. */ + buf->b_ind_scopedecl_code = sw; + +! /* Amount K&R-style parameters should be indented. */ + buf->b_ind_param = sw; + +! /* Amount a function type spec should be indented. */ + buf->b_ind_func_type = sw; + +! /* Amount a cpp base class declaration or constructor initialization +! * should be indented. */ + buf->b_ind_cpp_baseclass = sw; + +! /* additional spaces beyond the prevailing indent a continuation line +! * should be located. */ + buf->b_ind_continuation = sw; + +! /* Spaces from the indent of the line with an unclosed parentheses. */ + buf->b_ind_unclosed = sw * 2; + +! /* Spaces from the indent of the line with an unclosed parentheses, which +! * itself is also unclosed. */ + buf->b_ind_unclosed2 = sw; + +! /* Suppress ignoring spaces from the indent of a line starting with an +! * unclosed parentheses. */ + buf->b_ind_unclosed_noignore = 0; + +! /* If the opening paren is the last nonwhite character on the line, and +! * b_ind_unclosed_wrapped is nonzero, use this indent relative to the outer +! * context (for very long lines). */ + buf->b_ind_unclosed_wrapped = 0; + +! /* Suppress ignoring white space when lining up with the character after +! * an unclosed parentheses. */ + buf->b_ind_unclosed_whiteok = 0; + +! /* Indent a closing parentheses under the line start of the matching +! * opening parentheses. */ + buf->b_ind_matching_paren = 0; + +! /* Indent a closing parentheses under the previous line. */ + buf->b_ind_paren_prev = 0; + +! /* Extra indent for comments. */ + buf->b_ind_comment = 0; + +! /* Spaces from the comment opener when there is nothing after it. */ + buf->b_ind_in_comment = 3; + +! /* Boolean: if non-zero, use b_ind_in_comment even if there is something +! * after the comment opener. */ + buf->b_ind_in_comment2 = 0; + +! /* Max lines to search for an open paren. */ + buf->b_ind_maxparen = 20; + +! /* Max lines to search for an open comment. */ + buf->b_ind_maxcomment = 70; + +! /* Handle braces for java code. */ + buf->b_ind_java = 0; + +! /* Not to confuse JS object properties with labels. */ + buf->b_ind_js = 0; + +! /* Handle blocked cases correctly. */ + buf->b_ind_keep_case_label = 0; + +! /* Handle C++ namespace. */ + buf->b_ind_cpp_namespace = 0; + +! /* Handle continuation lines containing conditions of if(), for() and +! * while(). */ + buf->b_ind_if_for_while = 0; + +! /* indentation for # comments */ + buf->b_ind_hash_comment = 0; + +! /* Handle C++ extern "C" or "C++" */ + buf->b_ind_cpp_extern_c = 0; + + for (p = buf->b_p_cino; *p; ) +--- 1722,1854 ---- + int fraction = 0; + int sw = (int)get_sw_value(buf); + +! // Set the default values. +! +! // Spaces from a block's opening brace the prevailing indent for that +! // block should be. + buf->b_ind_level = sw; + +! // Spaces from the edge of the line an open brace that's at the end of a +! // line is imagined to be. + buf->b_ind_open_imag = 0; + +! // Spaces from the prevailing indent for a line that is not preceded by +! // an opening brace. + buf->b_ind_no_brace = 0; + +! // Column where the first { of a function should be located }. + buf->b_ind_first_open = 0; + +! // Spaces from the prevailing indent a leftmost open brace should be +! // located. + buf->b_ind_open_extra = 0; + +! // Spaces from the matching open brace (real location for one at the left +! // edge; imaginary location from one that ends a line) the matching close +! // brace should be located. + buf->b_ind_close_extra = 0; + +! // Spaces from the edge of the line an open brace sitting in the leftmost +! // column is imagined to be. + buf->b_ind_open_left_imag = 0; + +! // Spaces jump labels should be shifted to the left if N is non-negative, +! // otherwise the jump label will be put to column 1. + buf->b_ind_jump_label = -1; + +! // Spaces from the switch() indent a "case xx" label should be located. + buf->b_ind_case = sw; + +! // Spaces from the "case xx:" code after a switch() should be located. + buf->b_ind_case_code = sw; + +! // Lineup break at end of case in switch() with case label. + buf->b_ind_case_break = 0; + +! // Spaces from the class declaration indent a scope declaration label +! // should be located. + buf->b_ind_scopedecl = sw; + +! // Spaces from the scope declaration label code should be located. + buf->b_ind_scopedecl_code = sw; + +! // Amount K&R-style parameters should be indented. + buf->b_ind_param = sw; + +! // Amount a function type spec should be indented. + buf->b_ind_func_type = sw; + +! // Amount a cpp base class declaration or constructor initialization +! // should be indented. + buf->b_ind_cpp_baseclass = sw; + +! // additional spaces beyond the prevailing indent a continuation line +! // should be located. + buf->b_ind_continuation = sw; + +! // Spaces from the indent of the line with an unclosed parentheses. + buf->b_ind_unclosed = sw * 2; + +! // Spaces from the indent of the line with an unclosed parentheses, which +! // itself is also unclosed. + buf->b_ind_unclosed2 = sw; + +! // Suppress ignoring spaces from the indent of a line starting with an +! // unclosed parentheses. + buf->b_ind_unclosed_noignore = 0; + +! // If the opening paren is the last nonwhite character on the line, and +! // b_ind_unclosed_wrapped is nonzero, use this indent relative to the outer +! // context (for very long lines). + buf->b_ind_unclosed_wrapped = 0; + +! // Suppress ignoring white space when lining up with the character after +! // an unclosed parentheses. + buf->b_ind_unclosed_whiteok = 0; + +! // Indent a closing parentheses under the line start of the matching +! // opening parentheses. + buf->b_ind_matching_paren = 0; + +! // Indent a closing parentheses under the previous line. + buf->b_ind_paren_prev = 0; + +! // Extra indent for comments. + buf->b_ind_comment = 0; + +! // Spaces from the comment opener when there is nothing after it. + buf->b_ind_in_comment = 3; + +! // Boolean: if non-zero, use b_ind_in_comment even if there is something +! // after the comment opener. + buf->b_ind_in_comment2 = 0; + +! // Max lines to search for an open paren. + buf->b_ind_maxparen = 20; + +! // Max lines to search for an open comment. + buf->b_ind_maxcomment = 70; + +! // Handle braces for java code. + buf->b_ind_java = 0; + +! // Not to confuse JS object properties with labels. + buf->b_ind_js = 0; + +! // Handle blocked cases correctly. + buf->b_ind_keep_case_label = 0; + +! // Handle C++ namespace. + buf->b_ind_cpp_namespace = 0; + +! // Handle continuation lines containing conditions of if(), for() and +! // while(). + buf->b_ind_if_for_while = 0; + +! // indentation for # comments + buf->b_ind_hash_comment = 0; + +! // Handle C++ extern "C" or "C++" + buf->b_ind_cpp_extern_c = 0; + + for (p = buf->b_p_cino; *p; ) +*************** +*** 1869,1878 **** + l = p++; + if (*p == '-') + ++p; +! digits = p; /* remember where the digits start */ + n = getdigits(&p); + divider = 0; +! if (*p == '.') /* ".5s" means a fraction */ + { + fraction = atol((char *)++p); + while (VIM_ISDIGIT(*p)) +--- 1856,1865 ---- + l = p++; + if (*p == '-') + ++p; +! digits = p; // remember where the digits start + n = getdigits(&p); + divider = 0; +! if (*p == '.') // ".5s" means a fraction + { + fraction = atol((char *)++p); + while (VIM_ISDIGIT(*p)) +*************** +*** 1884,1893 **** + divider = 10; + } + } +! if (*p == 's') /* "2s" means two times 'shiftwidth' */ + { + if (p == digits) +! n = sw; /* just "s" is one 'shiftwidth' */ + else + { + n *= sw; +--- 1871,1880 ---- + divider = 10; + } + } +! if (*p == 's') // "2s" means two times 'shiftwidth' + { + if (p == digits) +! n = sw; // just "s" is one 'shiftwidth' + else + { + n *= sw; +*************** +*** 1899,1906 **** + if (l[1] == '-') + n = -n; + +! /* When adding an entry here, also update the default 'cinoptions' in +! * doc/indent.txt, and add explanation for it! */ + switch (*l) + { + case '>': buf->b_ind_level = n; break; +--- 1886,1893 ---- + if (l[1] == '-') + n = -n; + +! // When adding an entry here, also update the default 'cinoptions' in +! // doc/indent.txt, and add explanation for it! + switch (*l) + { + case '>': buf->b_ind_level = n; break; +*************** +*** 1966,1974 **** + pos_T our_paren_pos; + char_u *start; + int start_brace; +! #define BRACE_IN_COL0 1 /* '{' is in column 0 */ +! #define BRACE_AT_START 2 /* '{' is at start of line */ +! #define BRACE_AT_END 3 /* '{' is at end of line */ + linenr_T ourscope; + char_u *l; + char_u *look; +--- 1953,1961 ---- + pos_T our_paren_pos; + char_u *start; + int start_brace; +! #define BRACE_IN_COL0 1 // '{' is in column 0 +! #define BRACE_AT_START 2 // '{' is at start of line +! #define BRACE_AT_END 3 // '{' is at end of line + linenr_T ourscope; + char_u *l; + char_u *look; +*************** +*** 1994,2030 **** + int iscase; + int lookfor_break; + int lookfor_cpp_namespace = FALSE; +! int cont_amount = 0; /* amount for continuation line */ + int original_line_islabel; + int added_to_amount = 0; + int js_cur_has_key = 0; + linenr_T raw_string_start = 0; + cpp_baseclass_cache_T cache_cpp_baseclass = { FALSE, { MAXLNUM, 0 } }; + +! /* make a copy, value is changed below */ + int ind_continuation = curbuf->b_ind_continuation; + +! /* remember where the cursor was when we started */ + cur_curpos = curwin->w_cursor; + +! /* if we are at line 1 zero indent is fine, right? */ + if (cur_curpos.lnum == 1) + return 0; + +! /* Get a copy of the current contents of the line. +! * This is required, because only the most recent line obtained with +! * ml_get is valid! */ + linecopy = vim_strsave(ml_get(cur_curpos.lnum)); + if (linecopy == NULL) + return 0; + +! /* +! * In insert mode and the cursor is on a ')' truncate the line at the +! * cursor position. We don't want to line up with the matching '(' when +! * inserting new stuff. +! * For unknown reasons the cursor might be past the end of the line, thus +! * check for that. +! */ + if ((State & INSERT) + && curwin->w_cursor.col < (colnr_T)STRLEN(linecopy) + && linecopy[curwin->w_cursor.col] == ')') +--- 1981,2015 ---- + int iscase; + int lookfor_break; + int lookfor_cpp_namespace = FALSE; +! int cont_amount = 0; // amount for continuation line + int original_line_islabel; + int added_to_amount = 0; + int js_cur_has_key = 0; + linenr_T raw_string_start = 0; + cpp_baseclass_cache_T cache_cpp_baseclass = { FALSE, { MAXLNUM, 0 } }; + +! // make a copy, value is changed below + int ind_continuation = curbuf->b_ind_continuation; + +! // remember where the cursor was when we started + cur_curpos = curwin->w_cursor; + +! // if we are at line 1 zero indent is fine, right? + if (cur_curpos.lnum == 1) + return 0; + +! // Get a copy of the current contents of the line. +! // This is required, because only the most recent line obtained with +! // ml_get is valid! + linecopy = vim_strsave(ml_get(cur_curpos.lnum)); + if (linecopy == NULL) + return 0; + +! // In insert mode and the cursor is on a ')' truncate the line at the +! // cursor position. We don't want to line up with the matching '(' when +! // inserting new stuff. +! // For unknown reasons the cursor might be past the end of the line, thus +! // check for that. + if ((State & INSERT) + && curwin->w_cursor.col < (colnr_T)STRLEN(linecopy) + && linecopy[curwin->w_cursor.col] == ')') +*************** +*** 2032,2051 **** + + theline = skipwhite(linecopy); + +! /* move the cursor to the start of the line */ + + curwin->w_cursor.col = 0; + +! original_line_islabel = cin_islabel(); /* XXX */ + +! /* +! * If we are inside a raw string don't change the indent. +! * Ignore a raw string inside a comment. +! */ + comment_pos = ind_find_start_comment(); + if (comment_pos != NULL) + { +! /* findmatchlimit() static pos is overwritten, make a copy */ + tryposCopy = *comment_pos; + comment_pos = &tryposCopy; + } +--- 2017,2034 ---- + + theline = skipwhite(linecopy); + +! // move the cursor to the start of the line + + curwin->w_cursor.col = 0; + +! original_line_islabel = cin_islabel(); // XXX + +! // If we are inside a raw string don't change the indent. +! // Ignore a raw string inside a comment. + comment_pos = ind_find_start_comment(); + if (comment_pos != NULL) + { +! // findmatchlimit() static pos is overwritten, make a copy + tryposCopy = *comment_pos; + comment_pos = &tryposCopy; + } +*************** +*** 2057,2076 **** + goto laterend; + } + +! /* +! * #defines and so on always go at the left when included in 'cinkeys'. +! */ + if (*theline == '#' && (*linecopy == '#' || in_cinkeys('#', ' ', TRUE))) + { + amount = curbuf->b_ind_hash_comment; + goto theend; + } + +! /* +! * Is it a non-case label? Then that goes at the left margin too unless: +! * - JS flag is set. +! * - 'L' item has a positive value. +! */ + if (original_line_islabel && !curbuf->b_ind_js + && curbuf->b_ind_jump_label < 0) + { +--- 2040,2055 ---- + goto laterend; + } + +! // #defines and so on always go at the left when included in 'cinkeys'. + if (*theline == '#' && (*linecopy == '#' || in_cinkeys('#', ' ', TRUE))) + { + amount = curbuf->b_ind_hash_comment; + goto theend; + } + +! // Is it a non-case label? Then that goes at the left margin too unless: +! // - JS flag is set. +! // - 'L' item has a positive value. + if (original_line_islabel && !curbuf->b_ind_js + && curbuf->b_ind_jump_label < 0) + { +*************** +*** 2078,2113 **** + goto theend; + } + +! /* +! * If we're inside a "//" comment and there is a "//" comment in a +! * previous line, lineup with that one. +! */ + if (cin_islinecomment(theline) +! && (trypos = find_line_comment()) != NULL) /* XXX */ + { +! /* find how indented the line beginning the comment is */ + getvcol(curwin, trypos, &col, NULL, NULL); + amount = col; + goto theend; + } + +! /* +! * If we're inside a comment and not looking at the start of the +! * comment, try using the 'comments' option. +! */ +! if (!cin_iscomment(theline) && comment_pos != NULL) /* XXX */ + { + int lead_start_len = 2; + int lead_middle_len = 1; +! char_u lead_start[COM_MAX_LEN]; /* start-comment string */ +! char_u lead_middle[COM_MAX_LEN]; /* middle-comment string */ +! char_u lead_end[COM_MAX_LEN]; /* end-comment string */ + char_u *p; + int start_align = 0; + int start_off = 0; + int done = FALSE; + +! /* find how indented the line beginning the comment is */ + getvcol(curwin, comment_pos, &col, NULL, NULL); + amount = col; + *lead_start = NUL; +--- 2057,2088 ---- + goto theend; + } + +! // If we're inside a "//" comment and there is a "//" comment in a +! // previous line, lineup with that one. + if (cin_islinecomment(theline) +! && (trypos = find_line_comment()) != NULL) // XXX + { +! // find how indented the line beginning the comment is + getvcol(curwin, trypos, &col, NULL, NULL); + amount = col; + goto theend; + } + +! // If we're inside a comment and not looking at the start of the +! // comment, try using the 'comments' option. +! if (!cin_iscomment(theline) && comment_pos != NULL) // XXX + { + int lead_start_len = 2; + int lead_middle_len = 1; +! char_u lead_start[COM_MAX_LEN]; // start-comment string +! char_u lead_middle[COM_MAX_LEN]; // middle-comment string +! char_u lead_end[COM_MAX_LEN]; // end-comment string + char_u *p; + int start_align = 0; + int start_off = 0; + int done = FALSE; + +! // find how indented the line beginning the comment is + getvcol(curwin, comment_pos, &col, NULL, NULL); + amount = col; + *lead_start = NUL; +*************** +*** 2149,2166 **** + } + else if (what == COM_END) + { +! /* If our line starts with the middle comment string, line it +! * up with the comment opener per the 'comments' option. */ + if (STRNCMP(theline, lead_middle, lead_middle_len) == 0 + && STRNCMP(theline, lead_end, STRLEN(lead_end)) != 0) + { + done = TRUE; + if (curwin->w_cursor.lnum > 1) + { +! /* If the start comment string matches in the previous +! * line, use the indent of that line plus offset. If +! * the middle comment string matches in the previous +! * line, use the indent of that line. XXX */ + look = skipwhite(ml_get(curwin->w_cursor.lnum - 1)); + if (STRNCMP(look, lead_start, lead_start_len) == 0) + amount = get_indent_lnum(curwin->w_cursor.lnum - 1); +--- 2124,2141 ---- + } + else if (what == COM_END) + { +! // If our line starts with the middle comment string, line it +! // up with the comment opener per the 'comments' option. + if (STRNCMP(theline, lead_middle, lead_middle_len) == 0 + && STRNCMP(theline, lead_end, STRLEN(lead_end)) != 0) + { + done = TRUE; + if (curwin->w_cursor.lnum > 1) + { +! // If the start comment string matches in the previous +! // line, use the indent of that line plus offset. If +! // the middle comment string matches in the previous +! // line, use the indent of that line. XXX + look = skipwhite(ml_get(curwin->w_cursor.lnum - 1)); + if (STRNCMP(look, lead_start, lead_start_len) == 0) + amount = get_indent_lnum(curwin->w_cursor.lnum - 1); +*************** +*** 2170,2177 **** + amount = get_indent_lnum(curwin->w_cursor.lnum - 1); + break; + } +! /* If the start comment string doesn't match with the +! * start of the comment, skip this entry. XXX */ + else if (STRNCMP(ml_get(comment_pos->lnum) + comment_pos->col, + lead_start, lead_start_len) != 0) + continue; +--- 2145,2152 ---- + amount = get_indent_lnum(curwin->w_cursor.lnum - 1); + break; + } +! // If the start comment string doesn't match with the +! // start of the comment, skip this entry. XXX + else if (STRNCMP(ml_get(comment_pos->lnum) + comment_pos->col, + lead_start, lead_start_len) != 0) + continue; +*************** +*** 2184,2196 **** + break; + } + +! /* If our line starts with the end comment string, line it up +! * with the middle comment */ + if (STRNCMP(theline, lead_middle, lead_middle_len) != 0 + && STRNCMP(theline, lead_end, STRLEN(lead_end)) == 0) + { + amount = get_indent_lnum(curwin->w_cursor.lnum - 1); +! /* XXX */ + if (off != 0) + amount += off; + else if (align == COM_RIGHT) +--- 2159,2171 ---- + break; + } + +! // If our line starts with the end comment string, line it up +! // with the middle comment + if (STRNCMP(theline, lead_middle, lead_middle_len) != 0 + && STRNCMP(theline, lead_end, STRLEN(lead_end)) == 0) + { + amount = get_indent_lnum(curwin->w_cursor.lnum - 1); +! // XXX + if (off != 0) + amount += off; + else if (align == COM_RIGHT) +*************** +*** 2202,2239 **** + } + } + +! /* If our line starts with an asterisk, line up with the +! * asterisk in the comment opener; otherwise, line up +! * with the first character of the comment text. +! */ + if (done) + ; + else if (theline[0] == '*') + amount += 1; + else + { +! /* +! * If we are more than one line away from the comment opener, take +! * the indent of the previous non-empty line. If 'cino' has "CO" +! * and we are just below the comment opener and there are any +! * white characters after it line up with the text after it; +! * otherwise, add the amount specified by "c" in 'cino' +! */ + amount = -1; + for (lnum = cur_curpos.lnum - 1; lnum > comment_pos->lnum; --lnum) + { +! if (linewhite(lnum)) /* skip blank lines */ + continue; +! amount = get_indent_lnum(lnum); /* XXX */ + break; + } +! if (amount == -1) /* use the comment opener */ + { + if (!curbuf->b_ind_in_comment2) + { + start = ml_get(comment_pos->lnum); +! look = start + comment_pos->col + 2; /* skip / and * */ +! if (*look != NUL) /* if something after it */ + comment_pos->col = (colnr_T)(skipwhite(look) - start); + } + getvcol(curwin, comment_pos, &col, NULL, NULL); +--- 2177,2211 ---- + } + } + +! // If our line starts with an asterisk, line up with the +! // asterisk in the comment opener; otherwise, line up +! // with the first character of the comment text. + if (done) + ; + else if (theline[0] == '*') + amount += 1; + else + { +! // If we are more than one line away from the comment opener, take +! // the indent of the previous non-empty line. If 'cino' has "CO" +! // and we are just below the comment opener and there are any +! // white characters after it line up with the text after it; +! // otherwise, add the amount specified by "c" in 'cino' + amount = -1; + for (lnum = cur_curpos.lnum - 1; lnum > comment_pos->lnum; --lnum) + { +! if (linewhite(lnum)) // skip blank lines + continue; +! amount = get_indent_lnum(lnum); // XXX + break; + } +! if (amount == -1) // use the comment opener + { + if (!curbuf->b_ind_in_comment2) + { + start = ml_get(comment_pos->lnum); +! look = start + comment_pos->col + 2; // skip / and * +! if (*look != NUL) // if something after it + comment_pos->col = (colnr_T)(skipwhite(look) - start); + } + getvcol(curwin, comment_pos, &col, NULL, NULL); +*************** +*** 2245,2264 **** + goto theend; + } + +! /* +! * Are we looking at a ']' that has a match? +! */ + if (*skipwhite(theline) == ']' + && (trypos = find_match_char('[', curbuf->b_ind_maxparen)) != NULL) + { +! /* align with the line containing the '['. */ + amount = get_indent_lnum(trypos->lnum); + goto theend; + } + +! /* +! * Are we inside parentheses or braces? +! */ /* XXX */ + if (((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL + && curbuf->b_ind_java == 0) + || (tryposBrace = find_start_brace()) != NULL +--- 2217,2232 ---- + goto theend; + } + +! // Are we looking at a ']' that has a match? + if (*skipwhite(theline) == ']' + && (trypos = find_match_char('[', curbuf->b_ind_maxparen)) != NULL) + { +! // align with the line containing the '['. + amount = get_indent_lnum(trypos->lnum); + goto theend; + } + +! // Are we inside parentheses or braces? XXX + if (((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL + && curbuf->b_ind_java == 0) + || (tryposBrace = find_start_brace()) != NULL +*************** +*** 2266,2273 **** + { + if (trypos != NULL && tryposBrace != NULL) + { +! /* Both an unmatched '(' and '{' is found. Use the one which is +! * closer to the current cursor position, set the other to NULL. */ + if (trypos->lnum != tryposBrace->lnum + ? trypos->lnum < tryposBrace->lnum + : trypos->col < tryposBrace->col) +--- 2234,2241 ---- + { + if (trypos != NULL && tryposBrace != NULL) + { +! // Both an unmatched '(' and '{' is found. Use the one which is +! // closer to the current cursor position, set the other to NULL. + if (trypos->lnum != tryposBrace->lnum + ? trypos->lnum < tryposBrace->lnum + : trypos->col < tryposBrace->col) +*************** +*** 2278,2291 **** + + if (trypos != NULL) + { +! /* +! * If the matching paren is more than one line away, use the indent of +! * a previous non-empty line that matches the same paren. +! */ + if (theline[0] == ')' && curbuf->b_ind_paren_prev) + { +! /* Line up with the start of the matching paren line. */ +! amount = get_indent_lnum(curwin->w_cursor.lnum - 1); /* XXX */ + } + else + { +--- 2246,2257 ---- + + if (trypos != NULL) + { +! // If the matching paren is more than one line away, use the indent of +! // a previous non-empty line that matches the same paren. + if (theline[0] == ')' && curbuf->b_ind_paren_prev) + { +! // Line up with the start of the matching paren line. +! amount = get_indent_lnum(curwin->w_cursor.lnum - 1); // XXX + } + else + { +*************** +*** 2294,2319 **** + for (lnum = cur_curpos.lnum - 1; lnum > our_paren_pos.lnum; --lnum) + { + l = skipwhite(ml_get(lnum)); +! if (cin_nocode(l)) /* skip comment lines */ + continue; + if (cin_ispreproc_cont(&l, &lnum, &amount)) +! continue; /* ignore #define, #if, etc. */ + curwin->w_cursor.lnum = lnum; + +! /* Skip a comment or raw string. XXX */ + if ((trypos = ind_find_start_CORS(NULL)) != NULL) + { + lnum = trypos->lnum + 1; + continue; + } + +! /* XXX */ + if ((trypos = find_match_paren( + corr_ind_maxparen(&cur_curpos))) != NULL + && trypos->lnum == our_paren_pos.lnum + && trypos->col == our_paren_pos.col) + { +! amount = get_indent_lnum(lnum); /* XXX */ + + if (theline[0] == ')') + { +--- 2260,2285 ---- + for (lnum = cur_curpos.lnum - 1; lnum > our_paren_pos.lnum; --lnum) + { + l = skipwhite(ml_get(lnum)); +! if (cin_nocode(l)) // skip comment lines + continue; + if (cin_ispreproc_cont(&l, &lnum, &amount)) +! continue; // ignore #define, #if, etc. + curwin->w_cursor.lnum = lnum; + +! // Skip a comment or raw string. XXX + if ((trypos = ind_find_start_CORS(NULL)) != NULL) + { + lnum = trypos->lnum + 1; + continue; + } + +! // XXX + if ((trypos = find_match_paren( + corr_ind_maxparen(&cur_curpos))) != NULL + && trypos->lnum == our_paren_pos.lnum + && trypos->col == our_paren_pos.col) + { +! amount = get_indent_lnum(lnum); // XXX + + if (theline[0] == ')') + { +*************** +*** 2327,2337 **** + } + } + +! /* +! * Line up with line where the matching paren is. XXX +! * If the line starts with a '(' or the indent for unclosed +! * parentheses is zero, line up with the unclosed parentheses. +! */ + if (amount == -1) + { + int ignore_paren_col = 0; +--- 2293,2301 ---- + } + } + +! // Line up with line where the matching paren is. XXX +! // If the line starts with a '(' or the indent for unclosed +! // parentheses is zero, line up with the unclosed parentheses. + if (amount == -1) + { + int ignore_paren_col = 0; +*************** +*** 2339,2346 **** + + if (curbuf->b_ind_if_for_while) + { +! /* Look for the outermost opening parenthesis on this line +! * and check whether it belongs to an "if", "for" or "while". */ + + pos_T cursor_save = curwin->w_cursor; + pos_T outermost; +--- 2303,2310 ---- + + if (curbuf->b_ind_if_for_while) + { +! // Look for the outermost opening parenthesis on this line +! // and check whether it belongs to an "if", "for" or "while". + + pos_T cursor_save = curwin->w_cursor; + pos_T outermost; +*************** +*** 2371,2378 **** + char_u *line; + int look_col; + +! /* Ignore a '(' in front of the line that has a match before +! * our matching '('. */ + curwin->w_cursor.lnum = our_paren_pos.lnum; + line = ml_get_curline(); + look_col = (int)(look - line); +--- 2335,2342 ---- + char_u *line; + int look_col; + +! // Ignore a '(' in front of the line that has a match before +! // our matching '('. + curwin->w_cursor.lnum = our_paren_pos.lnum; + line = ml_get_curline(); + look_col = (int)(look - line); +*************** +*** 2392,2406 **** + || (!curbuf->b_ind_unclosed_noignore && *look == '(' + && ignore_paren_col == 0)) + { +! /* +! * If we're looking at a close paren, line up right there; +! * otherwise, line up with the next (non-white) character. +! * When b_ind_unclosed_wrapped is set and the matching paren is +! * the last nonwhite character of the line, use either the +! * indent of the current line or the indentation of the next +! * outer paren and add b_ind_unclosed_wrapped (for very long +! * lines). +! */ + if (theline[0] != ')') + { + cur_amount = MAXCOL; +--- 2356,2368 ---- + || (!curbuf->b_ind_unclosed_noignore && *look == '(' + && ignore_paren_col == 0)) + { +! // If we're looking at a close paren, line up right there; +! // otherwise, line up with the next (non-white) character. +! // When b_ind_unclosed_wrapped is set and the matching paren is +! // the last nonwhite character of the line, use either the +! // indent of the current line or the indentation of the next +! // outer paren and add b_ind_unclosed_wrapped (for very long +! // lines). + if (theline[0] != ')') + { + cur_amount = MAXCOL; +*************** +*** 2408,2415 **** + if (curbuf->b_ind_unclosed_wrapped + && cin_ends_in(l, (char_u *)"(", NULL)) + { +! /* look for opening unmatched paren, indent one level +! * for each additional level */ + n = 1; + for (col = 0; col < our_paren_pos.col; ++col) + { +--- 2370,2377 ---- + if (curbuf->b_ind_unclosed_wrapped + && cin_ends_in(l, (char_u *)"(", NULL)) + { +! // look for opening unmatched paren, indent one level +! // for each additional level + n = 1; + for (col = 0; col < our_paren_pos.col; ++col) + { +*************** +*** 2436,2452 **** + col = our_paren_pos.col + 1; + while (VIM_ISWHITE(l[col])) + col++; +! if (l[col] != NUL) /* In case of trailing space */ + our_paren_pos.col = col; + else + our_paren_pos.col++; + } + } + +! /* +! * Find how indented the paren is, or the character after it +! * if we did the above "if". +! */ + if (our_paren_pos.col > 0) + { + getvcol(curwin, &our_paren_pos, &col, NULL, NULL); +--- 2398,2412 ---- + col = our_paren_pos.col + 1; + while (VIM_ISWHITE(l[col])) + col++; +! if (l[col] != NUL) // In case of trailing space + our_paren_pos.col = col; + else + our_paren_pos.col++; + } + } + +! // Find how indented the paren is, or the character after it +! // if we did the above "if". + if (our_paren_pos.col > 0) + { + getvcol(curwin, &our_paren_pos, &col, NULL, NULL); +*************** +*** 2457,2463 **** + + if (theline[0] == ')' && curbuf->b_ind_matching_paren) + { +! /* Line up with the start of the matching paren line. */ + } + else if ((curbuf->b_ind_unclosed == 0 && is_if_for_while == 0) + || (!curbuf->b_ind_unclosed_noignore +--- 2417,2423 ---- + + if (theline[0] == ')' && curbuf->b_ind_matching_paren) + { +! // Line up with the start of the matching paren line. + } + else if ((curbuf->b_ind_unclosed == 0 && is_if_for_while == 0) + || (!curbuf->b_ind_unclosed_noignore +*************** +*** 2468,2475 **** + } + else + { +! /* Add b_ind_unclosed2 for each '(' before our matching one, +! * but ignore (void) before the line (ignore_paren_col). */ + col = our_paren_pos.col; + while ((int)our_paren_pos.col > ignore_paren_col) + { +--- 2428,2435 ---- + } + else + { +! // Add b_ind_unclosed2 for each '(' before our matching one, +! // but ignore (void) before the line (ignore_paren_col). + col = our_paren_pos.col; + while ((int)our_paren_pos.col > ignore_paren_col) + { +*************** +*** 2485,2492 **** + } + } + +! /* Use b_ind_unclosed once, when the first '(' is not inside +! * braces */ + if (col == MAXCOL) + amount += curbuf->b_ind_unclosed; + else +--- 2445,2452 ---- + } + } + +! // Use b_ind_unclosed once, when the first '(' is not inside +! // braces + if (col == MAXCOL) + amount += curbuf->b_ind_unclosed; + else +*************** +*** 2504,2546 **** + amount += curbuf->b_ind_unclosed; + } + } +! /* +! * For a line starting with ')' use the minimum of the two +! * positions, to avoid giving it more indent than the previous +! * lines: +! * func_long_name( if (x +! * arg && yy +! * ) ^ not here ) ^ not here +! */ + if (cur_amount < amount) + amount = cur_amount; + } + } + +! /* add extra indent for a comment */ + if (cin_iscomment(theline)) + amount += curbuf->b_ind_comment; + } + else + { +! /* +! * We are inside braces, there is a { before this line at the position +! * stored in tryposBrace. +! * Make a copy of tryposBrace, it may point to pos_copy inside +! * find_start_brace(), which may be changed somewhere. +! */ + tryposCopy = *tryposBrace; + tryposBrace = &tryposCopy; + trypos = tryposBrace; + ourscope = trypos->lnum; + start = ml_get(ourscope); + +! /* +! * Now figure out how indented the line is in general. +! * If the brace was at the start of the line, we use that; +! * otherwise, check out the indentation of the line as +! * a whole and then add the "imaginary indent" to that. +! */ + look = skipwhite(start); + if (*look == '{') + { +--- 2464,2500 ---- + amount += curbuf->b_ind_unclosed; + } + } +! // For a line starting with ')' use the minimum of the two +! // positions, to avoid giving it more indent than the previous +! // lines: +! // func_long_name( if (x +! // arg && yy +! // ) ^ not here ) ^ not here + if (cur_amount < amount) + amount = cur_amount; + } + } + +! // add extra indent for a comment + if (cin_iscomment(theline)) + amount += curbuf->b_ind_comment; + } + else + { +! // We are inside braces, there is a { before this line at the position +! // stored in tryposBrace. +! // Make a copy of tryposBrace, it may point to pos_copy inside +! // find_start_brace(), which may be changed somewhere. + tryposCopy = *tryposBrace; + tryposBrace = &tryposCopy; + trypos = tryposBrace; + ourscope = trypos->lnum; + start = ml_get(ourscope); + +! // Now figure out how indented the line is in general. +! // If the brace was at the start of the line, we use that; +! // otherwise, check out the indentation of the line as +! // a whole and then add the "imaginary indent" to that. + look = skipwhite(start); + if (*look == '{') + { +*************** +*** 2553,2575 **** + } + else + { +! /* That opening brace might have been on a continuation +! * line. if so, find the start of the line. */ + curwin->w_cursor.lnum = ourscope; + +! /* Position the cursor over the rightmost paren, so that +! * matching it will take us back to the start of the line. */ + lnum = ourscope; + if (find_last_paren(start, '(', ')') + && (trypos = find_match_paren(curbuf->b_ind_maxparen)) + != NULL) + lnum = trypos->lnum; + +! /* It could have been something like +! * case 1: if (asdf && +! * ldfd) { +! * } +! */ + if ((curbuf->b_ind_js || curbuf->b_ind_keep_case_label) + && cin_iscase(skipwhite(ml_get_curline()), FALSE)) + amount = get_indent(); +--- 2507,2528 ---- + } + else + { +! // That opening brace might have been on a continuation +! // line. if so, find the start of the line. + curwin->w_cursor.lnum = ourscope; + +! // Position the cursor over the rightmost paren, so that +! // matching it will take us back to the start of the line. + lnum = ourscope; + if (find_last_paren(start, '(', ')') + && (trypos = find_match_paren(curbuf->b_ind_maxparen)) + != NULL) + lnum = trypos->lnum; + +! // It could have been something like +! // case 1: if (asdf && +! // ldfd) { +! // } + if ((curbuf->b_ind_js || curbuf->b_ind_keep_case_label) + && cin_iscase(skipwhite(ml_get_curline()), FALSE)) + amount = get_indent(); +*************** +*** 2581,2653 **** + start_brace = BRACE_AT_END; + } + +! /* For Javascript check if the line starts with "key:". */ + if (curbuf->b_ind_js) + js_cur_has_key = cin_has_js_key(theline); + +! /* +! * If we're looking at a closing brace, that's where +! * we want to be. otherwise, add the amount of room +! * that an indent is supposed to be. +! */ + if (theline[0] == '}') + { +! /* +! * they may want closing braces to line up with something +! * other than the open brace. indulge them, if so. +! */ + amount += curbuf->b_ind_close_extra; + } + else + { +! /* +! * If we're looking at an "else", try to find an "if" +! * to match it with. +! * If we're looking at a "while", try to find a "do" +! * to match it with. +! */ + lookfor = LOOKFOR_INITIAL; + if (cin_iselse(theline)) + lookfor = LOOKFOR_IF; +! else if (cin_iswhileofdo(theline, cur_curpos.lnum)) /* XXX */ + lookfor = LOOKFOR_DO; + if (lookfor != LOOKFOR_INITIAL) + { + curwin->w_cursor.lnum = cur_curpos.lnum; + if (find_match(lookfor, ourscope) == OK) + { +! amount = get_indent(); /* XXX */ + goto theend; + } + } + +! /* +! * We get here if we are not on an "while-of-do" or "else" (or +! * failed to find a matching "if"). +! * Search backwards for something to line up with. +! * First set amount for when we don't find anything. +! */ +! +! /* +! * if the '{' is _really_ at the left margin, use the imaginary +! * location of a left-margin brace. Otherwise, correct the +! * location for b_ind_open_extra. +! */ + +! if (start_brace == BRACE_IN_COL0) /* '{' is in column 0 */ + { + amount = curbuf->b_ind_open_left_imag; + lookfor_cpp_namespace = TRUE; + } + else if (start_brace == BRACE_AT_START && +! lookfor_cpp_namespace) /* '{' is at start */ + { + + lookfor_cpp_namespace = TRUE; + } + else + { +! if (start_brace == BRACE_AT_END) /* '{' is at end of line */ + { + amount += curbuf->b_ind_open_imag; + +--- 2534,2596 ---- + start_brace = BRACE_AT_END; + } + +! // For Javascript check if the line starts with "key:". + if (curbuf->b_ind_js) + js_cur_has_key = cin_has_js_key(theline); + +! // If we're looking at a closing brace, that's where +! // we want to be. otherwise, add the amount of room +! // that an indent is supposed to be. + if (theline[0] == '}') + { +! // they may want closing braces to line up with something +! // other than the open brace. indulge them, if so. + amount += curbuf->b_ind_close_extra; + } + else + { +! // If we're looking at an "else", try to find an "if" +! // to match it with. +! // If we're looking at a "while", try to find a "do" +! // to match it with. + lookfor = LOOKFOR_INITIAL; + if (cin_iselse(theline)) + lookfor = LOOKFOR_IF; +! else if (cin_iswhileofdo(theline, cur_curpos.lnum)) // XXX + lookfor = LOOKFOR_DO; + if (lookfor != LOOKFOR_INITIAL) + { + curwin->w_cursor.lnum = cur_curpos.lnum; + if (find_match(lookfor, ourscope) == OK) + { +! amount = get_indent(); // XXX + goto theend; + } + } + +! // We get here if we are not on an "while-of-do" or "else" (or +! // failed to find a matching "if"). +! // Search backwards for something to line up with. +! // First set amount for when we don't find anything. +! +! // if the '{' is _really_ at the left margin, use the imaginary +! // location of a left-margin brace. Otherwise, correct the +! // location for b_ind_open_extra. + +! if (start_brace == BRACE_IN_COL0) // '{' is in column 0 + { + amount = curbuf->b_ind_open_left_imag; + lookfor_cpp_namespace = TRUE; + } + else if (start_brace == BRACE_AT_START && +! lookfor_cpp_namespace) // '{' is at start + { + + lookfor_cpp_namespace = TRUE; + } + else + { +! if (start_brace == BRACE_AT_END) // '{' is at end of line + { + amount += curbuf->b_ind_open_imag; + +*************** +*** 2659,2665 **** + } + else + { +! /* Compensate for adding b_ind_open_extra later. */ + amount -= curbuf->b_ind_open_extra; + if (amount < 0) + amount = 0; +--- 2602,2608 ---- + } + else + { +! // Compensate for adding b_ind_open_extra later. + amount -= curbuf->b_ind_open_extra; + if (amount < 0) + amount = 0; +*************** +*** 2668,2734 **** + + lookfor_break = FALSE; + +! if (cin_iscase(theline, FALSE)) /* it's a switch() label */ + { +! lookfor = LOOKFOR_CASE; /* find a previous switch() label */ + amount += curbuf->b_ind_case; + } +! else if (cin_isscopedecl(theline)) /* private:, ... */ + { +! lookfor = LOOKFOR_SCOPEDECL; /* class decl is this block */ + amount += curbuf->b_ind_scopedecl; + } + else + { + if (curbuf->b_ind_case_break && cin_isbreak(theline)) +! /* break; ... */ + lookfor_break = TRUE; + + lookfor = LOOKFOR_INITIAL; +! /* b_ind_level from start of block */ + amount += curbuf->b_ind_level; + } + scope_amount = amount; + whilelevel = 0; + +! /* +! * Search backwards. If we find something we recognize, line up +! * with that. +! * +! * If we're looking at an open brace, indent +! * the usual amount relative to the conditional +! * that opens the block. +! */ + curwin->w_cursor = cur_curpos; + for (;;) + { + curwin->w_cursor.lnum--; + curwin->w_cursor.col = 0; + +! /* +! * If we went all the way back to the start of our scope, line +! * up with it. +! */ + if (curwin->w_cursor.lnum <= ourscope) + { +! /* We reached end of scope: +! * If looking for a enum or structure initialization +! * go further back: +! * If it is an initializer (enum xxx or xxx =), then +! * don't add ind_continuation, otherwise it is a variable +! * declaration: +! * int x, +! * here; <-- add ind_continuation +! */ + if (lookfor == LOOKFOR_ENUM_OR_INIT) + { + if (curwin->w_cursor.lnum == 0 + || curwin->w_cursor.lnum + < ourscope - curbuf->b_ind_maxparen) + { +! /* nothing found (abuse curbuf->b_ind_maxparen as +! * limit) assume terminated line (i.e. a variable +! * initialization) */ + if (cont_amount > 0) + amount = cont_amount; + else if (!curbuf->b_ind_js) +--- 2611,2672 ---- + + lookfor_break = FALSE; + +! if (cin_iscase(theline, FALSE)) // it's a switch() label + { +! lookfor = LOOKFOR_CASE; // find a previous switch() label + amount += curbuf->b_ind_case; + } +! else if (cin_isscopedecl(theline)) // private:, ... + { +! lookfor = LOOKFOR_SCOPEDECL; // class decl is this block + amount += curbuf->b_ind_scopedecl; + } + else + { + if (curbuf->b_ind_case_break && cin_isbreak(theline)) +! // break; ... + lookfor_break = TRUE; + + lookfor = LOOKFOR_INITIAL; +! // b_ind_level from start of block + amount += curbuf->b_ind_level; + } + scope_amount = amount; + whilelevel = 0; + +! // Search backwards. If we find something we recognize, line up +! // with that. +! // +! // If we're looking at an open brace, indent +! // the usual amount relative to the conditional +! // that opens the block. + curwin->w_cursor = cur_curpos; + for (;;) + { + curwin->w_cursor.lnum--; + curwin->w_cursor.col = 0; + +! // If we went all the way back to the start of our scope, line +! // up with it. + if (curwin->w_cursor.lnum <= ourscope) + { +! // We reached end of scope: +! // If looking for a enum or structure initialization +! // go further back: +! // If it is an initializer (enum xxx or xxx =), then +! // don't add ind_continuation, otherwise it is a variable +! // declaration: +! // int x, +! // here; <-- add ind_continuation + if (lookfor == LOOKFOR_ENUM_OR_INIT) + { + if (curwin->w_cursor.lnum == 0 + || curwin->w_cursor.lnum + < ourscope - curbuf->b_ind_maxparen) + { +! // nothing found (abuse curbuf->b_ind_maxparen as +! // limit) assume terminated line (i.e. a variable +! // initialization) + if (cont_amount > 0) + amount = cont_amount; + else if (!curbuf->b_ind_js) +*************** +*** 2738,2747 **** + + l = ml_get_curline(); + +! /* +! * If we're in a comment or raw string now, skip to +! * the start of it. +! */ + trypos = ind_find_start_CORS(NULL); + if (trypos != NULL) + { +--- 2676,2683 ---- + + l = ml_get_curline(); + +! // If we're in a comment or raw string now, skip to +! // the start of it. + trypos = ind_find_start_CORS(NULL); + if (trypos != NULL) + { +*************** +*** 2750,2758 **** + continue; + } + +! /* +! * Skip preprocessor directives and blank lines. +! */ + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, + &amount)) + continue; +--- 2686,2692 ---- + continue; + } + +! // Skip preprocessor directives and blank lines. + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, + &amount)) + continue; +*************** +*** 2762,2802 **** + + terminated = cin_isterminated(l, FALSE, TRUE); + +! /* +! * If we are at top level and the line looks like a +! * function declaration, we are done +! * (it's a variable declaration). +! */ + if (start_brace != BRACE_IN_COL0 + || !cin_isfuncdecl(&l, curwin->w_cursor.lnum, 0)) + { +! /* if the line is terminated with another ',' +! * it is a continued variable initialization. +! * don't add extra indent. +! * TODO: does not work, if a function +! * declaration is split over multiple lines: +! * cin_isfuncdecl returns FALSE then. +! */ + if (terminated == ',') + break; + +! /* if it es a enum declaration or an assignment, +! * we are done. +! */ + if (terminated != ';' && cin_isinit()) + break; + +! /* nothing useful found */ + if (terminated == 0 || terminated == '{') + continue; + } + + if (terminated != ';') + { +! /* Skip parens and braces. Position the cursor +! * over the rightmost paren, so that matching it +! * will take us back to the start of the line. +! */ /* XXX */ + trypos = NULL; + if (find_last_paren(l, '(', ')')) + trypos = find_match_paren( +--- 2696,2732 ---- + + terminated = cin_isterminated(l, FALSE, TRUE); + +! // If we are at top level and the line looks like a +! // function declaration, we are done +! // (it's a variable declaration). + if (start_brace != BRACE_IN_COL0 + || !cin_isfuncdecl(&l, curwin->w_cursor.lnum, 0)) + { +! // if the line is terminated with another ',' +! // it is a continued variable initialization. +! // don't add extra indent. +! // TODO: does not work, if a function +! // declaration is split over multiple lines: +! // cin_isfuncdecl returns FALSE then. + if (terminated == ',') + break; + +! // if it es a enum declaration or an assignment, +! // we are done. + if (terminated != ';' && cin_isinit()) + break; + +! // nothing useful found + if (terminated == 0 || terminated == '{') + continue; + } + + if (terminated != ';') + { +! // Skip parens and braces. Position the cursor +! // over the rightmost paren, so that matching it +! // will take us back to the start of the line. +! // XXX + trypos = NULL; + if (find_last_paren(l, '(', ')')) + trypos = find_match_paren( +*************** +*** 2813,2823 **** + } + } + +! /* it's a variable declaration, add indentation +! * like in +! * int a, +! * b; +! */ + if (cont_amount > 0) + amount = cont_amount; + else +--- 2743,2752 ---- + } + } + +! // it's a variable declaration, add indentation +! // like in +! // int a, +! // b; + if (cont_amount > 0) + amount = cont_amount; + else +*************** +*** 2846,2855 **** + + if (lookfor_cpp_namespace) + { +! /* +! * Looking for C++ namespace, need to look further +! * back. +! */ + if (curwin->w_cursor.lnum == ourscope) + continue; + +--- 2775,2782 ---- + + if (lookfor_cpp_namespace) + { +! // Looking for C++ namespace, need to look further +! // back. + if (curwin->w_cursor.lnum == ourscope) + continue; + +*************** +*** 2860,2867 **** + + l = ml_get_curline(); + +! /* If we're in a comment or raw string now, skip +! * to the start of it. */ + trypos = ind_find_start_CORS(NULL); + if (trypos != NULL) + { +--- 2787,2794 ---- + + l = ml_get_curline(); + +! // If we're in a comment or raw string now, skip +! // to the start of it. + trypos = ind_find_start_CORS(NULL); + if (trypos != NULL) + { +*************** +*** 2870,2881 **** + continue; + } + +! /* Skip preprocessor directives and blank lines. */ + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, + &amount)) + continue; + +! /* Finally the actual check for "namespace". */ + if (cin_is_cpp_namespace(l)) + { + amount += curbuf->b_ind_cpp_namespace +--- 2797,2808 ---- + continue; + } + +! // Skip preprocessor directives and blank lines. + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, + &amount)) + continue; + +! // Finally the actual check for "namespace". + if (cin_is_cpp_namespace(l)) + { + amount += curbuf->b_ind_cpp_namespace +*************** +*** 2896,2905 **** + break; + } + +! /* +! * If we're in a comment or raw string now, skip to the start +! * of it. +! */ /* XXX */ + if ((trypos = ind_find_start_CORS(&raw_string_start)) != NULL) + { + curwin->w_cursor.lnum = trypos->lnum + 1; +--- 2823,2830 ---- + break; + } + +! // If we're in a comment or raw string now, skip to the start +! // of it. XXX + if ((trypos = ind_find_start_CORS(&raw_string_start)) != NULL) + { + curwin->w_cursor.lnum = trypos->lnum + 1; +*************** +*** 2909,2936 **** + + l = ml_get_curline(); + +! /* +! * If this is a switch() label, may line up relative to that. +! * If this is a C++ scope declaration, do the same. +! */ + iscase = cin_iscase(l, FALSE); + if (iscase || cin_isscopedecl(l)) + { +! /* we are only looking for cpp base class +! * declaration/initialization any longer */ + if (lookfor == LOOKFOR_CPP_BASECLASS) + break; + +! /* When looking for a "do" we are not interested in +! * labels. */ + if (whilelevel > 0) + continue; + +! /* +! * case xx: +! * c = 99 + <- this indent plus continuation +! *-> here; +! */ + if (lookfor == LOOKFOR_UNTERM + || lookfor == LOOKFOR_ENUM_OR_INIT) + { +--- 2834,2857 ---- + + l = ml_get_curline(); + +! // If this is a switch() label, may line up relative to that. +! // If this is a C++ scope declaration, do the same. + iscase = cin_iscase(l, FALSE); + if (iscase || cin_isscopedecl(l)) + { +! // we are only looking for cpp base class +! // declaration/initialization any longer + if (lookfor == LOOKFOR_CPP_BASECLASS) + break; + +! // When looking for a "do" we are not interested in +! // labels. + if (whilelevel > 0) + continue; + +! // case xx: +! // c = 99 + <- this indent plus continuation +! //-> here; + if (lookfor == LOOKFOR_UNTERM + || lookfor == LOOKFOR_ENUM_OR_INIT) + { +*************** +*** 2941,2980 **** + break; + } + +! /* +! * case xx: <- line up with this case +! * x = 333; +! * case yy: +! */ + if ( (iscase && lookfor == LOOKFOR_CASE) + || (iscase && lookfor_break) + || (!iscase && lookfor == LOOKFOR_SCOPEDECL)) + { +! /* +! * Check that this case label is not for another +! * switch() +! */ /* XXX */ + if ((trypos = find_start_brace()) == NULL + || trypos->lnum == ourscope) + { +! amount = get_indent(); /* XXX */ + break; + } + continue; + } + +! n = get_indent_nolabel(curwin->w_cursor.lnum); /* XXX */ + +! /* +! * case xx: if (cond) <- line up with this if +! * y = y + 1; +! * -> s = 99; +! * +! * case xx: +! * if (cond) <- line up with this line +! * y = y + 1; +! * -> s = 99; +! */ + if (lookfor == LOOKFOR_TERM) + { + if (n) +--- 2862,2895 ---- + break; + } + +! // case xx: <- line up with this case +! // x = 333; +! // case yy: + if ( (iscase && lookfor == LOOKFOR_CASE) + || (iscase && lookfor_break) + || (!iscase && lookfor == LOOKFOR_SCOPEDECL)) + { +! // Check that this case label is not for another +! // switch() XXX + if ((trypos = find_start_brace()) == NULL + || trypos->lnum == ourscope) + { +! amount = get_indent(); // XXX + break; + } + continue; + } + +! n = get_indent_nolabel(curwin->w_cursor.lnum); // XXX + +! // case xx: if (cond) <- line up with this if +! // y = y + 1; +! // -> s = 99; +! // +! // case xx: +! // if (cond) <- line up with this line +! // y = y + 1; +! // -> s = 99; + if (lookfor == LOOKFOR_TERM) + { + if (n) +*************** +*** 2984,2996 **** + break; + } + +! /* +! * case xx: x = x + 1; <- line up with this x +! * -> y = y + 1; +! * +! * case xx: if (cond) <- line up with this if +! * -> y = y + 1; +! */ + if (n) + { + amount = n; +--- 2899,2909 ---- + break; + } + +! // case xx: x = x + 1; <- line up with this x +! // -> y = y + 1; +! // +! // case xx: if (cond) <- line up with this if +! // -> y = y + 1; + if (n) + { + amount = n; +*************** +*** 3006,3020 **** + break; + } + +! /* +! * Try to get the indent of a statement before the switch +! * label. If nothing is found, line up relative to the +! * switch label. +! * break; <- may line up with this line +! * case xx: +! * -> y = 1; +! */ +! scope_amount = get_indent() + (iscase /* XXX */ + ? curbuf->b_ind_case_code + : curbuf->b_ind_scopedecl_code); + lookfor = curbuf->b_ind_case_break +--- 2919,2931 ---- + break; + } + +! // Try to get the indent of a statement before the switch +! // label. If nothing is found, line up relative to the +! // switch label. +! // break; <- may line up with this line +! // case xx: +! // -> y = 1; +! scope_amount = get_indent() + (iscase // XXX + ? curbuf->b_ind_case_code + : curbuf->b_ind_scopedecl_code); + lookfor = curbuf->b_ind_case_break +*************** +*** 3022,3031 **** + continue; + } + +! /* +! * Looking for a switch() label or C++ scope declaration, +! * ignore other lines, skip {}-blocks. +! */ + if (lookfor == LOOKFOR_CASE || lookfor == LOOKFOR_SCOPEDECL) + { + if (find_last_paren(l, '{', '}') +--- 2933,2940 ---- + continue; + } + +! // Looking for a switch() label or C++ scope declaration, +! // ignore other lines, skip {}-blocks. + if (lookfor == LOOKFOR_CASE || lookfor == LOOKFOR_SCOPEDECL) + { + if (find_last_paren(l, '{', '}') +*************** +*** 3037,3045 **** + continue; + } + +! /* +! * Ignore jump labels with nothing after them. +! */ + if (!curbuf->b_ind_js && cin_islabel()) + { + l = after_label(ml_get_curline()); +--- 2946,2952 ---- + continue; + } + +! // Ignore jump labels with nothing after them. + if (!curbuf->b_ind_js && cin_islabel()) + { + l = after_label(ml_get_curline()); +*************** +*** 3047,3067 **** + continue; + } + +! /* +! * Ignore #defines, #if, etc. +! * Ignore comment and empty lines. +! * (need to get the line again, cin_islabel() may have +! * unlocked it) +! */ + l = ml_get_curline(); + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount) + || cin_nocode(l)) + continue; + +! /* +! * Are we at the start of a cpp base class declaration or +! * constructor initialization? +! */ /* XXX */ + n = FALSE; + if (lookfor != LOOKFOR_TERM && curbuf->b_ind_cpp_baseclass > 0) + { +--- 2954,2970 ---- + continue; + } + +! // Ignore #defines, #if, etc. +! // Ignore comment and empty lines. +! // (need to get the line again, cin_islabel() may have +! // unlocked it) + l = ml_get_curline(); + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount) + || cin_nocode(l)) + continue; + +! // Are we at the start of a cpp base class declaration or +! // constructor initialization? XXX + n = FALSE; + if (lookfor != LOOKFOR_TERM && curbuf->b_ind_cpp_baseclass > 0) + { +*************** +*** 3079,3132 **** + } + else if (theline[0] == '{') + { +! /* Need to find start of the declaration. */ + lookfor = LOOKFOR_UNTERM; + ind_continuation = 0; + continue; + } + else +! /* XXX */ + amount = get_baseclass_amount( + cache_cpp_baseclass.lpos.col); + break; + } + else if (lookfor == LOOKFOR_CPP_BASECLASS) + { +! /* only look, whether there is a cpp base class +! * declaration or initialization before the opening brace. +! */ + if (cin_isterminated(l, TRUE, FALSE)) + break; + else + continue; + } + +! /* +! * What happens next depends on the line being terminated. +! * If terminated with a ',' only consider it terminating if +! * there is another unterminated statement behind, eg: +! * 123, +! * sizeof +! * here +! * Otherwise check whether it is a enumeration or structure +! * initialisation (not indented) or a variable declaration +! * (indented). +! */ + terminated = cin_isterminated(l, FALSE, TRUE); + + if (js_cur_has_key) + { +! js_cur_has_key = 0; /* only check the first line */ + if (curbuf->b_ind_js && terminated == ',') + { +! /* For Javascript we might be inside an object: +! * key: something, <- align with this +! * key: something +! * or: +! * key: something + <- align with this +! * something, +! * key: something +! */ + lookfor = LOOKFOR_JS_KEY; + } + } +--- 2982,3031 ---- + } + else if (theline[0] == '{') + { +! // Need to find start of the declaration. + lookfor = LOOKFOR_UNTERM; + ind_continuation = 0; + continue; + } + else +! // XXX + amount = get_baseclass_amount( + cache_cpp_baseclass.lpos.col); + break; + } + else if (lookfor == LOOKFOR_CPP_BASECLASS) + { +! // only look, whether there is a cpp base class +! // declaration or initialization before the opening brace. + if (cin_isterminated(l, TRUE, FALSE)) + break; + else + continue; + } + +! // What happens next depends on the line being terminated. +! // If terminated with a ',' only consider it terminating if +! // there is another unterminated statement behind, eg: +! // 123, +! // sizeof +! // here +! // Otherwise check whether it is a enumeration or structure +! // initialisation (not indented) or a variable declaration +! // (indented). + terminated = cin_isterminated(l, FALSE, TRUE); + + if (js_cur_has_key) + { +! js_cur_has_key = 0; // only check the first line + if (curbuf->b_ind_js && terminated == ',') + { +! // For Javascript we might be inside an object: +! // key: something, <- align with this +! // key: something +! // or: +! // key: something + <- align with this +! // something, +! // key: something + lookfor = LOOKFOR_JS_KEY; + } + } +*************** +*** 3141,3156 **** + >= curwin->w_cursor.lnum) + break; + if (terminated == ',') +! /* line below current line is the one that starts a +! * (possibly broken) line ending in a comma. */ + break; + else + { + amount = get_indent(); + if (curwin->w_cursor.lnum - 1 == ourscope) +! /* line above is start of the scope, thus current +! * line is the one that stars a (possibly broken) +! * line ending in a comma. */ + break; + } + } +--- 3040,3055 ---- + >= curwin->w_cursor.lnum) + break; + if (terminated == ',') +! // line below current line is the one that starts a +! // (possibly broken) line ending in a comma. + break; + else + { + amount = get_indent(); + if (curwin->w_cursor.lnum - 1 == ourscope) +! // line above is start of the scope, thus current +! // line is the one that stars a (possibly broken) +! // line ending in a comma. + break; + } + } +*************** +*** 3161,3178 **** + if (lookfor != LOOKFOR_ENUM_OR_INIT && + (*skipwhite(l) == '[' || l[STRLEN(l) - 1] == '[')) + amount += ind_continuation; +! /* +! * if we're in the middle of a paren thing, +! * go back to the line that starts it so +! * we can get the right prevailing indent +! * if ( foo && +! * bar ) +! */ +! /* +! * Position the cursor over the rightmost paren, so that +! * matching it will take us back to the start of the line. +! * Ignore a match before the start of the block. +! */ + (void)find_last_paren(l, '(', ')'); + trypos = find_match_paren(corr_ind_maxparen(&cur_curpos)); + if (trypos != NULL && (trypos->lnum < tryposBrace->lnum +--- 3060,3074 ---- + if (lookfor != LOOKFOR_ENUM_OR_INIT && + (*skipwhite(l) == '[' || l[STRLEN(l) - 1] == '[')) + amount += ind_continuation; +! // if we're in the middle of a paren thing, +! // go back to the line that starts it so +! // we can get the right prevailing indent +! // if ( foo && +! // bar ) +! +! // Position the cursor over the rightmost paren, so that +! // matching it will take us back to the start of the line. +! // Ignore a match before the start of the block. + (void)find_last_paren(l, '(', ')'); + trypos = find_match_paren(corr_ind_maxparen(&cur_curpos)); + if (trypos != NULL && (trypos->lnum < tryposBrace->lnum +*************** +*** 3180,3201 **** + && trypos->col < tryposBrace->col))) + trypos = NULL; + +! /* +! * If we are looking for ',', we also look for matching +! * braces. +! */ + if (trypos == NULL && terminated == ',' + && find_last_paren(l, '{', '}')) + trypos = find_start_brace(); + + if (trypos != NULL) + { +! /* +! * Check if we are on a case label now. This is +! * handled above. +! * case xx: if ( asdf && +! * asdf) +! */ + curwin->w_cursor = *trypos; + l = ml_get_curline(); + if (cin_iscase(l, FALSE) || cin_isscopedecl(l)) +--- 3076,3093 ---- + && trypos->col < tryposBrace->col))) + trypos = NULL; + +! // If we are looking for ',', we also look for matching +! // braces. + if (trypos == NULL && terminated == ',' + && find_last_paren(l, '{', '}')) + trypos = find_start_brace(); + + if (trypos != NULL) + { +! // Check if we are on a case label now. This is +! // handled above. +! // case xx: if ( asdf && +! // asdf) + curwin->w_cursor = *trypos; + l = ml_get_curline(); + if (cin_iscase(l, FALSE) || cin_isscopedecl(l)) +*************** +*** 3225,3282 **** + } + } + +! /* +! * Get indent and pointer to text for current line, +! * ignoring any jump label. XXX +! */ + if (curbuf->b_ind_js) + cur_amount = get_indent(); + else + cur_amount = skip_label(curwin->w_cursor.lnum, &l); +! /* +! * If this is just above the line we are indenting, and it +! * starts with a '{', line it up with this line. +! * while (not) +! * -> { +! * } +! */ + if (terminated != ',' && lookfor != LOOKFOR_TERM + && theline[0] == '{') + { + amount = cur_amount; +! /* +! * Only add b_ind_open_extra when the current line +! * doesn't start with a '{', which must have a match +! * in the same line (scope is the same). Probably: +! * { 1, 2 }, +! * -> { 3, 4 } +! */ + if (*skipwhite(l) != '{') + amount += curbuf->b_ind_open_extra; + + if (curbuf->b_ind_cpp_baseclass && !curbuf->b_ind_js) + { +! /* have to look back, whether it is a cpp base +! * class declaration or initialization */ + lookfor = LOOKFOR_CPP_BASECLASS; + continue; + } + break; + } + +! /* +! * Check if we are after an "if", "while", etc. +! * Also allow " } else". +! */ + if (cin_is_cinword(l) || cin_iselse(skipwhite(l))) + { +! /* +! * Found an unterminated line after an if (), line up +! * with the last one. +! * if (cond) +! * 100 + +! * -> here; +! */ + if (lookfor == LOOKFOR_UNTERM + || lookfor == LOOKFOR_ENUM_OR_INIT) + { +--- 3117,3164 ---- + } + } + +! // Get indent and pointer to text for current line, +! // ignoring any jump label. XXX + if (curbuf->b_ind_js) + cur_amount = get_indent(); + else + cur_amount = skip_label(curwin->w_cursor.lnum, &l); +! // If this is just above the line we are indenting, and it +! // starts with a '{', line it up with this line. +! // while (not) +! // -> { +! // } + if (terminated != ',' && lookfor != LOOKFOR_TERM + && theline[0] == '{') + { + amount = cur_amount; +! // Only add b_ind_open_extra when the current line +! // doesn't start with a '{', which must have a match +! // in the same line (scope is the same). Probably: +! // { 1, 2 }, +! // -> { 3, 4 } + if (*skipwhite(l) != '{') + amount += curbuf->b_ind_open_extra; + + if (curbuf->b_ind_cpp_baseclass && !curbuf->b_ind_js) + { +! // have to look back, whether it is a cpp base +! // class declaration or initialization + lookfor = LOOKFOR_CPP_BASECLASS; + continue; + } + break; + } + +! // Check if we are after an "if", "while", etc. +! // Also allow " } else". + if (cin_is_cinword(l) || cin_iselse(skipwhite(l))) + { +! // Found an unterminated line after an if (), line up +! // with the last one. +! // if (cond) +! // 100 + +! // -> here; + if (lookfor == LOOKFOR_UNTERM + || lookfor == LOOKFOR_ENUM_OR_INIT) + { +*************** +*** 3287,3305 **** + break; + } + +! /* +! * If this is just above the line we are indenting, we +! * are finished. +! * while (not) +! * -> here; +! * Otherwise this indent can be used when the line +! * before this is terminated. +! * yyy; +! * if (stat) +! * while (not) +! * xxx; +! * -> here; +! */ + amount = cur_amount; + if (theline[0] == '{') + amount += curbuf->b_ind_open_extra; +--- 3169,3185 ---- + break; + } + +! // If this is just above the line we are indenting, we +! // are finished. +! // while (not) +! // -> here; +! // Otherwise this indent can be used when the line +! // before this is terminated. +! // yyy; +! // if (stat) +! // while (not) +! // xxx; +! // -> here; + amount = cur_amount; + if (theline[0] == '{') + amount += curbuf->b_ind_open_extra; +*************** +*** 3310,3322 **** + break; + } + +! /* +! * Special trick: when expecting the while () after a +! * do, line up with the while() +! * do +! * x = 1; +! * -> here +! */ + l = skipwhite(ml_get_curline()); + if (cin_isdo(l)) + { +--- 3190,3200 ---- + break; + } + +! // Special trick: when expecting the while () after a +! // do, line up with the while() +! // do +! // x = 1; +! // -> here + l = skipwhite(ml_get_curline()); + if (cin_isdo(l)) + { +*************** +*** 3325,3341 **** + --whilelevel; + } + +! /* +! * When searching for a terminated line, don't use the +! * one between the "if" and the matching "else". +! * Need to use the scope of this "else". XXX +! * If whilelevel != 0 continue looking for a "do {". +! */ + if (cin_iselse(l) && whilelevel == 0) + { +! /* If we're looking at "} else", let's make sure we +! * find the opening brace of the enclosing scope, +! * not the one from "if () {". */ + if (*l == '}') + curwin->w_cursor.col = + (colnr_T)(l - ml_get_curline()) + 1; +--- 3203,3217 ---- + --whilelevel; + } + +! // When searching for a terminated line, don't use the +! // one between the "if" and the matching "else". +! // Need to use the scope of this "else". XXX +! // If whilelevel != 0 continue looking for a "do {". + if (cin_iselse(l) && whilelevel == 0) + { +! // If we're looking at "} else", let's make sure we +! // find the opening brace of the enclosing scope, +! // not the one from "if () {". + if (*l == '}') + curwin->w_cursor.col = + (colnr_T)(l - ml_get_curline()) + 1; +*************** +*** 3347,3370 **** + } + } + +! /* +! * If we're below an unterminated line that is not an +! * "if" or something, we may line up with this line or +! * add something for a continuation line, depending on +! * the line before this one. +! */ + else + { +! /* +! * Found two unterminated lines on a row, line up with +! * the last one. +! * c = 99 + +! * 100 + +! * -> here; +! */ + if (lookfor == LOOKFOR_UNTERM) + { +! /* When line ends in a comma add extra indent */ + if (terminated == ',') + amount += ind_continuation; + break; +--- 3223,3242 ---- + } + } + +! // If we're below an unterminated line that is not an +! // "if" or something, we may line up with this line or +! // add something for a continuation line, depending on +! // the line before this one. + else + { +! // Found two unterminated lines on a row, line up with +! // the last one. +! // c = 99 + +! // 100 + +! // -> here; + if (lookfor == LOOKFOR_UNTERM) + { +! // When line ends in a comma add extra indent + if (terminated == ',') + amount += ind_continuation; + break; +*************** +*** 3372,3382 **** + + if (lookfor == LOOKFOR_ENUM_OR_INIT) + { +! /* Found two lines ending in ',', lineup with the +! * lowest one, but check for cpp base class +! * declaration/initialization, if it is an +! * opening brace or we are looking just for +! * enumerations/initializations. */ + if (terminated == ',') + { + if (curbuf->b_ind_cpp_baseclass == 0) +--- 3244,3254 ---- + + if (lookfor == LOOKFOR_ENUM_OR_INIT) + { +! // Found two lines ending in ',', lineup with the +! // lowest one, but check for cpp base class +! // declaration/initialization, if it is an +! // opening brace or we are looking just for +! // enumerations/initializations. + if (terminated == ',') + { + if (curbuf->b_ind_cpp_baseclass == 0) +*************** +*** 3386,3404 **** + continue; + } + +! /* Ignore unterminated lines in between, but +! * reduce indent. */ + if (amount > cur_amount) + amount = cur_amount; + } + else + { +! /* +! * Found first unterminated line on a row, may +! * line up with this line, remember its indent +! * 100 + +! * -> here; +! */ + l = ml_get_curline(); + amount = cur_amount; + +--- 3258,3274 ---- + continue; + } + +! // Ignore unterminated lines in between, but +! // reduce indent. + if (amount > cur_amount) + amount = cur_amount; + } + else + { +! // Found first unterminated line on a row, may +! // line up with this line, remember its indent +! // 100 + +! // -> here; + l = ml_get_curline(); + amount = cur_amount; + +*************** +*** 3407,3439 **** + || (n >=2 && l[n - 2] == ']'))) + break; + +! /* +! * If previous line ends in ',', check whether we +! * are in an initialization or enum +! * struct xxx = +! * { +! * sizeof a, +! * 124 }; +! * or a normal possible continuation line. +! * but only, of no other statement has been found +! * yet. +! */ + if (lookfor == LOOKFOR_INITIAL && terminated == ',') + { + if (curbuf->b_ind_js) + { +! /* Search for a line ending in a comma +! * and line up with the line below it +! * (could be the current line). +! * some = [ +! * 1, <- line up here +! * 2, +! * some = [ +! * 3 + <- line up here +! * 4 * +! * 5, +! * 6, +! */ + if (cin_iscomment(skipwhite(l))) + break; + lookfor = LOOKFOR_COMMA; +--- 3277,3306 ---- + || (n >=2 && l[n - 2] == ']'))) + break; + +! // If previous line ends in ',', check whether we +! // are in an initialization or enum +! // struct xxx = +! // { +! // sizeof a, +! // 124 }; +! // or a normal possible continuation line. +! // but only, of no other statement has been found +! // yet. + if (lookfor == LOOKFOR_INITIAL && terminated == ',') + { + if (curbuf->b_ind_js) + { +! // Search for a line ending in a comma +! // and line up with the line below it +! // (could be the current line). +! // some = [ +! // 1, <- line up here +! // 2, +! // some = [ +! // 3 + <- line up here +! // 4 * +! // 5, +! // 6, + if (cin_iscomment(skipwhite(l))) + break; + lookfor = LOOKFOR_COMMA; +*************** +*** 3444,3451 **** + if (trypos->lnum + == curwin->w_cursor.lnum - 1) + { +! /* Current line is first inside +! * [], line up with it. */ + break; + } + ourscope = trypos->lnum; +--- 3311,3318 ---- + if (trypos->lnum + == curwin->w_cursor.lnum - 1) + { +! // Current line is first inside +! // [], line up with it. + break; + } + ourscope = trypos->lnum; +*************** +*** 3462,3468 **** + if (lookfor == LOOKFOR_INITIAL + && *l != NUL + && l[STRLEN(l) - 1] == '\\') +! /* XXX */ + cont_amount = cin_get_equal_amount( + curwin->w_cursor.lnum); + if (lookfor != LOOKFOR_TERM +--- 3329,3335 ---- + if (lookfor == LOOKFOR_INITIAL + && *l != NUL + && l[STRLEN(l) - 1] == '\\') +! // XXX + cont_amount = cin_get_equal_amount( + curwin->w_cursor.lnum); + if (lookfor != LOOKFOR_TERM +*************** +*** 3475,3493 **** + } + } + +! /* +! * Check if we are after a while (cond); +! * If so: Ignore until the matching "do". +! */ +! else if (cin_iswhileofdo_end(terminated)) /* XXX */ + { +! /* +! * Found an unterminated line after a while ();, line up +! * with the last one. +! * while (cond); +! * 100 + <- line up with this one +! * -> here; +! */ + if (lookfor == LOOKFOR_UNTERM + || lookfor == LOOKFOR_ENUM_OR_INIT) + { +--- 3342,3356 ---- + } + } + +! // Check if we are after a while (cond); +! // If so: Ignore until the matching "do". +! else if (cin_iswhileofdo_end(terminated)) // XXX + { +! // Found an unterminated line after a while ();, line up +! // with the last one. +! // while (cond); +! // 100 + <- line up with this one +! // -> here; + if (lookfor == LOOKFOR_UNTERM + || lookfor == LOOKFOR_ENUM_OR_INIT) + { +*************** +*** 3501,3526 **** + if (whilelevel == 0) + { + lookfor = LOOKFOR_TERM; +! amount = get_indent(); /* XXX */ + if (theline[0] == '{') + amount += curbuf->b_ind_open_extra; + } + ++whilelevel; + } + +! /* +! * We are after a "normal" statement. +! * If we had another statement we can stop now and use the +! * indent of that other statement. +! * Otherwise the indent of the current statement may be used, +! * search backwards for the next "normal" statement. +! */ + else + { +! /* +! * Skip single break line, if before a switch label. It +! * may be lined up with the case label. +! */ + if (lookfor == LOOKFOR_NOBREAK + && cin_isbreak(skipwhite(ml_get_curline()))) + { +--- 3364,3385 ---- + if (whilelevel == 0) + { + lookfor = LOOKFOR_TERM; +! amount = get_indent(); // XXX + if (theline[0] == '{') + amount += curbuf->b_ind_open_extra; + } + ++whilelevel; + } + +! // We are after a "normal" statement. +! // If we had another statement we can stop now and use the +! // indent of that other statement. +! // Otherwise the indent of the current statement may be used, +! // search backwards for the next "normal" statement. + else + { +! // Skip single break line, if before a switch label. It +! // may be lined up with the case label. + if (lookfor == LOOKFOR_NOBREAK + && cin_isbreak(skipwhite(ml_get_curline()))) + { +*************** +*** 3528,3558 **** + continue; + } + +! /* +! * Handle "do {" line. +! */ + if (whilelevel > 0) + { + l = cin_skipcomment(ml_get_curline()); + if (cin_isdo(l)) + { +! amount = get_indent(); /* XXX */ + --whilelevel; + continue; + } + } + +! /* +! * Found a terminated line above an unterminated line. Add +! * the amount for a continuation line. +! * x = 1; +! * y = foo + +! * -> here; +! * or +! * int x = 1; +! * int foo, +! * -> here; +! */ + if (lookfor == LOOKFOR_UNTERM + || lookfor == LOOKFOR_ENUM_OR_INIT) + { +--- 3387,3413 ---- + continue; + } + +! // Handle "do {" line. + if (whilelevel > 0) + { + l = cin_skipcomment(ml_get_curline()); + if (cin_isdo(l)) + { +! amount = get_indent(); // XXX + --whilelevel; + continue; + } + } + +! // Found a terminated line above an unterminated line. Add +! // the amount for a continuation line. +! // x = 1; +! // y = foo + +! // -> here; +! // or +! // int x = 1; +! // int foo, +! // -> here; + if (lookfor == LOOKFOR_UNTERM + || lookfor == LOOKFOR_ENUM_OR_INIT) + { +*************** +*** 3563,3610 **** + break; + } + +! /* +! * Found a terminated line above a terminated line or "if" +! * etc. line. Use the amount of the line below us. +! * x = 1; x = 1; +! * if (asdf) y = 2; +! * while (asdf) ->here; +! * here; +! * ->foo; +! */ + if (lookfor == LOOKFOR_TERM) + { + if (!lookfor_break && whilelevel == 0) + break; + } + +! /* +! * First line above the one we're indenting is terminated. +! * To know what needs to be done look further backward for +! * a terminated line. +! */ + else + { +! /* +! * position the cursor over the rightmost paren, so +! * that matching it will take us back to the start of +! * the line. Helps for: +! * func(asdr, +! * asdfasdf); +! * here; +! */ + term_again: + l = ml_get_curline(); + if (find_last_paren(l, '(', ')') + && (trypos = find_match_paren( + curbuf->b_ind_maxparen)) != NULL) + { +! /* +! * Check if we are on a case label now. This is +! * handled above. +! * case xx: if ( asdf && +! * asdf) +! */ + curwin->w_cursor = *trypos; + l = ml_get_curline(); + if (cin_iscase(l, FALSE) || cin_isscopedecl(l)) +--- 3418,3457 ---- + break; + } + +! // Found a terminated line above a terminated line or "if" +! // etc. line. Use the amount of the line below us. +! // x = 1; x = 1; +! // if (asdf) y = 2; +! // while (asdf) ->here; +! // here; +! // ->foo; + if (lookfor == LOOKFOR_TERM) + { + if (!lookfor_break && whilelevel == 0) + break; + } + +! // First line above the one we're indenting is terminated. +! // To know what needs to be done look further backward for +! // a terminated line. + else + { +! // position the cursor over the rightmost paren, so +! // that matching it will take us back to the start of +! // the line. Helps for: +! // func(asdr, +! // asdfasdf); +! // here; + term_again: + l = ml_get_curline(); + if (find_last_paren(l, '(', ')') + && (trypos = find_match_paren( + curbuf->b_ind_maxparen)) != NULL) + { +! // Check if we are on a case label now. This is +! // handled above. +! // case xx: if ( asdf && +! // asdf) + curwin->w_cursor = *trypos; + l = ml_get_curline(); + if (cin_iscase(l, FALSE) || cin_isscopedecl(l)) +*************** +*** 3615,3654 **** + } + } + +! /* When aligning with the case statement, don't align +! * with a statement after it. +! * case 1: { <-- don't use this { position +! * stat; +! * } +! * case 2: +! * stat; +! * } +! */ + iscase = (curbuf->b_ind_keep_case_label + && cin_iscase(l, FALSE)); + +! /* +! * Get indent and pointer to text for current line, +! * ignoring any jump label. +! */ + amount = skip_label(curwin->w_cursor.lnum, &l); + + if (theline[0] == '{') + amount += curbuf->b_ind_open_extra; +! /* See remark above: "Only add b_ind_open_extra.." */ + l = skipwhite(l); + if (*l == '{') + amount -= curbuf->b_ind_open_extra; + lookfor = iscase ? LOOKFOR_ANY : LOOKFOR_TERM; + +! /* +! * When a terminated line starts with "else" skip to +! * the matching "if": +! * else 3; +! * indent this; +! * Need to use the scope of this "else". XXX +! * If whilelevel != 0 continue looking for a "do {". +! */ + if (lookfor == LOOKFOR_TERM + && *l != '}' + && cin_iselse(l) +--- 3462,3496 ---- + } + } + +! // When aligning with the case statement, don't align +! // with a statement after it. +! // case 1: { <-- don't use this { position +! // stat; +! // } +! // case 2: +! // stat; +! // } + iscase = (curbuf->b_ind_keep_case_label + && cin_iscase(l, FALSE)); + +! // Get indent and pointer to text for current line, +! // ignoring any jump label. + amount = skip_label(curwin->w_cursor.lnum, &l); + + if (theline[0] == '{') + amount += curbuf->b_ind_open_extra; +! // See remark above: "Only add b_ind_open_extra.." + l = skipwhite(l); + if (*l == '{') + amount -= curbuf->b_ind_open_extra; + lookfor = iscase ? LOOKFOR_ANY : LOOKFOR_TERM; + +! // When a terminated line starts with "else" skip to +! // the matching "if": +! // else 3; +! // indent this; +! // Need to use the scope of this "else". XXX +! // If whilelevel != 0 continue looking for a "do {". + if (lookfor == LOOKFOR_TERM + && *l != '}' + && cin_iselse(l) +*************** +*** 3661,3677 **** + continue; + } + +! /* +! * If we're at the end of a block, skip to the start of +! * that block. +! */ + l = ml_get_curline(); +! if (find_last_paren(l, '{', '}') /* XXX */ + && (trypos = find_start_brace()) != NULL) + { + curwin->w_cursor = *trypos; +! /* if not "else {" check for terminated again */ +! /* but skip block for "} else {" */ + l = cin_skipcomment(ml_get_curline()); + if (*l == '}' || !cin_iselse(l)) + goto term_again; +--- 3503,3517 ---- + continue; + } + +! // If we're at the end of a block, skip to the start of +! // that block. + l = ml_get_curline(); +! if (find_last_paren(l, '{', '}') // XXX + && (trypos = find_start_brace()) != NULL) + { + curwin->w_cursor = *trypos; +! // if not "else {" check for terminated again +! // but skip block for "} else {" + l = cin_skipcomment(ml_get_curline()); + if (*l == '}' || !cin_iselse(l)) + goto term_again; +*************** +*** 3684,3712 **** + } + } + +! /* add extra indent for a comment */ + if (cin_iscomment(theline)) + amount += curbuf->b_ind_comment; + +! /* subtract extra left-shift for jump labels */ + if (curbuf->b_ind_jump_label > 0 && original_line_islabel) + amount -= curbuf->b_ind_jump_label; + + goto theend; + } + +! /* +! * ok -- we're not inside any sort of structure at all! +! * +! * This means we're at the top level, and everything should +! * basically just match where the previous line is, except +! * for the lines immediately following a function declaration, +! * which are K&R-style parameters and need to be indented. +! * +! * if our line starts with an open brace, forget about any +! * prevailing indent and make sure it looks like the start +! * of a function +! */ + + if (theline[0] == '{') + { +--- 3524,3550 ---- + } + } + +! // add extra indent for a comment + if (cin_iscomment(theline)) + amount += curbuf->b_ind_comment; + +! // subtract extra left-shift for jump labels + if (curbuf->b_ind_jump_label > 0 && original_line_islabel) + amount -= curbuf->b_ind_jump_label; + + goto theend; + } + +! // ok -- we're not inside any sort of structure at all! +! // +! // This means we're at the top level, and everything should +! // basically just match where the previous line is, except +! // for the lines immediately following a function declaration, +! // which are K&R-style parameters and need to be indented. +! // +! // if our line starts with an open brace, forget about any +! // prevailing indent and make sure it looks like the start +! // of a function + + if (theline[0] == '{') + { +*************** +*** 3714,3726 **** + goto theend; + } + +! /* +! * If the NEXT line is a function declaration, the current +! * line needs to be indented as a function type spec. +! * Don't do this if the current line looks like a comment or if the +! * current line is terminated, ie. ends in ';', or if the current line +! * contains { or }: "void f() {\n if (1)" +! */ + if (cur_curpos.lnum < curbuf->b_ml.ml_line_count + && !cin_nocode(theline) + && vim_strchr(theline, '{') == NULL +--- 3552,3562 ---- + goto theend; + } + +! // If the NEXT line is a function declaration, the current +! // line needs to be indented as a function type spec. +! // Don't do this if the current line looks like a comment or if the +! // current line is terminated, ie. ends in ';', or if the current line +! // contains { or }: "void f() {\n if (1)" + if (cur_curpos.lnum < curbuf->b_ml.ml_line_count + && !cin_nocode(theline) + && vim_strchr(theline, '{') == NULL +*************** +*** 3735,3741 **** + goto theend; + } + +! /* search backwards until we find something we recognize */ + amount = 0; + curwin->w_cursor = cur_curpos; + while (curwin->w_cursor.lnum > 1) +--- 3571,3577 ---- + goto theend; + } + +! // search backwards until we find something we recognize + amount = 0; + curwin->w_cursor = cur_curpos; + while (curwin->w_cursor.lnum > 1) +*************** +*** 3745,3754 **** + + l = ml_get_curline(); + +! /* +! * If we're in a comment or raw string now, skip to the start +! * of it. +! */ /* XXX */ + if ((trypos = ind_find_start_CORS(NULL)) != NULL) + { + curwin->w_cursor.lnum = trypos->lnum + 1; +--- 3581,3588 ---- + + l = ml_get_curline(); + +! // If we're in a comment or raw string now, skip to the start +! // of it. XXX + if ((trypos = ind_find_start_CORS(NULL)) != NULL) + { + curwin->w_cursor.lnum = trypos->lnum + 1; +*************** +*** 3756,3765 **** + continue; + } + +! /* +! * Are we at the start of a cpp base class declaration or +! * constructor initialization? +! */ /* XXX */ + n = FALSE; + if (curbuf->b_ind_cpp_baseclass != 0 && theline[0] != '{') + { +--- 3590,3597 ---- + continue; + } + +! // Are we at the start of a cpp base class declaration or +! // constructor initialization? XXX + n = FALSE; + if (curbuf->b_ind_cpp_baseclass != 0 && theline[0] != '{') + { +*************** +*** 3768,3810 **** + } + if (n) + { +! /* XXX */ + amount = get_baseclass_amount(cache_cpp_baseclass.lpos.col); + break; + } + +! /* +! * Skip preprocessor directives and blank lines. +! */ + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount)) + continue; + + if (cin_nocode(l)) + continue; + +! /* +! * If the previous line ends in ',', use one level of +! * indentation: +! * int foo, +! * bar; +! * do this before checking for '}' in case of eg. +! * enum foobar +! * { +! * ... +! * } foo, +! * bar; +! */ + n = 0; + if (cin_ends_in(l, (char_u *)",", NULL) + || (*l != NUL && (n = l[STRLEN(l) - 1]) == '\\')) + { +! /* take us back to opening paren */ + if (find_last_paren(l, '(', ')') + && (trypos = find_match_paren( + curbuf->b_ind_maxparen)) != NULL) + curwin->w_cursor = *trypos; + +! /* For a line ending in ',' that is a continuation line go + * back to the first line with a backslash: + * char *foo = "bla\ + * bla", +--- 3600,3639 ---- + } + if (n) + { +! // XXX + amount = get_baseclass_amount(cache_cpp_baseclass.lpos.col); + break; + } + +! // Skip preprocessor directives and blank lines. + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount)) + continue; + + if (cin_nocode(l)) + continue; + +! // If the previous line ends in ',', use one level of +! // indentation: +! // int foo, +! // bar; +! // do this before checking for '}' in case of eg. +! // enum foobar +! // { +! // ... +! // } foo, +! // bar; + n = 0; + if (cin_ends_in(l, (char_u *)",", NULL) + || (*l != NUL && (n = l[STRLEN(l) - 1]) == '\\')) + { +! // take us back to opening paren + if (find_last_paren(l, '(', ')') + && (trypos = find_match_paren( + curbuf->b_ind_maxparen)) != NULL) + curwin->w_cursor = *trypos; + +! /* +! * For a line ending in ',' that is a continuation line go + * back to the first line with a backslash: + * char *foo = "bla\ + * bla", +*************** +*** 3819,3825 **** + curwin->w_cursor.col = 0; + } + +! amount = get_indent(); /* XXX */ + + if (amount == 0) + amount = cin_first_id_amount(); +--- 3648,3654 ---- + curwin->w_cursor.col = 0; + } + +! amount = get_indent(); // XXX + + if (amount == 0) + amount = cin_first_id_amount(); +*************** +*** 3828,3874 **** + break; + } + +! /* +! * If the line looks like a function declaration, and we're +! * not in a comment, put it the left margin. +! */ +! if (cin_isfuncdecl(NULL, cur_curpos.lnum, 0)) /* XXX */ + break; + l = ml_get_curline(); + +! /* +! * Finding the closing '}' of a previous function. Put +! * current line at the left margin. For when 'cino' has "fs". +! */ + if (*skipwhite(l) == '}') + break; + +! /* (matching {) +! * If the previous line ends on '};' (maybe followed by +! * comments) align at column 0. For example: +! * char *string_array[] = { "foo", +! * / * x * / "b};ar" }; / * foobar * / +! */ + if (cin_ends_in(l, (char_u *)"};", NULL)) + break; + +! /* +! * If the previous line ends on '[' we are probably in an +! * array constant: +! * something = [ +! * 234, <- extra indent +! */ + if (cin_ends_in(l, (char_u *)"[", NULL)) + { + amount = get_indent() + ind_continuation; + break; + } + +! /* +! * Find a line only has a semicolon that belongs to a previous +! * line ending in '}', e.g. before an #endif. Don't increase +! * indent then. +! */ + if (*(look = skipwhite(l)) == ';' && cin_nocode(look + 1)) + { + pos_T curpos_save = curwin->w_cursor; +--- 3657,3694 ---- + break; + } + +! // If the line looks like a function declaration, and we're +! // not in a comment, put it the left margin. +! if (cin_isfuncdecl(NULL, cur_curpos.lnum, 0)) // XXX + break; + l = ml_get_curline(); + +! // Finding the closing '}' of a previous function. Put +! // current line at the left margin. For when 'cino' has "fs". + if (*skipwhite(l) == '}') + break; + +! // (matching {) +! // If the previous line ends on '};' (maybe followed by +! // comments) align at column 0. For example: +! // char *string_array[] = { "foo", +! // / * x * / "b};ar" }; / * foobar * / + if (cin_ends_in(l, (char_u *)"};", NULL)) + break; + +! // If the previous line ends on '[' we are probably in an +! // array constant: +! // something = [ +! // 234, <- extra indent + if (cin_ends_in(l, (char_u *)"[", NULL)) + { + amount = get_indent() + ind_continuation; + break; + } + +! // Find a line only has a semicolon that belongs to a previous +! // line ending in '}', e.g. before an #endif. Don't increase +! // indent then. + if (*(look = skipwhite(l)) == ';' && cin_nocode(look + 1)) + { + pos_T curpos_save = curwin->w_cursor; +*************** +*** 3887,3910 **** + curwin->w_cursor = curpos_save; + } + +! /* +! * If the PREVIOUS line is a function declaration, the current +! * line (and the ones that follow) needs to be indented as +! * parameters. +! */ + if (cin_isfuncdecl(&l, curwin->w_cursor.lnum, 0)) + { + amount = curbuf->b_ind_param; + break; + } + +! /* +! * If the previous line ends in ';' and the line before the +! * previous line ends in ',' or '\', ident to column zero: +! * int foo, +! * bar; +! * indent_to_0 here; +! */ + if (cin_ends_in(l, (char_u *)";", NULL)) + { + l = ml_get(curwin->w_cursor.lnum - 1); +--- 3707,3726 ---- + curwin->w_cursor = curpos_save; + } + +! // If the PREVIOUS line is a function declaration, the current +! // line (and the ones that follow) needs to be indented as +! // parameters. + if (cin_isfuncdecl(&l, curwin->w_cursor.lnum, 0)) + { + amount = curbuf->b_ind_param; + break; + } + +! // If the previous line ends in ';' and the line before the +! // previous line ends in ',' or '\', ident to column zero: +! // int foo, +! // bar; +! // indent_to_0 here; + if (cin_ends_in(l, (char_u *)";", NULL)) + { + l = ml_get(curwin->w_cursor.lnum - 1); +*************** +*** 3914,3939 **** + l = ml_get_curline(); + } + +! /* +! * Doesn't look like anything interesting -- so just +! * use the indent of this line. +! * +! * Position the cursor over the rightmost paren, so that +! * matching it will take us back to the start of the line. +! */ + find_last_paren(l, '(', ')'); + + if ((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) + curwin->w_cursor = *trypos; +! amount = get_indent(); /* XXX */ + break; + } + +! /* add extra indent for a comment */ + if (cin_iscomment(theline)) + amount += curbuf->b_ind_comment; + +! /* add extra indent if the previous line ended in a backslash: + * "asdfasdf\ + * here"; + * char *foo = "asdf\ +--- 3730,3754 ---- + l = ml_get_curline(); + } + +! // Doesn't look like anything interesting -- so just +! // use the indent of this line. +! // +! // Position the cursor over the rightmost paren, so that +! // matching it will take us back to the start of the line. + find_last_paren(l, '(', ')'); + + if ((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) + curwin->w_cursor = *trypos; +! amount = get_indent(); // XXX + break; + } + +! // add extra indent for a comment + if (cin_iscomment(theline)) + amount += curbuf->b_ind_comment; + +! /* +! * add extra indent if the previous line ended in a backslash: + * "asdfasdf\ + * here"; + * char *foo = "asdf\ +*************** +*** 3957,3963 **** + amount = 0; + + laterend: +! /* put the cursor back where it belongs */ + curwin->w_cursor = cur_curpos; + + vim_free(linecopy); +--- 3772,3778 ---- + amount = 0; + + laterend: +! // put the cursor back where it belongs + curwin->w_cursor = cur_curpos; + + vim_free(linecopy); +*************** +*** 3995,4032 **** + look = cin_skipcomment(ml_get_curline()); + if (cin_iselse(look) + || cin_isif(look) +! || cin_isdo(look) /* XXX */ + || cin_iswhileofdo(look, curwin->w_cursor.lnum)) + { +! /* +! * if we've gone outside the braces entirely, +! * we must be out of scope... +! */ +! theirscope = find_start_brace(); /* XXX */ + if (theirscope == NULL) + break; + +! /* +! * and if the brace enclosing this is further +! * back than the one enclosing the else, we're +! * out of luck too. +! */ + if (theirscope->lnum < ourscope) + break; + +! /* +! * and if they're enclosed in a *deeper* brace, +! * then we can ignore it because it's in a +! * different scope... +! */ + if (theirscope->lnum > ourscope) + continue; + +! /* +! * if it was an "else" (that's not an "else if") +! * then we need to go back to another if, so +! * increment elselevel +! */ + look = cin_skipcomment(ml_get_curline()); + if (cin_iselse(look)) + { +--- 3810,3839 ---- + look = cin_skipcomment(ml_get_curline()); + if (cin_iselse(look) + || cin_isif(look) +! || cin_isdo(look) // XXX + || cin_iswhileofdo(look, curwin->w_cursor.lnum)) + { +! // if we've gone outside the braces entirely, +! // we must be out of scope... +! theirscope = find_start_brace(); // XXX + if (theirscope == NULL) + break; + +! // and if the brace enclosing this is further +! // back than the one enclosing the else, we're +! // out of luck too. + if (theirscope->lnum < ourscope) + break; + +! // and if they're enclosed in a *deeper* brace, +! // then we can ignore it because it's in a +! // different scope... + if (theirscope->lnum > ourscope) + continue; + +! // if it was an "else" (that's not an "else if") +! // then we need to go back to another if, so +! // increment elselevel + look = cin_skipcomment(ml_get_curline()); + if (cin_iselse(look)) + { +*************** +*** 4036,4073 **** + continue; + } + +! /* +! * if it was a "while" then we need to go back to +! * another "do", so increment whilelevel. XXX +! */ + if (cin_iswhileofdo(look, curwin->w_cursor.lnum)) + { + ++whilelevel; + continue; + } + +! /* If it's an "if" decrement elselevel */ + look = cin_skipcomment(ml_get_curline()); + if (cin_isif(look)) + { + elselevel--; +! /* +! * When looking for an "if" ignore "while"s that +! * get in the way. +! */ + if (elselevel == 0 && lookfor == LOOKFOR_IF) + whilelevel = 0; + } + +! /* If it's a "do" decrement whilelevel */ + if (cin_isdo(look)) + whilelevel--; + +! /* +! * if we've used up all the elses, then +! * this must be the if that we want! +! * match the indent level of that if. +! */ + if (elselevel <= 0 && whilelevel <= 0) + { + return OK; +--- 3843,3874 ---- + continue; + } + +! // if it was a "while" then we need to go back to +! // another "do", so increment whilelevel. XXX + if (cin_iswhileofdo(look, curwin->w_cursor.lnum)) + { + ++whilelevel; + continue; + } + +! // If it's an "if" decrement elselevel + look = cin_skipcomment(ml_get_curline()); + if (cin_isif(look)) + { + elselevel--; +! // When looking for an "if" ignore "while"s that +! // get in the way. + if (elselevel == 0 && lookfor == LOOKFOR_IF) + whilelevel = 0; + } + +! // If it's a "do" decrement whilelevel + if (cin_isdo(look)) + whilelevel--; + +! // if we've used up all the elses, then +! // this must be the if that we want! +! // match the indent level of that if. + if (elselevel <= 0 && whilelevel <= 0) + { + return OK; +*************** +*** 4093,4100 **** + int use_sandbox = was_set_insecurely((char_u *)"indentexpr", + OPT_LOCAL); + +! /* Save and restore cursor position and curswant, in case it was changed +! * via :normal commands */ + save_pos = curwin->w_cursor; + save_curswant = curwin->w_curswant; + save_set_curswant = curwin->w_set_curswant; +--- 3894,3901 ---- + int use_sandbox = was_set_insecurely((char_u *)"indentexpr", + OPT_LOCAL); + +! // Save and restore cursor position and curswant, in case it was changed +! // via :normal commands + save_pos = curwin->w_cursor; + save_curswant = curwin->w_curswant; + save_set_curswant = curwin->w_set_curswant; +*************** +*** 4103,4110 **** + ++sandbox; + ++textlock; + +! /* Need to make a copy, the 'indentexpr' option could be changed while +! * evaluating it. */ + inde_copy = vim_strsave(curbuf->b_p_inde); + if (inde_copy != NULL) + { +--- 3904,3911 ---- + ++sandbox; + ++textlock; + +! // Need to make a copy, the 'indentexpr' option could be changed while +! // evaluating it. + inde_copy = vim_strsave(curbuf->b_p_inde); + if (inde_copy != NULL) + { +*************** +*** 4116,4124 **** + --sandbox; + --textlock; + +! /* Restore the cursor position so that 'indentexpr' doesn't need to. +! * Pretend to be in Insert mode, allow cursor past end of line for "o" +! * command. */ + save_State = State; + State = INSERT; + curwin->w_cursor = save_pos; +--- 3917,3925 ---- + --sandbox; + --textlock; + +! // Restore the cursor position so that 'indentexpr' doesn't need to. +! // Pretend to be in Insert mode, allow cursor past end of line for "o" +! // command. + save_State = State; + State = INSERT; + curwin->w_cursor = save_pos; +*************** +*** 4127,4133 **** + check_cursor(); + State = save_State; + +! /* If there is an error, just keep the current indent. */ + if (indent < 0) + indent = get_indent(); + +--- 3928,3934 ---- + check_cursor(); + State = save_State; + +! // If there is an error, just keep the current indent. + if (indent < 0) + indent = get_indent(); + +*************** +*** 4163,4183 **** + int i; + + if (keytyped == NUL) +! /* Can happen with CTRL-Y and CTRL-E on a short line. */ + return FALSE; + + #ifdef FEAT_EVAL + if (*curbuf->b_p_inde != NUL) +! look = curbuf->b_p_indk; /* 'indentexpr' set: use 'indentkeys' */ + else + #endif +! look = curbuf->b_p_cink; /* 'indentexpr' empty: use 'cinkeys' */ + while (*look) + { +! /* +! * Find out if we want to try a match with this key, depending on +! * 'when' and a '*' or '!' before the key. +! */ + switch (when) + { + case '*': try_match = (*look == '*'); break; +--- 3964,3982 ---- + int i; + + if (keytyped == NUL) +! // Can happen with CTRL-Y and CTRL-E on a short line. + return FALSE; + + #ifdef FEAT_EVAL + if (*curbuf->b_p_inde != NUL) +! look = curbuf->b_p_indk; // 'indentexpr' set: use 'indentkeys' + else + #endif +! look = curbuf->b_p_cink; // 'indentexpr' empty: use 'cinkeys' + while (*look) + { +! // Find out if we want to try a match with this key, depending on +! // 'when' and a '*' or '!' before the key. + switch (when) + { + case '*': try_match = (*look == '*'); break; +*************** +*** 4187,4196 **** + if (*look == '*' || *look == '!') + ++look; + +! /* +! * If there is a '0', only accept a match if the line is empty. +! * But may still match when typing last char of a word. +! */ + if (*look == '0') + { + try_match_word = try_match; +--- 3986,3993 ---- + if (*look == '*' || *look == '!') + ++look; + +! // If there is a '0', only accept a match if the line is empty. +! // But may still match when typing last char of a word. + if (*look == '0') + { + try_match_word = try_match; +*************** +*** 4201,4209 **** + else + try_match_word = FALSE; + +! /* +! * does it look like a control character? +! */ + if (*look == '^' + #ifdef EBCDIC + && (Ctrl_chr(look[1]) != 0) +--- 3998,4004 ---- + else + try_match_word = FALSE; + +! // does it look like a control character? + if (*look == '^' + #ifdef EBCDIC + && (Ctrl_chr(look[1]) != 0) +*************** +*** 4216,4225 **** + return TRUE; + look += 2; + } +! /* +! * 'o' means "o" command, open forward. +! * 'O' means "O" command, open backward. +! */ + else if (*look == 'o') + { + if (try_match && keytyped == KEY_OPEN_FORW) +--- 4011,4018 ---- + return TRUE; + look += 2; + } +! // 'o' means "o" command, open forward. +! // 'O' means "O" command, open backward. + else if (*look == 'o') + { + if (try_match && keytyped == KEY_OPEN_FORW) +*************** +*** 4233,4242 **** + ++look; + } + +! /* +! * 'e' means to check for "else" at start of line and just before the +! * cursor. +! */ + else if (*look == 'e') + { + if (try_match && keytyped == 'e' && curwin->w_cursor.col >= 4) +--- 4026,4033 ---- + ++look; + } + +! // 'e' means to check for "else" at start of line and just before the +! // cursor. + else if (*look == 'e') + { + if (try_match && keytyped == 'e' && curwin->w_cursor.col >= 4) +*************** +*** 4249,4259 **** + ++look; + } + +! /* +! * ':' only causes an indent if it is at the end of a label or case +! * statement, or when it was before typing the ':' (to fix +! * class::method for C++). +! */ + else if (*look == ':') + { + if (try_match && keytyped == ':') +--- 4040,4048 ---- + ++look; + } + +! // ':' only causes an indent if it is at the end of a label or case +! // statement, or when it was before typing the ':' (to fix +! // class::method for C++). + else if (*look == ':') + { + if (try_match && keytyped == ':') +*************** +*** 4261,4267 **** + p = ml_get_curline(); + if (cin_iscase(p, FALSE) || cin_isscopedecl(p) || cin_islabel()) + return TRUE; +! /* Need to get the line again after cin_islabel(). */ + p = ml_get_curline(); + if (curwin->w_cursor.col > 2 + && p[curwin->w_cursor.col - 1] == ':' +--- 4050,4056 ---- + p = ml_get_curline(); + if (cin_iscase(p, FALSE) || cin_isscopedecl(p) || cin_islabel()) + return TRUE; +! // Need to get the line again after cin_islabel(). + p = ml_get_curline(); + if (curwin->w_cursor.col > 2 + && p[curwin->w_cursor.col - 1] == ':' +*************** +*** 4280,4297 **** + } + + +! /* +! * Is it a key in <>, maybe? +! */ + else if (*look == '<') + { + if (try_match) + { +! /* +! * make up some named keys <o>, <O>, <e>, <0>, <>>, <<>, <*>, +! * <:> and <!> so that people can re-indent on o, O, e, 0, <, +! * >, *, : and ! keys if they really really want to. +! */ + if (vim_strchr((char_u *)"<>!*oOe0:", look[1]) != NULL + && keytyped == look[1]) + return TRUE; +--- 4069,4082 ---- + } + + +! // Is it a key in <>, maybe? + else if (*look == '<') + { + if (try_match) + { +! // make up some named keys <o>, <O>, <e>, <0>, <>>, <<>, <*>, +! // <:> and <!> so that people can re-indent on o, O, e, 0, <, +! // >, *, : and ! keys if they really really want to. + if (vim_strchr((char_u *)"<>!*oOe0:", look[1]) != NULL + && keytyped == look[1]) + return TRUE; +*************** +*** 4305,4313 **** + look++; + } + +! /* +! * Is it a word: "=word"? +! */ + else if (*look == '=' && look[1] != ',' && look[1] != NUL) + { + ++look; +--- 4090,4096 ---- + look++; + } + +! // Is it a word: "=word"? + else if (*look == '=' && look[1] != ',' && look[1] != NUL) + { + ++look; +*************** +*** 4331,4338 **** + { + char_u *s; + +! /* Just completed a word, check if it starts with "look". +! * search back for the start of a word. */ + line = ml_get_curline(); + if (has_mbyte) + { +--- 4114,4121 ---- + { + char_u *s; + +! // Just completed a word, check if it starts with "look". +! // search back for the start of a word. + line = ml_get_curline(); + if (has_mbyte) + { +*************** +*** 4357,4363 **** + } + else + #endif +! /* TODO: multi-byte */ + if (keytyped == (int)p[-1] || (icase && keytyped < 256 + && TOLOWER_LOC(keytyped) == TOLOWER_LOC((int)p[-1]))) + { +--- 4140,4146 ---- + } + else + #endif +! // TODO: multi-byte + if (keytyped == (int)p[-1] || (icase && keytyped < 256 + && TOLOWER_LOC(keytyped) == TOLOWER_LOC((int)p[-1]))) + { +*************** +*** 4372,4379 **** + } + if (match && try_match_word && !try_match) + { +! /* "0=word": Check if there are only blanks before the +! * word. */ + if (getwhitecols_curline() != + (int)(curwin->w_cursor.col - (p - look))) + match = FALSE; +--- 4155,4162 ---- + } + if (match && try_match_word && !try_match) + { +! // "0=word": Check if there are only blanks before the +! // word. + if (getwhitecols_curline() != + (int)(curwin->w_cursor.col - (p - look))) + match = FALSE; +*************** +*** 4384,4392 **** + look = p; + } + +! /* +! * ok, it's a boring generic character. +! */ + else + { + if (try_match && *look == keytyped) +--- 4167,4173 ---- + look = p; + } + +! // ok, it's a boring generic character. + else + { + if (try_match && *look == keytyped) +*************** +*** 4395,4408 **** + ++look; + } + +! /* +! * Skip over ", ". +! */ + look = skip_to_option_part(look); + } + return FALSE; + } +! #endif /* FEAT_CINDENT */ + + #if defined(FEAT_LISP) || defined(PROTO) + +--- 4176,4187 ---- + ++look; + } + +! // Skip over ", ". + look = skip_to_option_part(look); + } + return FALSE; + } +! #endif // FEAT_CINDENT + + #if defined(FEAT_LISP) || defined(PROTO) + +*************** +*** 4450,4456 **** + int parencount, quotecount; + int vi_lisp; + +! /* Set vi_lisp to use the vi-compatible method */ + vi_lisp = (vim_strchr(p_cpo, CPO_LISP) != NULL); + + realpos = curwin->w_cursor; +--- 4229,4235 ---- + int parencount, quotecount; + int vi_lisp; + +! // Set vi_lisp to use the vi-compatible method + vi_lisp = (vim_strchr(p_cpo, CPO_LISP) != NULL); + + realpos = curwin->w_cursor; +*************** +*** 4467,4474 **** + } + if (pos != NULL) + { +! /* Extra trick: Take the indent of the first previous non-white +! * line that is at the same () level. */ + amount = -1; + parencount = 0; + +--- 4246,4253 ---- + } + if (pos != NULL) + { +! // Extra trick: Take the indent of the first previous non-white +! // line that is at the same () level. + amount = -1; + parencount = 0; + +*************** +*** 4494,4500 **** + { + while (*++that && *that != '"') + { +! /* skipping escaped characters in the string */ + if (*that == '\\') + { + if (*++that == NUL) +--- 4273,4279 ---- + { + while (*++that && *that != '"') + { +! // skipping escaped characters in the string + if (*that == '\\') + { + if (*++that == NUL) +*************** +*** 4540,4552 **** + col--; + } + +! /* +! * Some keywords require "body" indenting rules (the +! * non-standard-lisp ones are Scheme special forms): +! * +! * (let ((a 1)) instead (let ((a 1)) +! * (...)) of (...)) +! */ + + if (!vi_lisp && (*that == '(' || *that == '[') + && lisp_match(that + 1)) +--- 4319,4329 ---- + col--; + } + +! // Some keywords require "body" indenting rules (the +! // non-standard-lisp ones are Scheme special forms): +! // +! // (let ((a 1)) instead (let ((a 1)) +! // (...)) of (...)) + + if (!vi_lisp && (*that == '(' || *that == '[') + && lisp_match(that + 1)) +*************** +*** 4563,4572 **** + ++that; + } + +! if (*that && *that != ';') /* not a comment line */ + { +! /* test *that != '(' to accommodate first let/do +! * argument if it is more than one line */ + if (!vi_lisp && *that != '(' && *that != '[') + firsttry++; + +--- 4340,4349 ---- + ++that; + } + +! if (*that && *that != ';') // not a comment line + { +! // test *that != '(' to accommodate first let/do +! // argument if it is more than one line + if (!vi_lisp && *that != '(' && *that != '[') + firsttry++; + +*************** +*** 4617,4629 **** + } + } + else +! amount = 0; /* no matching '(' or '[' found, use zero indent */ + + curwin->w_cursor = realpos; + + return amount; + } +! #endif /* FEAT_LISP */ + + #if defined(FEAT_CINDENT) || defined(PROTO) + /* +--- 4394,4406 ---- + } + } + else +! amount = 0; // no matching '(' or '[' found, use zero indent + + curwin->w_cursor = realpos; + + return amount; + } +! #endif // FEAT_LISP + + #if defined(FEAT_CINDENT) || defined(PROTO) + /* +*************** +*** 4658,4664 **** + { + change_indent(INDENT_SET, amount, FALSE, 0, TRUE); + if (linewhite(curwin->w_cursor.lnum)) +! did_ai = TRUE; /* delete the indent if the line stays empty */ + } + } + +--- 4435,4441 ---- + { + change_indent(INDENT_SET, amount, FALSE, 0, TRUE); + if (linewhite(curwin->w_cursor.lnum)) +! did_ai = TRUE; // delete the indent if the line stays empty + } + } + +*** ../vim-8.1.0873/src/version.c 2019-02-03 23:45:09.282345807 +0100 +--- src/version.c 2019-02-04 20:26:52.174771873 +0100 +*************** +*** 785,786 **** +--- 785,788 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 874, + /**/ + +-- +Veni, Vidi, VW -- I came, I saw, I drove around in a little car. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |