screen: more work on fold_line replacement

This commit is contained in:
Björn Linse
2020-09-21 14:50:24 +02:00
parent f8134f2fd1
commit a958039f0a
5 changed files with 67 additions and 78 deletions

View File

@@ -280,26 +280,31 @@ int foldLevel(linenr_T lnum)
// Return false if line is not folded.
bool lineFolded(win_T *const win, const linenr_T lnum)
{
return foldedCount(win, lnum, NULL) != 0;
return fold_info(win, lnum).fi_lines != 0;
}
/* foldedCount() {{{2 */
/*
* Count the number of lines that are folded at line number "lnum".
* Normally "lnum" is the first line of a possible fold, and the returned
* number is the number of lines in the fold.
* Doesn't use caching from the displayed window.
* Returns number of folded lines from "lnum", or 0 if line is not folded.
* When "infop" is not NULL, fills *infop with the fold level info.
*/
long foldedCount(win_T *win, linenr_T lnum, foldinfo_T *infop)
/// fold_info() {{{2
///
/// Count the number of lines that are folded at line number "lnum".
/// Normally "lnum" is the first line of a possible fold, and the returned
/// number is the number of lines in the fold.
/// Doesn't use caching from the displayed window.
///
/// @return with the fold level info.
/// fi_lines = number of folded lines from "lnum",
/// or 0 if line is not folded.
foldinfo_T fold_info(win_T *win, linenr_T lnum)
{
foldinfo_T info;
linenr_T last;
if (hasFoldingWin(win, lnum, NULL, &last, false, infop)) {
return (long)(last - lnum + 1);
if (hasFoldingWin(win, lnum, NULL, &last, false, &info)) {
info.fi_lines = (long)(last - lnum + 1);
} else {
info.fi_lines = 0;
}
return 0;
return info;
}
/* foldmethodIsManual() {{{2 */
@@ -1755,7 +1760,7 @@ static void foldDelMarker(
/// When 'foldtext' isn't set puts the result in "buf[FOLD_TEXT_LEN]".
/// Otherwise the result is in allocated memory.
char_u *get_foldtext(win_T *wp, linenr_T lnum, linenr_T lnume,
foldinfo_T *foldinfo, char_u *buf)
foldinfo_T foldinfo, char_u *buf)
FUNC_ATTR_NONNULL_ARG(1)
{
char_u *text = NULL;
@@ -1783,11 +1788,12 @@ char_u *get_foldtext(win_T *wp, linenr_T lnum, linenr_T lnume,
set_vim_var_nr(VV_FOLDSTART, (varnumber_T) lnum);
set_vim_var_nr(VV_FOLDEND, (varnumber_T) lnume);
/* Set "v:folddashes" to a string of "level" dashes. */
/* Set "v:foldlevel" to "level". */
level = foldinfo->fi_level;
if (level > (int)sizeof(dashes) - 1)
// Set "v:folddashes" to a string of "level" dashes.
// Set "v:foldlevel" to "level".
level = foldinfo.fi_level;
if (level > (int)sizeof(dashes) - 1) {
level = (int)sizeof(dashes) - 1;
}
memset(dashes, '-', (size_t)level);
dashes[level] = NUL;
set_vim_var_string(VV_FOLDDASHES, dashes, -1);