Patch to add user-configurable highlighting to folded folds. Basically it
allows user-configurable control over the color/boldness and other
attributes to be set by fold level and/or content.
One new exposed function has been added.
foldhidef()
Sets the default highlight group "Folded" for the current fold.
Executes hlf_attr(HLF_FL).
Needed by foldhighlight as the default closed-fold highlighting function.
One new user-definable function has been added.
foldhighlight
Returns a syntax highlighting group ID to be used by hl_attr() or
syn_attr2attr() to set the highlight group for the folded fold.
The usage is very simple. For level-dependent folded-fold colors:
setlocal foldhighlight=MyFoldHi(v:foldlevel)
" MyFoldHi(level)
" Determine the fold syntax of a fold.
function! MyFoldHi(level)
return hlID("Folded".a:level)
endfunction
Provided that Folded0 through Foldedn highlight groups have been defined,
each fold level can have unique colors and other attributes.
More useful (to me and other VO users) is this:
setlocal foldhighlight=MyFoldHi(v:foldstart)
" MyFoldHi(fold)
" Determine the fold syntax of a fold.
function! MyFoldHi(fold)
return synID(a:fold,1,0)
endfunction
This allows already defined highlight groups to be applied to the folded
fold just as they are to the unfolded fold.
I hope this patch has been done properly and maintains the spirit and
nature of vim. The patch probably needs a little cleanup work and I have
not modified the documentation to match. I'd really like to see it become
part of the vim source tree so any feedback is welcome.
The attached patch is meant for the released 7.2 sources. If there are
newer sources that I should patch against, let me know which version to
use. The patch should be executed in the vim72 directory (not in src).
Thanks,
Noel
--
------------------------------------------------------------------
Noel Henson
www.noels-lab.com Chips, firmware and embedded systems
www.vimoutliner.org Work fast. Think well.
--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---
diff -rpuN original/eval.c new/eval.c
--- original/eval.c 2009-09-13 03:36:29.000000000 -0700
+++ new/eval.c 2009-09-13 03:36:44.000000000 -0700
@@ -537,6 +537,7 @@ static void f_foldclosedend __ARGS((typv
static void f_foldlevel __ARGS((typval_T *argvars, typval_T *rettv));
static void f_foldtext __ARGS((typval_T *argvars, typval_T *rettv));
static void f_foldtextresult __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_foldhidef __ARGS((typval_T *argvars, typval_T *rettv));
static void f_foreground __ARGS((typval_T *argvars, typval_T *rettv));
static void f_function __ARGS((typval_T *argvars, typval_T *rettv));
static void f_garbagecollect __ARGS((typval_T *argvars, typval_T *rettv));
@@ -1725,6 +1726,56 @@ eval_foldexpr(arg, cp)
return retval;
}
+
+/*
+ * Evaluate 'foldhighlight'. Returns the fold hlID
+ */
+ int
+/* eval_foldhighlight(arg)*/
+eval_foldhighlight(fdt, lnum, lnume, foldinfo)
+ char_u *fdt;
+ linenr_T lnum, lnume;
+ foldinfo_T *foldinfo;
+
+{
+ typval_T tv;
+ int retval;
+ int level;
+ int use_sandbox = was_set_insecurely((char_u *)"foldhighlight",
+ OPT_LOCAL);
+
+ /* Set "v:foldstart" and "v:foldend". */
+ set_vim_var_nr(VV_FOLDSTART, lnum);
+ set_vim_var_nr(VV_FOLDEND, lnume);
+
+ /* Set "v:foldlevel" to "level". */
+ level = foldinfo->fi_level;
+ if (level > 50)
+ level = 50;
+ set_vim_var_nr(VV_FOLDLEVEL, (long)level);
+
+ ++emsg_off;
+ if (use_sandbox)
+ ++sandbox;
+ ++textlock;
+ if (eval0(fdt, &tv, NULL, TRUE) == FAIL)
+ retval = syn_get_foldhidef();
+ else
+ {
+ /* If the result is a number, just return the number. */
+ if (tv.v_type == VAR_NUMBER)
+ retval = tv.vval.v_number;
+ else
+ retval = syn_get_foldhidef();
+ clear_tv(&tv);
+ }
+ --emsg_off;
+ if (use_sandbox)
+ --sandbox;
+ --textlock;
+
+ return retval;
+}
#endif
/*
@@ -7496,6 +7547,7 @@ static struct fst
{"foldlevel", 1, 1, f_foldlevel},
{"foldtext", 0, 0, f_foldtext},
{"foldtextresult", 1, 1, f_foldtextresult},
+ {"foldhidef", 0, 0, f_foldhidef},
{"foreground", 0, 0, f_foreground},
{"function", 1, 1, f_function},
{"garbagecollect", 0, 1, f_garbagecollect},
@@ -10162,6 +10214,18 @@ f_foldlevel(argvars, rettv)
}
/*
+ * "foldhidef()" function
+ */
+/*ARGSUSED*/
+ static void
+f_foldhidef(argvars, rettv)
+ typval_T *argvars;
+ typval_T *rettv;
+{
+ rettv->vval.v_number = syn_get_foldhidef();
+}
+
+/*
* "foldtext()" function
*/
/*ARGSUSED*/
diff -rpuN original/option.c new/option.c
--- original/option.c 2009-09-13 03:36:29.000000000 -0700
+++ new/option.c 2009-09-13 03:36:44.000000000 -0700
@@ -200,6 +200,7 @@
# ifdef FEAT_EVAL
# define PV_FDE OPT_WIN(WV_FDE)
# define PV_FDT OPT_WIN(WV_FDT)
+# define PV_FDH OPT_WIN(WV_FDH)
# endif
# define PV_FMR OPT_WIN(WV_FMR)
#endif
@@ -1125,6 +1126,15 @@ static struct vimoption
{(char_u *)NULL, (char_u *)0L}
# endif
},
+ {"foldhighlight", "fdh", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN,
+# ifdef FEAT_EVAL
+ (char_u *)VAR_WIN, PV_FDH,
+ {(char_u *)"foldhidef()", (char_u *)NULL}
+# else
+ (char_u *)NULL, PV_NONE,
+ {(char_u *)NULL, (char_u *)0L}
+# endif
+ },
#endif
{"formatexpr", "fex", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM,
#ifdef FEAT_EVAL
@@ -5249,6 +5259,7 @@ insecure_flag(opt_idx, opt_flags)
# ifdef FEAT_FOLDING
case PV_FDE: return &curwin->w_p_fde_flags;
case PV_FDT: return &curwin->w_p_fdt_flags;
+ case PV_FDH: return &curwin->w_p_fdh_flags;
# endif
# ifdef FEAT_BEVAL
case PV_BEXPR: return &curbuf->b_p_bexpr_flags;
@@ -9024,6 +9035,7 @@ get_varp(p)
# ifdef FEAT_EVAL
case PV_FDE: return (char_u *)&(curwin->w_p_fde);
case PV_FDT: return (char_u *)&(curwin->w_p_fdt);
+ case PV_FDH: return (char_u *)&(curwin->w_p_fdh);
# endif
case PV_FMR: return (char_u *)&(curwin->w_p_fmr);
#endif
diff -rpuN original/option.h new/option.h
--- original/option.h 2009-09-13 03:36:33.000000000 -0700
+++ new/option.h 2009-09-13 03:36:49.000000000 -0700
@@ -1032,6 +1032,7 @@ enum
# ifdef FEAT_EVAL
, WV_FDE
, WV_FDT
+ , WV_FDH
# endif
, WV_FMR
#endif
diff -rpuN original/screen.c new/screen.c
--- original/screen.c 2009-09-13 03:36:29.000000000 -0700
+++ new/screen.c 2009-09-13 03:36:44.000000000 -0700
@@ -2171,7 +2171,11 @@ fold_line(wp, fold_count, foldinfo, lnum
#endif
/* Set all attributes of the 'number' column and the text */
- RL_MEMSET(col, hl_attr(HLF_FL), W_WIDTH(wp) - col);
+ /* RL_MEMSET(col, syn_get_foldhi(eval_foldhighlight(wp->w_p_fdh)), W_WIDTH(wp) - col);*/
+ RL_MEMSET(col, syn_get_foldhi(eval_foldhighlight(wp->w_p_fdh, lnum, lnume,foldinfo)),
+ W_WIDTH(wp) - col);
+ /* RL_MEMSET(col, eval_foldhighlight(wp->w_p_fdh), W_WIDTH(wp) - col);
+ */
#ifdef FEAT_SIGNS
/* If signs are being displayed, add two spaces. */
@@ -2186,10 +2190,10 @@ fold_line(wp, fold_count, foldinfo, lnum
if (wp->w_p_rl)
/* the line number isn't reversed */
copy_text_attr(off + W_WIDTH(wp) - len - col,
- (char_u *)" ", len, hl_attr(HLF_FL));
+ (char_u *)" ", len, syn_get_foldhidef());
else
# endif
- copy_text_attr(off + col, (char_u *)" ", len, hl_attr(HLF_FL));
+ copy_text_attr(off + col, (char_u *)" ", len, syn_get_foldhidef());
col += len;
}
}
@@ -2212,10 +2216,10 @@ fold_line(wp, fold_count, foldinfo, lnum
if (wp->w_p_rl)
/* the line number isn't reversed */
copy_text_attr(off + W_WIDTH(wp) - len - col, buf, len,
- hl_attr(HLF_FL));
+ syn_get_foldhidef());
else
#endif
- copy_text_attr(off + col, buf, len, hl_attr(HLF_FL));
+ copy_text_attr(off + col, buf, len, syn_get_foldhidef());
col += len;
}
}
diff -rpuN original/structs.h new/structs.h
--- original/structs.h 2009-09-13 03:36:33.000000000 -0700
+++ new/structs.h 2009-09-13 03:36:49.000000000 -0700
@@ -157,6 +157,8 @@ typedef struct
# define w_p_fde w_onebuf_opt.wo_fde /* 'foldexpr' */
char_u *wo_fdt;
# define w_p_fdt w_onebuf_opt.wo_fdt /* 'foldtext' */
+ char_u *wo_fdh;
+# define w_p_fdh w_onebuf_opt.wo_fdh /* 'foldhighlight' */
# endif
char_u *wo_fmr;
# define w_p_fmr w_onebuf_opt.wo_fmr /* 'foldmarker' */
@@ -1946,6 +1948,7 @@ struct window_S
#ifdef FEAT_EVAL
long_u w_p_fde_flags; /* flags for 'foldexpr' */
long_u w_p_fdt_flags; /* flags for 'foldtext' */
+ long_u w_p_fdh_flags; /* flags for 'foldhilight' */
#endif
/* transform a pointer to a "onebuf" option into a "allbuf" option */
diff -rpuN original/syntax.c new/syntax.c
--- original/syntax.c 2009-09-13 03:36:29.000000000 -0700
+++ new/syntax.c 2009-09-13 03:36:44.000000000 -0700
@@ -6187,6 +6187,27 @@ syn_get_foldlevel(wp, lnum)
}
return level;
}
+
+/*
+ * Function called to get the default highlight ID for folded lines
+ */
+ int
+syn_get_foldhidef()
+{
+ return hl_attr(HLF_FL);
+}
+
+/*
+ * Function called to get the default highlight ID for folded lines
+ */
+ int
+syn_get_foldhi(hlid)
+{
+ if (hlid<HLF_COUNT)
+ return hl_attr(hlid);
+ else
+ return syn_id2attr(hlid);
+}
#endif
#endif /* FEAT_SYN_HL */