diff options
author | Bram Moolenaar <Bram@vim.org> | 2004-10-11 10:16:09 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2004-10-11 10:16:09 +0000 |
commit | 7b0294cb9f7cfcd3fcbbaa523578847a3e6d74c5 (patch) | |
tree | 5675edfe10a80abd76b307b855858f136c647d32 /src/fold.c | |
parent | 7171abea1ad8d33cce89a9664873417187139a53 (diff) | |
download | vim-git-7b0294cb9f7cfcd3fcbbaa523578847a3e6d74c5.tar.gz |
updated for version 7.0018v7.0018
Diffstat (limited to 'src/fold.c')
-rw-r--r-- | src/fold.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/fold.c b/src/fold.c index ceac00bbf..feb5c91f2 100644 --- a/src/fold.c +++ b/src/fold.c @@ -1903,6 +1903,93 @@ foldDelMarker(lnum, marker, markerlen) } } +/* get_foldtext() {{{2 */ +/* + * Return the text for a closed fold at line "lnum", with last line "lnume". + * When 'foldtext' isn't set puts the result in "buf[51]". Otherwise the + * result is in allocated memory. + */ + char_u * +get_foldtext(wp, lnum, lnume, foldinfo, buf) + win_T *wp; + linenr_T lnum, lnume; + foldinfo_T *foldinfo; + char_u *buf; +{ + char_u *text = NULL; + +#ifdef FEAT_EVAL + if (*wp->w_p_fdt != NUL) + { + char_u dashes[51]; + win_T *save_curwin; + int level; + char_u *p; + int len; + + /* Set "v:foldstart" and "v:foldend". */ + set_vim_var_nr(VV_FOLDSTART, lnum); + set_vim_var_nr(VV_FOLDEND, lnume); + + /* Set "v:folddashes" to a string of "level" dashes. */ + /* Set "v:foldlevel" to "level". */ + level = foldinfo->fi_level; + if (level > 50) + level = 50; + vim_memset(dashes, '-', (size_t)level); + dashes[level] = NUL; + set_vim_var_string(VV_FOLDDASHES, dashes, -1); + set_vim_var_nr(VV_FOLDLEVEL, (long)level); + save_curwin = curwin; + curwin = wp; + curbuf = wp->w_buffer; + + ++emsg_off; + text = eval_to_string_safe(wp->w_p_fdt, NULL); + --emsg_off; + + curwin = save_curwin; + curbuf = curwin->w_buffer; + set_vim_var_string(VV_FOLDDASHES, NULL, -1); + + if (text != NULL) + { + /* Replace unprintable characters, if there are any. But + * replace a TAB with a space. */ + for (p = text; *p != NUL; ++p) + { +# ifdef FEAT_MBYTE + if (has_mbyte && (len = (*mb_ptr2len_check)(p)) > 1) + { + if (!vim_isprintc((*mb_ptr2char)(p))) + break; + p += len - 1; + } + else +# endif + if (*p == TAB) + *p = ' '; + else if (ptr2cells(p) > 1) + break; + } + if (*p != NUL) + { + p = transstr(text); + vim_free(text); + text = p; + } + } + } + if (text == NULL) +#endif + { + sprintf((char *)buf, _("+--%3ld lines folded "), + (long)(lnume - lnum + 1)); + text = buf; + } + return text; +} + /* foldtext_cleanup() {{{2 */ /* * Remove 'foldmarker' and 'commentstring' from "str" (in-place). |