# HG changeset patch # User Bram Moolenaar # Date 1567353603 -7200 # Node ID 34639bba19b0a6016cb0d3c346c06148c8abc7b9 # Parent a7e84c39e8ded4bd3a3d5a8311cde960c116c4c6 patch 8.1.1960: fold code is spread out Commit: https://github.com/vim/vim/commit/db022f3ffb57c5ff4b97b4e93a994d11e4c10466 Author: Bram Moolenaar Date: Sun Sep 1 17:52:32 2019 +0200 patch 8.1.1960: fold code is spread out Problem: Fold code is spread out. Solution: Move fold functions to fold.c. diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -117,11 +117,6 @@ static void f_fmod(typval_T *argvars, ty #endif static void f_fnameescape(typval_T *argvars, typval_T *rettv); static void f_fnamemodify(typval_T *argvars, typval_T *rettv); -static void f_foldclosed(typval_T *argvars, typval_T *rettv); -static void f_foldclosedend(typval_T *argvars, typval_T *rettv); -static void f_foldlevel(typval_T *argvars, typval_T *rettv); -static void f_foldtext(typval_T *argvars, typval_T *rettv); -static void f_foldtextresult(typval_T *argvars, typval_T *rettv); static void f_foreground(typval_T *argvars, typval_T *rettv); static void f_funcref(typval_T *argvars, typval_T *rettv); static void f_function(typval_T *argvars, typval_T *rettv); @@ -3642,173 +3637,6 @@ f_fnamemodify(typval_T *argvars, typval_ } /* - * "foldclosed()" function - */ - static void -foldclosed_both( - typval_T *argvars UNUSED, - typval_T *rettv, - int end UNUSED) -{ -#ifdef FEAT_FOLDING - linenr_T lnum; - linenr_T first, last; - - lnum = tv_get_lnum(argvars); - if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) - { - if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL)) - { - if (end) - rettv->vval.v_number = (varnumber_T)last; - else - rettv->vval.v_number = (varnumber_T)first; - return; - } - } -#endif - rettv->vval.v_number = -1; -} - -/* - * "foldclosed()" function - */ - static void -f_foldclosed(typval_T *argvars, typval_T *rettv) -{ - foldclosed_both(argvars, rettv, FALSE); -} - -/* - * "foldclosedend()" function - */ - static void -f_foldclosedend(typval_T *argvars, typval_T *rettv) -{ - foldclosed_both(argvars, rettv, TRUE); -} - -/* - * "foldlevel()" function - */ - static void -f_foldlevel(typval_T *argvars UNUSED, typval_T *rettv UNUSED) -{ -#ifdef FEAT_FOLDING - linenr_T lnum; - - lnum = tv_get_lnum(argvars); - if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) - rettv->vval.v_number = foldLevel(lnum); -#endif -} - -/* - * "foldtext()" function - */ - static void -f_foldtext(typval_T *argvars UNUSED, typval_T *rettv) -{ -#ifdef FEAT_FOLDING - linenr_T foldstart; - linenr_T foldend; - char_u *dashes; - linenr_T lnum; - char_u *s; - char_u *r; - int len; - char *txt; - long count; -#endif - - rettv->v_type = VAR_STRING; - rettv->vval.v_string = NULL; -#ifdef FEAT_FOLDING - foldstart = (linenr_T)get_vim_var_nr(VV_FOLDSTART); - foldend = (linenr_T)get_vim_var_nr(VV_FOLDEND); - dashes = get_vim_var_str(VV_FOLDDASHES); - if (foldstart > 0 && foldend <= curbuf->b_ml.ml_line_count - && dashes != NULL) - { - /* Find first non-empty line in the fold. */ - for (lnum = foldstart; lnum < foldend; ++lnum) - if (!linewhite(lnum)) - break; - - /* Find interesting text in this line. */ - s = skipwhite(ml_get(lnum)); - /* skip C comment-start */ - if (s[0] == '/' && (s[1] == '*' || s[1] == '/')) - { - s = skipwhite(s + 2); - if (*skipwhite(s) == NUL - && lnum + 1 < (linenr_T)get_vim_var_nr(VV_FOLDEND)) - { - s = skipwhite(ml_get(lnum + 1)); - if (*s == '*') - s = skipwhite(s + 1); - } - } - count = (long)(foldend - foldstart + 1); - txt = NGETTEXT("+-%s%3ld line: ", "+-%s%3ld lines: ", count); - r = alloc(STRLEN(txt) - + STRLEN(dashes) // for %s - + 20 // for %3ld - + STRLEN(s)); // concatenated - if (r != NULL) - { - sprintf((char *)r, txt, dashes, count); - len = (int)STRLEN(r); - STRCAT(r, s); - /* remove 'foldmarker' and 'commentstring' */ - foldtext_cleanup(r + len); - rettv->vval.v_string = r; - } - } -#endif -} - -/* - * "foldtextresult(lnum)" function - */ - static void -f_foldtextresult(typval_T *argvars UNUSED, typval_T *rettv) -{ -#ifdef FEAT_FOLDING - linenr_T lnum; - char_u *text; - char_u buf[FOLD_TEXT_LEN]; - foldinfo_T foldinfo; - int fold_count; - static int entered = FALSE; -#endif - - rettv->v_type = VAR_STRING; - rettv->vval.v_string = NULL; -#ifdef FEAT_FOLDING - if (entered) - return; /* reject recursive use */ - entered = TRUE; - - lnum = tv_get_lnum(argvars); - /* treat illegal types and illegal string values for {lnum} the same */ - if (lnum < 0) - lnum = 0; - fold_count = foldedCount(curwin, lnum, &foldinfo); - if (fold_count > 0) - { - text = get_foldtext(curwin, lnum, lnum + fold_count - 1, - &foldinfo, buf); - if (text == buf) - text = vim_strsave(text); - rettv->vval.v_string = text; - } - - entered = FALSE; -#endif -} - -/* * "foreground()" function */ static void diff --git a/src/fold.c b/src/fold.c --- a/src/fold.c +++ b/src/fold.c @@ -244,10 +244,11 @@ hasFoldingWin( } /* foldLevel() {{{2 */ +#ifdef FEAT_EVAL /* * Return fold level at line number "lnum" in the current window. */ - int + static int foldLevel(linenr_T lnum) { /* While updating the folds lines between invalid_top and invalid_bot have @@ -265,6 +266,7 @@ foldLevel(linenr_T lnum) return foldLevelWin(curwin, lnum); } +#endif /* lineFolded() {{{2 */ /* @@ -1989,10 +1991,11 @@ get_foldtext( } /* foldtext_cleanup() {{{2 */ +#ifdef FEAT_EVAL /* * Remove 'foldmarker' and 'commentstring' from "str" (in-place). */ - void + static void foldtext_cleanup(char_u *str) { char_u *cms_start; /* first part or the whole comment */ @@ -2078,6 +2081,7 @@ foldtext_cleanup(char_u *str) } } } +#endif /* Folding by indent, expr, marker and syntax. {{{1 */ /* Define "fline_T", passed to get fold level for a line. {{{2 */ @@ -3616,4 +3620,175 @@ put_fold_open_close(FILE *fd, fold_T *fp #endif /* FEAT_SESSION */ /* }}}1 */ -#endif /* defined(FEAT_FOLDING) || defined(PROTO) */ +#endif // defined(FEAT_FOLDING) || defined(PROTO) + +#if defined(FEAT_EVAL) || defined(PROTO) + +/* + * "foldclosed()" and "foldclosedend()" functions + */ + static void +foldclosed_both( + typval_T *argvars UNUSED, + typval_T *rettv, + int end UNUSED) +{ +# ifdef FEAT_FOLDING + linenr_T lnum; + linenr_T first, last; + + lnum = tv_get_lnum(argvars); + if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) + { + if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL)) + { + if (end) + rettv->vval.v_number = (varnumber_T)last; + else + rettv->vval.v_number = (varnumber_T)first; + return; + } + } +#endif + rettv->vval.v_number = -1; +} + +/* + * "foldclosed()" function + */ + void +f_foldclosed(typval_T *argvars, typval_T *rettv) +{ + foldclosed_both(argvars, rettv, FALSE); +} + +/* + * "foldclosedend()" function + */ + void +f_foldclosedend(typval_T *argvars, typval_T *rettv) +{ + foldclosed_both(argvars, rettv, TRUE); +} + +/* + * "foldlevel()" function + */ + void +f_foldlevel(typval_T *argvars UNUSED, typval_T *rettv UNUSED) +{ +# ifdef FEAT_FOLDING + linenr_T lnum; + + lnum = tv_get_lnum(argvars); + if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) + rettv->vval.v_number = foldLevel(lnum); +# endif +} + +/* + * "foldtext()" function + */ + void +f_foldtext(typval_T *argvars UNUSED, typval_T *rettv) +{ +# ifdef FEAT_FOLDING + linenr_T foldstart; + linenr_T foldend; + char_u *dashes; + linenr_T lnum; + char_u *s; + char_u *r; + int len; + char *txt; + long count; +# endif + + rettv->v_type = VAR_STRING; + rettv->vval.v_string = NULL; +# ifdef FEAT_FOLDING + foldstart = (linenr_T)get_vim_var_nr(VV_FOLDSTART); + foldend = (linenr_T)get_vim_var_nr(VV_FOLDEND); + dashes = get_vim_var_str(VV_FOLDDASHES); + if (foldstart > 0 && foldend <= curbuf->b_ml.ml_line_count + && dashes != NULL) + { + // Find first non-empty line in the fold. + for (lnum = foldstart; lnum < foldend; ++lnum) + if (!linewhite(lnum)) + break; + + // Find interesting text in this line. + s = skipwhite(ml_get(lnum)); + // skip C comment-start + if (s[0] == '/' && (s[1] == '*' || s[1] == '/')) + { + s = skipwhite(s + 2); + if (*skipwhite(s) == NUL + && lnum + 1 < (linenr_T)get_vim_var_nr(VV_FOLDEND)) + { + s = skipwhite(ml_get(lnum + 1)); + if (*s == '*') + s = skipwhite(s + 1); + } + } + count = (long)(foldend - foldstart + 1); + txt = NGETTEXT("+-%s%3ld line: ", "+-%s%3ld lines: ", count); + r = alloc(STRLEN(txt) + + STRLEN(dashes) // for %s + + 20 // for %3ld + + STRLEN(s)); // concatenated + if (r != NULL) + { + sprintf((char *)r, txt, dashes, count); + len = (int)STRLEN(r); + STRCAT(r, s); + // remove 'foldmarker' and 'commentstring' + foldtext_cleanup(r + len); + rettv->vval.v_string = r; + } + } +# endif +} + +/* + * "foldtextresult(lnum)" function + */ + void +f_foldtextresult(typval_T *argvars UNUSED, typval_T *rettv) +{ +# ifdef FEAT_FOLDING + linenr_T lnum; + char_u *text; + char_u buf[FOLD_TEXT_LEN]; + foldinfo_T foldinfo; + int fold_count; + static int entered = FALSE; +# endif + + rettv->v_type = VAR_STRING; + rettv->vval.v_string = NULL; +# ifdef FEAT_FOLDING + if (entered) + return; // reject recursive use + entered = TRUE; + + lnum = tv_get_lnum(argvars); + // treat illegal types and illegal string values for {lnum} the same + if (lnum < 0) + lnum = 0; + fold_count = foldedCount(curwin, lnum, &foldinfo); + if (fold_count > 0) + { + text = get_foldtext(curwin, lnum, lnum + fold_count - 1, + &foldinfo, buf); + if (text == buf) + text = vim_strsave(text); + rettv->vval.v_string = text; + } + + entered = FALSE; +# endif +} + +#endif // FEAT_EVAL diff --git a/src/proto/fold.pro b/src/proto/fold.pro --- a/src/proto/fold.pro +++ b/src/proto/fold.pro @@ -3,7 +3,6 @@ void copyFoldingState(win_T *wp_from, wi int hasAnyFolding(win_T *win); int hasFolding(linenr_T lnum, linenr_T *firstp, linenr_T *lastp); int hasFoldingWin(win_T *win, linenr_T lnum, linenr_T *firstp, linenr_T *lastp, int cache, foldinfo_T *infop); -int foldLevel(linenr_T lnum); int lineFolded(win_T *win, linenr_T lnum); long foldedCount(win_T *win, linenr_T lnum, foldinfo_T *infop); int foldmethodIsManual(win_T *wp); @@ -36,7 +35,11 @@ void deleteFoldRecurse(garray_T *gap); void foldMarkAdjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long amount_after); int getDeepestNesting(void); char_u *get_foldtext(win_T *wp, linenr_T lnum, linenr_T lnume, foldinfo_T *foldinfo, char_u *buf); -void foldtext_cleanup(char_u *str); void foldMoveRange(garray_T *gap, linenr_T line1, linenr_T line2, linenr_T dest); int put_folds(FILE *fd, win_T *wp); +void f_foldclosed(typval_T *argvars, typval_T *rettv); +void f_foldclosedend(typval_T *argvars, typval_T *rettv); +void f_foldlevel(typval_T *argvars, typval_T *rettv); +void f_foldtext(typval_T *argvars, typval_T *rettv); +void f_foldtextresult(typval_T *argvars, typval_T *rettv); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1960, +/**/ 1959, /**/ 1958,