mirror of
https://github.com/neovim/neovim.git
synced 2025-10-05 17:36:29 +00:00
vim-patch:8.1.1960: fold code is spread out (#19777)
Problem: Fold code is spread out.
Solution: Move fold functions to fold.c.
db022f3ffb
This commit is contained in:
@@ -2418,122 +2418,6 @@ static void f_fnamemodify(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
xfree(fbuf);
|
||||
}
|
||||
|
||||
/// "foldclosed()" function
|
||||
static void foldclosed_both(typval_T *argvars, typval_T *rettv, int end)
|
||||
{
|
||||
const linenr_T lnum = tv_get_lnum(argvars);
|
||||
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) {
|
||||
linenr_T first;
|
||||
linenr_T last;
|
||||
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;
|
||||
}
|
||||
}
|
||||
rettv->vval.v_number = -1;
|
||||
}
|
||||
|
||||
/// "foldclosed()" function
|
||||
static void f_foldclosed(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
foldclosed_both(argvars, rettv, false);
|
||||
}
|
||||
|
||||
/// "foldclosedend()" function
|
||||
static void f_foldclosedend(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
foldclosed_both(argvars, rettv, true);
|
||||
}
|
||||
|
||||
/// "foldlevel()" function
|
||||
static void f_foldlevel(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
const linenr_T lnum = tv_get_lnum(argvars);
|
||||
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) {
|
||||
rettv->vval.v_number = foldLevel(lnum);
|
||||
}
|
||||
}
|
||||
|
||||
/// "foldtext()" function
|
||||
static void f_foldtext(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
rettv->v_type = VAR_STRING;
|
||||
rettv->vval.v_string = NULL;
|
||||
|
||||
linenr_T foldstart = (linenr_T)get_vim_var_nr(VV_FOLDSTART);
|
||||
linenr_T foldend = (linenr_T)get_vim_var_nr(VV_FOLDEND);
|
||||
char_u *dashes = (char_u *)get_vim_var_str(VV_FOLDDASHES);
|
||||
if (foldstart > 0 && foldend <= curbuf->b_ml.ml_line_count) {
|
||||
// Find first non-empty line in the fold.
|
||||
linenr_T lnum;
|
||||
for (lnum = foldstart; lnum < foldend; lnum++) {
|
||||
if (!linewhite(lnum)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find interesting text in this line.
|
||||
char_u *s = (char_u *)skipwhite((char *)ml_get(lnum));
|
||||
// skip C comment-start
|
||||
if (s[0] == '/' && (s[1] == '*' || s[1] == '/')) {
|
||||
s = (char_u *)skipwhite((char *)s + 2);
|
||||
if (*skipwhite((char *)s) == NUL && lnum + 1 < foldend) {
|
||||
s = (char_u *)skipwhite((char *)ml_get(lnum + 1));
|
||||
if (*s == '*') {
|
||||
s = (char_u *)skipwhite((char *)s + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
int count = foldend - foldstart + 1;
|
||||
char *txt = NGETTEXT("+-%s%3ld line: ", "+-%s%3ld lines: ", count);
|
||||
size_t len = STRLEN(txt)
|
||||
+ STRLEN(dashes) // for %s
|
||||
+ 20 // for %3ld
|
||||
+ STRLEN(s); // concatenated
|
||||
char_u *r = xmalloc(len);
|
||||
snprintf((char *)r, len, txt, dashes, count);
|
||||
len = STRLEN(r);
|
||||
STRCAT(r, s);
|
||||
// remove 'foldmarker' and 'commentstring'
|
||||
foldtext_cleanup(r + len);
|
||||
rettv->vval.v_string = (char *)r;
|
||||
}
|
||||
}
|
||||
|
||||
/// "foldtextresult(lnum)" function
|
||||
static void f_foldtextresult(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{
|
||||
char_u buf[FOLD_TEXT_LEN];
|
||||
static bool entered = false;
|
||||
|
||||
rettv->v_type = VAR_STRING;
|
||||
rettv->vval.v_string = NULL;
|
||||
if (entered) {
|
||||
return; // reject recursive use
|
||||
}
|
||||
entered = true;
|
||||
linenr_T lnum = tv_get_lnum(argvars);
|
||||
// Treat illegal types and illegal string values for {lnum} the same.
|
||||
if (lnum < 0) {
|
||||
lnum = 0;
|
||||
}
|
||||
|
||||
foldinfo_T info = fold_info(curwin, lnum);
|
||||
if (info.fi_lines > 0) {
|
||||
char_u *text = get_foldtext(curwin, lnum, lnum + info.fi_lines - 1, info, buf);
|
||||
if (text == buf) {
|
||||
text = vim_strsave(text);
|
||||
}
|
||||
rettv->vval.v_string = (char *)text;
|
||||
}
|
||||
|
||||
entered = false;
|
||||
}
|
||||
|
||||
/// "foreground()" function
|
||||
static void f_foreground(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
{}
|
||||
|
Reference in New Issue
Block a user