diff --git a/src/fold.c b/src/fold.c
index 8cadd43..d91203c 100644
--- a/src/fold.c
+++ b/src/fold.c
@@ -16,8 +16,8 @@
 
 #if defined(FEAT_FOLDING) || defined(PROTO)
 
-/* local declarations. {{{1 */
-/* typedef fold_T {{{2 */
+// local declarations. {{{1
+// typedef fold_T {{{2
 /*
  * The toplevel folds for each window are stored in the w_folds growarray.
  * Each toplevel fold can contain an array of second level folds in the
@@ -26,23 +26,23 @@
  */
 typedef struct
 {
-    linenr_T	fd_top;		/* first line of fold; for nested fold
-				 * relative to parent */
-    linenr_T	fd_len;		/* number of lines in the fold */
-    garray_T	fd_nested;	/* array of nested folds */
-    char	fd_flags;	/* see below */
-    char	fd_small;	/* TRUE, FALSE or MAYBE: fold smaller than
-				   'foldminlines'; MAYBE applies to nested
-				   folds too */
+    linenr_T	fd_top;		// first line of fold; for nested fold
+				// relative to parent
+    linenr_T	fd_len;		// number of lines in the fold
+    garray_T	fd_nested;	// array of nested folds
+    char	fd_flags;	// see below
+    char	fd_small;	// TRUE, FALSE or MAYBE: fold smaller than
+				// 'foldminlines'; MAYBE applies to nested
+				// folds too
 } fold_T;
 
-#define FD_OPEN		0	/* fold is open (nested ones can be closed) */
-#define FD_CLOSED	1	/* fold is closed */
-#define FD_LEVEL	2	/* depends on 'foldlevel' (nested folds too) */
+#define FD_OPEN		0	// fold is open (nested ones can be closed)
+#define FD_CLOSED	1	// fold is closed
+#define FD_LEVEL	2	// depends on 'foldlevel' (nested folds too)
 
-#define MAX_LEVEL	20	/* maximum fold depth */
+#define MAX_LEVEL	20	// maximum fold depth
 
-/* static functions {{{2 */
+// static functions {{{2
 static void newFoldLevelWin(win_T *wp);
 static int checkCloseRec(garray_T *gap, linenr_T lnum, int level);
 static int foldFind(garray_T *gap, linenr_T lnum, fold_T **fpp);
@@ -84,17 +84,17 @@
 static linenr_T prev_lnum = 0;
 static int prev_lnum_lvl = -1;
 
-/* Flags used for "done" argument of setManualFold. */
+// Flags used for "done" argument of setManualFold.
 #define DONE_NOTHING	0
-#define DONE_ACTION	1	/* did close or open a fold */
-#define DONE_FOLD	2	/* did find a fold */
+#define DONE_ACTION	1	// did close or open a fold
+#define DONE_FOLD	2	// did find a fold
 
 static int foldstartmarkerlen;
 static char_u *foldendmarker;
 static int foldendmarkerlen;
 
-/* Exported folding functions. {{{1 */
-/* copyFoldingState() {{{2 */
+// Exported folding functions. {{{1
+// copyFoldingState() {{{2
 
 /*
  * Copy that folding state from window "wp_from" to window "wp_to".
@@ -107,19 +107,19 @@
     cloneFoldGrowArray(&wp_from->w_folds, &wp_to->w_folds);
 }
 
-/* hasAnyFolding() {{{2 */
+// hasAnyFolding() {{{2
 /*
  * Return TRUE if there may be folded lines in the current window.
  */
     int
 hasAnyFolding(win_T *win)
 {
-    /* very simple now, but can become more complex later */
+    // very simple now, but can become more complex later
     return (win->w_p_fen
 	    && (!foldmethodIsManual(win) || win->w_folds.ga_len > 0));
 }
 
-/* hasFolding() {{{2 */
+// hasFolding() {{{2
 /*
  * Return TRUE if line "lnum" in the current window is part of a closed
  * fold.
@@ -132,15 +132,15 @@
     return hasFoldingWin(curwin, lnum, firstp, lastp, TRUE, NULL);
 }
 
-/* hasFoldingWin() {{{2 */
+// hasFoldingWin() {{{2
     int
 hasFoldingWin(
     win_T	*win,
     linenr_T	lnum,
     linenr_T	*firstp,
     linenr_T	*lastp,
-    int		cache,		/* when TRUE: use cached values of window */
-    foldinfo_T	*infop)		/* where to store fold info */
+    int		cache,		// when TRUE: use cached values of window
+    foldinfo_T	*infop)		// where to store fold info
 {
     int		had_folded = FALSE;
     linenr_T	first = 0;
@@ -192,25 +192,25 @@
 	    if (!foldFind(gap, lnum_rel, &fp))
 		break;
 
-	    /* Remember lowest level of fold that starts in "lnum". */
+	    // Remember lowest level of fold that starts in "lnum".
 	    if (lnum_rel == fp->fd_top && low_level == 0)
 		low_level = level + 1;
 
 	    first += fp->fd_top;
 	    last += fp->fd_top;
 
-	    /* is this fold closed? */
+	    // is this fold closed?
 	    had_folded = check_closed(win, fp, &use_level, level,
 					       &maybe_small, lnum - lnum_rel);
 	    if (had_folded)
 	    {
-		/* Fold closed: Set last and quit loop. */
+		// Fold closed: Set last and quit loop.
 		last += fp->fd_len - 1;
 		break;
 	    }
 
-	    /* Fold found, but it's open: Check nested folds.  Line number is
-	     * relative to containing fold. */
+	    // Fold found, but it's open: Check nested folds.  Line number is
+	    // relative to containing fold.
 	    gap = &fp->fd_nested;
 	    lnum_rel -= fp->fd_top;
 	    ++level;
@@ -243,7 +243,7 @@
     return TRUE;
 }
 
-/* foldLevel() {{{2 */
+// foldLevel() {{{2
 #ifdef FEAT_EVAL
 /*
  * Return fold level at line number "lnum" in the current window.
@@ -251,8 +251,8 @@
     static int
 foldLevel(linenr_T lnum)
 {
-    /* While updating the folds lines between invalid_top and invalid_bot have
-     * an undefined fold level.  Otherwise update the folds first. */
+    // While updating the folds lines between invalid_top and invalid_bot have
+    // an undefined fold level.  Otherwise update the folds first.
     if (invalid_top == (linenr_T)0)
 	checkupdate(curwin);
     else if (lnum == prev_lnum && prev_lnum_lvl >= 0)
@@ -260,7 +260,7 @@
     else if (lnum >= invalid_top && lnum <= invalid_bot)
 	return -1;
 
-    /* Return quickly when there is no folding at all in this window. */
+    // Return quickly when there is no folding at all in this window.
     if (!hasAnyFolding(curwin))
 	return 0;
 
@@ -268,7 +268,7 @@
 }
 #endif
 
-/* lineFolded()	{{{2 */
+// lineFolded()	{{{2
 /*
  * Low level function to check if a line is folded.  Doesn't use any caching.
  * Return TRUE if line is folded.
@@ -281,7 +281,7 @@
     return foldedCount(win, lnum, NULL) != 0;
 }
 
-/* foldedCount() {{{2 */
+// 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
@@ -300,7 +300,7 @@
     return 0;
 }
 
-/* foldmethodIsManual() {{{2 */
+// foldmethodIsManual() {{{2
 /*
  * Return TRUE if 'foldmethod' is "manual"
  */
@@ -310,7 +310,7 @@
     return (wp->w_p_fdm[3] == 'u');
 }
 
-/* foldmethodIsIndent() {{{2 */
+// foldmethodIsIndent() {{{2
 /*
  * Return TRUE if 'foldmethod' is "indent"
  */
@@ -320,7 +320,7 @@
     return (wp->w_p_fdm[0] == 'i');
 }
 
-/* foldmethodIsExpr() {{{2 */
+// foldmethodIsExpr() {{{2
 /*
  * Return TRUE if 'foldmethod' is "expr"
  */
@@ -330,7 +330,7 @@
     return (wp->w_p_fdm[1] == 'x');
 }
 
-/* foldmethodIsMarker() {{{2 */
+// foldmethodIsMarker() {{{2
 /*
  * Return TRUE if 'foldmethod' is "marker"
  */
@@ -340,7 +340,7 @@
     return (wp->w_p_fdm[2] == 'r');
 }
 
-/* foldmethodIsSyntax() {{{2 */
+// foldmethodIsSyntax() {{{2
 /*
  * Return TRUE if 'foldmethod' is "syntax"
  */
@@ -350,7 +350,7 @@
     return (wp->w_p_fdm[0] == 's');
 }
 
-/* foldmethodIsDiff() {{{2 */
+// foldmethodIsDiff() {{{2
 /*
  * Return TRUE if 'foldmethod' is "diff"
  */
@@ -360,7 +360,7 @@
     return (wp->w_p_fdm[0] == 'd');
 }
 
-/* closeFold() {{{2 */
+// closeFold() {{{2
 /*
  * Close fold for current window at line "lnum".
  * Repeat "count" times.
@@ -371,7 +371,7 @@
     setFoldRepeat(lnum, count, FALSE);
 }
 
-/* closeFoldRecurse() {{{2 */
+// closeFoldRecurse() {{{2
 /*
  * Close fold for current window at line "lnum" recursively.
  */
@@ -381,7 +381,7 @@
     (void)setManualFold(lnum, FALSE, TRUE, NULL);
 }
 
-/* opFoldRange() {{{2 */
+// opFoldRange() {{{2
 /*
  * Open or Close folds for current window in lines "first" to "last".
  * Used for "zo", "zO", "zc" and "zC" in Visual mode.
@@ -390,35 +390,35 @@
 opFoldRange(
     linenr_T	first,
     linenr_T	last,
-    int		opening,	/* TRUE to open, FALSE to close */
-    int		recurse,	/* TRUE to do it recursively */
-    int		had_visual)	/* TRUE when Visual selection used */
+    int		opening,	// TRUE to open, FALSE to close
+    int		recurse,	// TRUE to do it recursively
+    int		had_visual)	// TRUE when Visual selection used
 {
-    int		done = DONE_NOTHING;	/* avoid error messages */
+    int		done = DONE_NOTHING;	// avoid error messages
     linenr_T	lnum;
     linenr_T	lnum_next;
 
     for (lnum = first; lnum <= last; lnum = lnum_next + 1)
     {
 	lnum_next = lnum;
-	/* Opening one level only: next fold to open is after the one going to
-	 * be opened. */
+	// Opening one level only: next fold to open is after the one going to
+	// be opened.
 	if (opening && !recurse)
 	    (void)hasFolding(lnum, NULL, &lnum_next);
 	(void)setManualFold(lnum, opening, recurse, &done);
-	/* Closing one level only: next line to close a fold is after just
-	 * closed fold. */
+	// Closing one level only: next line to close a fold is after just
+	// closed fold.
 	if (!opening && !recurse)
 	    (void)hasFolding(lnum, NULL, &lnum_next);
     }
     if (done == DONE_NOTHING)
 	emsg(_(e_nofold));
-    /* Force a redraw to remove the Visual highlighting. */
+    // Force a redraw to remove the Visual highlighting.
     if (had_visual)
 	redraw_curbuf_later(INVERTED);
 }
 
-/* openFold() {{{2 */
+// openFold() {{{2
 /*
  * Open fold for current window at line "lnum".
  * Repeat "count" times.
@@ -429,7 +429,7 @@
     setFoldRepeat(lnum, count, TRUE);
 }
 
-/* openFoldRecurse() {{{2 */
+// openFoldRecurse() {{{2
 /*
  * Open fold for current window at line "lnum" recursively.
  */
@@ -439,7 +439,7 @@
     (void)setManualFold(lnum, TRUE, TRUE, NULL);
 }
 
-/* foldOpenCursor() {{{2 */
+// foldOpenCursor() {{{2
 /*
  * Open folds until the cursor line is not in a closed fold.
  */
@@ -459,7 +459,7 @@
 	}
 }
 
-/* newFoldLevel() {{{2 */
+// newFoldLevel() {{{2
 /*
  * Set new foldlevel for current window.
  */
@@ -497,9 +497,9 @@
     checkupdate(wp);
     if (wp->w_fold_manual)
     {
-	/* Set all flags for the first level of folds to FD_LEVEL.  Following
-	 * manual open/close will then change the flags to FD_OPEN or
-	 * FD_CLOSED for those folds that don't use 'foldlevel'. */
+	// Set all flags for the first level of folds to FD_LEVEL.  Following
+	// manual open/close will then change the flags to FD_OPEN or
+	// FD_CLOSED for those folds that don't use 'foldlevel'.
 	fp = (fold_T *)wp->w_folds.ga_data;
 	for (i = 0; i < wp->w_folds.ga_len; ++i)
 	    fp[i].fd_flags = FD_LEVEL;
@@ -508,14 +508,14 @@
     changed_window_setting_win(wp);
 }
 
-/* foldCheckClose() {{{2 */
+// foldCheckClose() {{{2
 /*
  * Apply 'foldlevel' to all folds that don't contain the cursor.
  */
     void
 foldCheckClose(void)
 {
-    if (*p_fcl != NUL)	/* can only be "all" right now */
+    if (*p_fcl != NUL)	// can only be "all" right now
     {
 	checkupdate(curwin);
 	if (checkCloseRec(&curwin->w_folds, curwin->w_cursor.lnum,
@@ -524,7 +524,7 @@
     }
 }
 
-/* checkCloseRec() {{{2 */
+// checkCloseRec() {{{2
     static int
 checkCloseRec(garray_T *gap, linenr_T lnum, int level)
 {
@@ -535,7 +535,7 @@
     fp = (fold_T *)gap->ga_data;
     for (i = 0; i < gap->ga_len; ++i)
     {
-	/* Only manually opened folds may need to be closed. */
+	// Only manually opened folds may need to be closed.
 	if (fp[i].fd_flags == FD_OPEN)
 	{
 	    if (level <= 0 && (lnum < fp[i].fd_top
@@ -552,7 +552,7 @@
     return retval;
 }
 
-/* foldCreateAllowed() {{{2 */
+// foldCreateAllowed() {{{2
 /*
  * Return TRUE if it's allowed to manually create or delete a fold.
  * Give an error message and return FALSE if not.
@@ -569,7 +569,7 @@
     return FALSE;
 }
 
-/* foldCreate() {{{2 */
+// foldCreate() {{{2
 /*
  * Create a fold from line "start" to line "end" (inclusive) in the current
  * window.
@@ -590,14 +590,14 @@
 
     if (start > end)
     {
-	/* reverse the range */
+	// reverse the range
 	end = start_rel;
 	start = end_rel;
 	start_rel = start;
 	end_rel = end;
     }
 
-    /* When 'foldmethod' is "marker" add markers, which creates the folds. */
+    // When 'foldmethod' is "marker" add markers, which creates the folds.
     if (foldmethodIsMarker(curwin))
     {
 	foldCreateMarkers(start, end);
@@ -606,7 +606,7 @@
 
     checkupdate(curwin);
 
-    /* Find the place to insert the new fold. */
+    // Find the place to insert the new fold.
     gap = &curwin->w_folds;
     for (;;)
     {
@@ -614,7 +614,7 @@
 	    break;
 	if (fp->fd_top + fp->fd_len > end_rel)
 	{
-	    /* New fold is completely inside this fold: Go one level deeper. */
+	    // New fold is completely inside this fold: Go one level deeper.
 	    gap = &fp->fd_nested;
 	    start_rel -= fp->fd_top;
 	    end_rel -= fp->fd_top;
@@ -630,8 +630,8 @@
 	}
 	else
 	{
-	    /* This fold and new fold overlap: Insert here and move some folds
-	     * inside the new fold. */
+	    // This fold and new fold overlap: Insert here and move some folds
+	    // inside the new fold.
 	    break;
 	}
     }
@@ -642,45 +642,44 @@
 	fp = (fold_T *)gap->ga_data + i;
 	ga_init2(&fold_ga, (int)sizeof(fold_T), 10);
 
-	/* Count number of folds that will be contained in the new fold. */
+	// Count number of folds that will be contained in the new fold.
 	for (cont = 0; i + cont < gap->ga_len; ++cont)
 	    if (fp[cont].fd_top > end_rel)
 		break;
 	if (cont > 0 && ga_grow(&fold_ga, cont) == OK)
 	{
-	    /* If the first fold starts before the new fold, let the new fold
-	     * start there.  Otherwise the existing fold would change. */
+	    // If the first fold starts before the new fold, let the new fold
+	    // start there.  Otherwise the existing fold would change.
 	    if (start_rel > fp->fd_top)
 		start_rel = fp->fd_top;
 
-	    /* When last contained fold isn't completely contained, adjust end
-	     * of new fold. */
+	    // When last contained fold isn't completely contained, adjust end
+	    // of new fold.
 	    if (end_rel < fp[cont - 1].fd_top + fp[cont - 1].fd_len - 1)
 		end_rel = fp[cont - 1].fd_top + fp[cont - 1].fd_len - 1;
-	    /* Move contained folds to inside new fold. */
+	    // Move contained folds to inside new fold.
 	    mch_memmove(fold_ga.ga_data, fp, sizeof(fold_T) * cont);
 	    fold_ga.ga_len += cont;
 	    i += cont;
 
-	    /* Adjust line numbers in contained folds to be relative to the
-	     * new fold. */
+	    // Adjust line numbers in contained folds to be relative to the
+	    // new fold.
 	    for (j = 0; j < cont; ++j)
 		((fold_T *)fold_ga.ga_data)[j].fd_top -= start_rel;
 	}
-	/* Move remaining entries to after the new fold. */
+	// Move remaining entries to after the new fold.
 	if (i < gap->ga_len)
 	    mch_memmove(fp + 1, (fold_T *)gap->ga_data + i,
 				     sizeof(fold_T) * (gap->ga_len - i));
 	gap->ga_len = gap->ga_len + 1 - cont;
 
-	/* insert new fold */
+	// insert new fold
 	fp->fd_nested = fold_ga;
 	fp->fd_top = start_rel;
 	fp->fd_len = end_rel - start_rel + 1;
 
-	/* We want the new fold to be closed.  If it would remain open because
-	 * of using 'foldlevel', need to adjust fd_flags of containing folds.
-	 */
+	// We want the new fold to be closed.  If it would remain open because
+	// of using 'foldlevel', need to adjust fd_flags of containing folds.
 	if (use_level && !closed && level < curwin->w_p_fdl)
 	    closeFold(start, 1L);
 	if (!use_level)
@@ -688,12 +687,12 @@
 	fp->fd_flags = FD_CLOSED;
 	fp->fd_small = MAYBE;
 
-	/* redraw */
+	// redraw
 	changed_window_setting();
     }
 }
 
-/* deleteFold() {{{2 */
+// deleteFold() {{{2
 /*
  * Delete a fold at line "start" in the current window.
  * When "end" is not 0, delete all folds from "start" to "end".
@@ -704,7 +703,7 @@
     linenr_T	start,
     linenr_T	end,
     int		recursive,
-    int		had_visual)	/* TRUE when Visual selection used */
+    int		had_visual)	// TRUE when Visual selection used
 {
     garray_T	*gap;
     fold_T	*fp;
@@ -724,7 +723,7 @@
 
     while (lnum <= end)
     {
-	/* Find the deepest fold for "start". */
+	// Find the deepest fold for "start".
 	gap = &curwin->w_folds;
 	found_ga = NULL;
 	lnum_off = 0;
@@ -733,17 +732,17 @@
 	{
 	    if (!foldFind(gap, lnum - lnum_off, &fp))
 		break;
-	    /* lnum is inside this fold, remember info */
+	    // lnum is inside this fold, remember info
 	    found_ga = gap;
 	    found_fp = fp;
 	    found_off = lnum_off;
 
-	    /* if "lnum" is folded, don't check nesting */
+	    // if "lnum" is folded, don't check nesting
 	    if (check_closed(curwin, fp, &use_level, level,
 						      &maybe_small, lnum_off))
 		break;
 
-	    /* check nested folds */
+	    // check nested folds
 	    gap = &fp->fd_nested;
 	    lnum_off += fp->fd_top;
 	    ++level;
@@ -771,26 +770,26 @@
 	    }
 	    did_one = TRUE;
 
-	    /* redraw window */
+	    // redraw window
 	    changed_window_setting();
 	}
     }
     if (!did_one)
     {
 	emsg(_(e_nofold));
-	/* Force a redraw to remove the Visual highlighting. */
+	// Force a redraw to remove the Visual highlighting.
 	if (had_visual)
 	    redraw_curbuf_later(INVERTED);
     }
     else
-	/* Deleting markers may make cursor column invalid. */
+	// Deleting markers may make cursor column invalid.
 	check_cursor_col();
 
     if (last_lnum > 0)
 	changed_lines(first_lnum, (colnr_T)0, last_lnum, 0L);
 }
 
-/* clearFolding() {{{2 */
+// clearFolding() {{{2
 /*
  * Remove all folding for window "win".
  */
@@ -801,7 +800,7 @@
     win->w_foldinvalid = FALSE;
 }
 
-/* foldUpdate() {{{2 */
+// foldUpdate() {{{2
 /*
  * Update folds for changes in the buffer of a window.
  * Note that inserted/deleted lines must have already been taken care of by
@@ -821,7 +820,7 @@
 	return;
 #endif
 
-    /* Mark all folds from top to bot as maybe-small. */
+    // Mark all folds from top to bot as maybe-small.
     (void)foldFind(&wp->w_folds, top, &fp);
     while (fp < (fold_T *)wp->w_folds.ga_data + wp->w_folds.ga_len
 	    && fp->fd_top < bot)
@@ -840,14 +839,14 @@
     {
 	int save_got_int = got_int;
 
-	/* reset got_int here, otherwise it won't work */
+	// reset got_int here, otherwise it won't work
 	got_int = FALSE;
 	foldUpdateIEMS(wp, top, bot);
 	got_int |= save_got_int;
     }
 }
 
-/* foldUpdateAll() {{{2 */
+// foldUpdateAll() {{{2
 /*
  * Update all lines in a window for folding.
  * Used when a fold setting changes or after reloading the buffer.
@@ -861,7 +860,7 @@
     redraw_win_later(win, NOT_VALID);
 }
 
-/* foldMoveTo() {{{2 */
+// foldMoveTo() {{{2
 /*
  * If "updown" is FALSE: Move to the start or end of the fold.
  * If "updown" is TRUE: move to fold at the same level.
@@ -870,7 +869,7 @@
     int
 foldMoveTo(
     int		updown,
-    int		dir,	    /* FORWARD or BACKWARD */
+    int		dir,	    // FORWARD or BACKWARD
     long	count)
 {
     long	n;
@@ -887,11 +886,11 @@
 
     checkupdate(curwin);
 
-    /* Repeat "count" times. */
+    // Repeat "count" times.
     for (n = 0; n < count; ++n)
     {
-	/* Find nested folds.  Stop when a fold is closed.  The deepest fold
-	 * that moves the cursor is used. */
+	// Find nested folds.  Stop when a fold is closed.  The deepest fold
+	// that moves the cursor is used.
 	lnum_off = 0;
 	gap = &curwin->w_folds;
 	use_level = FALSE;
@@ -906,8 +905,8 @@
 		if (!updown)
 		    break;
 
-		/* When moving up, consider a fold above the cursor; when
-		 * moving down consider a fold below the cursor. */
+		// When moving up, consider a fold above the cursor; when
+		// moving down consider a fold below the cursor.
 		if (dir == FORWARD)
 		{
 		    if (fp - (fold_T *)gap->ga_data >= gap->ga_len)
@@ -919,19 +918,19 @@
 		    if (fp == (fold_T *)gap->ga_data)
 			break;
 		}
-		/* don't look for contained folds, they will always move
-		 * the cursor too far. */
+		// don't look for contained folds, they will always move
+		// the cursor too far.
 		last = TRUE;
 	    }
 
 	    if (!last)
 	    {
-		/* Check if this fold is closed. */
+		// Check if this fold is closed.
 		if (check_closed(curwin, fp, &use_level, level,
 						      &maybe_small, lnum_off))
 		    last = TRUE;
 
-		/* "[z" and "]z" stop at closed fold */
+		// "[z" and "]z" stop at closed fold
 		if (last && !updown)
 		    break;
 	    }
@@ -940,7 +939,7 @@
 	    {
 		if (dir == FORWARD)
 		{
-		    /* to start of next fold if there is one */
+		    // to start of next fold if there is one
 		    if (fp + 1 - (fold_T *)gap->ga_data < gap->ga_len)
 		    {
 			lnum = fp[1].fd_top + lnum_off;
@@ -950,7 +949,7 @@
 		}
 		else
 		{
-		    /* to end of previous fold if there is one */
+		    // to end of previous fold if there is one
 		    if (fp > (fold_T *)gap->ga_data)
 		    {
 			lnum = fp[-1].fd_top + lnum_off + fp[-1].fd_len - 1;
@@ -961,8 +960,8 @@
 	    }
 	    else
 	    {
-		/* Open fold found, set cursor to its start/end and then check
-		 * nested folds. */
+		// Open fold found, set cursor to its start/end and then check
+		// nested folds.
 		if (dir == FORWARD)
 		{
 		    lnum = fp->fd_top + lnum_off + fp->fd_len - 1;
@@ -980,7 +979,7 @@
 	    if (last)
 		break;
 
-	    /* Check nested folds (if any). */
+	    // Check nested folds (if any).
 	    gap = &fp->fd_nested;
 	    lnum_off += fp->fd_top;
 	    ++level;
@@ -1000,7 +999,7 @@
     return retval;
 }
 
-/* foldInitWin() {{{2 */
+// foldInitWin() {{{2
 /*
  * Init the fold info in a new window.
  */
@@ -1010,7 +1009,7 @@
     ga_init2(&new_win->w_folds, (int)sizeof(fold_T), 10);
 }
 
-/* find_wl_entry() {{{2 */
+// find_wl_entry() {{{2
 /*
  * Find an entry in the win->w_lines[] array for buffer line "lnum".
  * Only valid entries are considered (for entries where wl_valid is FALSE the
@@ -1033,7 +1032,7 @@
     return -1;
 }
 
-/* foldAdjustVisual() {{{2 */
+// foldAdjustVisual() {{{2
 /*
  * Adjust the Visual area to include any fold at the start or end completely.
  */
@@ -1064,13 +1063,13 @@
 	end->col = (colnr_T)STRLEN(ptr);
 	if (end->col > 0 && *p_sel == 'o')
 	    --end->col;
-	/* prevent cursor from moving on the trail byte */
+	// prevent cursor from moving on the trail byte
 	if (has_mbyte)
 	    mb_adjust_cursor();
     }
 }
 
-/* cursor_foldstart() {{{2 */
+// cursor_foldstart() {{{2
 /*
  * Move the cursor to the first line of a closed fold.
  */
@@ -1080,8 +1079,8 @@
     (void)hasFolding(curwin->w_cursor.lnum, &curwin->w_cursor.lnum, NULL);
 }
 
-/* Internal functions for "fold_T" {{{1 */
-/* cloneFoldGrowArray() {{{2 */
+// Internal functions for "fold_T" {{{1
+// cloneFoldGrowArray() {{{2
 /*
  * Will "clone" (i.e deep copy) a garray_T of folds.
  *
@@ -1114,7 +1113,7 @@
     }
 }
 
-/* foldFind() {{{2 */
+// foldFind() {{{2
 /*
  * Search for line "lnum" in folds of growarray "gap".
  * Set *fpp to the fold struct for the fold that contains "lnum" or
@@ -1140,14 +1139,14 @@
     {
 	i = (low + high) / 2;
 	if (fp[i].fd_top > lnum)
-	    /* fold below lnum, adjust high */
+	    // fold below lnum, adjust high
 	    high = i - 1;
 	else if (fp[i].fd_top + fp[i].fd_len <= lnum)
-	    /* fold above lnum, adjust low */
+	    // fold above lnum, adjust low
 	    low = i + 1;
 	else
 	{
-	    /* lnum is inside this fold */
+	    // lnum is inside this fold
 	    *fpp = fp + i;
 	    return TRUE;
 	}
@@ -1156,7 +1155,7 @@
     return FALSE;
 }
 
-/* foldLevelWin() {{{2 */
+// foldLevelWin() {{{2
 /*
  * Return fold level at line number "lnum" in window "wp".
  */
@@ -1168,13 +1167,13 @@
     int		level =  0;
     garray_T	*gap;
 
-    /* Recursively search for a fold that contains "lnum". */
+    // Recursively search for a fold that contains "lnum".
     gap = &wp->w_folds;
     for (;;)
     {
 	if (!foldFind(gap, lnum_rel, &fp))
 	    break;
-	/* Check nested folds.  Line number is relative to containing fold. */
+	// Check nested folds.  Line number is relative to containing fold.
 	gap = &fp->fd_nested;
 	lnum_rel -= fp->fd_top;
 	++level;
@@ -1183,7 +1182,7 @@
     return level;
 }
 
-/* checkupdate() {{{2 */
+// checkupdate() {{{2
 /*
  * Check if the folds in window "wp" are invalid and update them if needed.
  */
@@ -1192,12 +1191,12 @@
 {
     if (wp->w_foldinvalid)
     {
-	foldUpdate(wp, (linenr_T)1, (linenr_T)MAXLNUM); /* will update all */
+	foldUpdate(wp, (linenr_T)1, (linenr_T)MAXLNUM); // will update all
 	wp->w_foldinvalid = FALSE;
     }
 }
 
-/* setFoldRepeat() {{{2 */
+// setFoldRepeat() {{{2
 /*
  * Open or close fold for current window at line "lnum".
  * Repeat "count" times.
@@ -1214,7 +1213,7 @@
 	(void)setManualFold(lnum, do_open, FALSE, &done);
 	if (!(done & DONE_ACTION))
 	{
-	    /* Only give an error message when no fold could be opened. */
+	    // Only give an error message when no fold could be opened.
 	    if (n == 0 && !(done & DONE_FOLD))
 		emsg(_(e_nofold));
 	    break;
@@ -1222,7 +1221,7 @@
     }
 }
 
-/* setManualFold() {{{2 */
+// setManualFold() {{{2
 /*
  * Open or close the fold in the current window which contains "lnum".
  * Also does this for other windows in diff mode when needed.
@@ -1230,8 +1229,8 @@
     static linenr_T
 setManualFold(
     linenr_T	lnum,
-    int		opening,    /* TRUE when opening, FALSE when closing */
-    int		recurse,    /* TRUE when closing/opening recursive */
+    int		opening,    // TRUE when opening, FALSE when closing
+    int		recurse,    // TRUE when closing/opening recursive
     int		*donep)
 {
 #ifdef FEAT_DIFF
@@ -1259,7 +1258,7 @@
     return setManualFoldWin(curwin, lnum, opening, recurse, donep);
 }
 
-/* setManualFoldWin() {{{2 */
+// setManualFoldWin() {{{2
 /*
  * Open or close the fold in window "wp" which contains "lnum".
  * "donep", when not NULL, points to flag that is set to DONE_FOLD when some
@@ -1273,8 +1272,8 @@
 setManualFoldWin(
     win_T	*wp,
     linenr_T	lnum,
-    int		opening,    /* TRUE when opening, FALSE when closing */
-    int		recurse,    /* TRUE when closing/opening recursive */
+    int		opening,    // TRUE when opening, FALSE when closing
+    int		recurse,    // TRUE when closing/opening recursive
     int		*donep)
 {
     fold_T	*fp;
@@ -1299,20 +1298,20 @@
     {
 	if (!foldFind(gap, lnum, &fp))
 	{
-	    /* If there is a following fold, continue there next time. */
+	    // If there is a following fold, continue there next time.
 	    if (fp < (fold_T *)gap->ga_data + gap->ga_len)
 		next = fp->fd_top + off;
 	    break;
 	}
 
-	/* lnum is inside this fold */
+	// lnum is inside this fold
 	found_fold = TRUE;
 
-	/* If there is a following fold, continue there next time. */
+	// If there is a following fold, continue there next time.
 	if (fp + 1 < (fold_T *)gap->ga_data + gap->ga_len)
 	    next = fp[1].fd_top + off;
 
-	/* Change from level-dependent folding to manual. */
+	// Change from level-dependent folding to manual.
 	if (use_level || fp->fd_flags == FD_LEVEL)
 	{
 	    use_level = TRUE;
@@ -1325,7 +1324,7 @@
 		fp2[j].fd_flags = FD_LEVEL;
 	}
 
-	/* Simple case: Close recursively means closing the fold. */
+	// Simple case: Close recursively means closing the fold.
 	if (!opening && recurse)
 	{
 	    if (fp->fd_flags != FD_CLOSED)
@@ -1336,7 +1335,7 @@
 	}
 	else if (fp->fd_flags == FD_CLOSED)
 	{
-	    /* When opening, open topmost closed fold. */
+	    // When opening, open topmost closed fold.
 	    if (opening)
 	    {
 		fp->fd_flags = FD_OPEN;
@@ -1347,7 +1346,7 @@
 	    break;
 	}
 
-	/* fold is open, check nested folds */
+	// fold is open, check nested folds
 	found = fp;
 	gap = &fp->fd_nested;
 	lnum -= fp->fd_top;
@@ -1356,7 +1355,7 @@
     }
     if (found_fold)
     {
-	/* When closing and not recurse, close deepest open fold. */
+	// When closing and not recurse, close deepest open fold.
 	if (!opening && found != NULL)
 	{
 	    found->fd_flags = FD_CLOSED;
@@ -1376,7 +1375,7 @@
     return next;
 }
 
-/* foldOpenNested() {{{2 */
+// foldOpenNested() {{{2
 /*
  * Open all nested folds in fold "fpr" recursively.
  */
@@ -1394,7 +1393,7 @@
     }
 }
 
-/* deleteFoldEntry() {{{2 */
+// deleteFoldEntry() {{{2
 /*
  * Delete fold "idx" from growarray "gap".
  * When "recursive" is TRUE also delete all the folds contained in it.
@@ -1411,7 +1410,7 @@
     fp = (fold_T *)gap->ga_data + idx;
     if (recursive || fp->fd_nested.ga_len == 0)
     {
-	/* recursively delete the contained folds */
+	// recursively delete the contained folds
 	deleteFoldRecurse(&fp->fd_nested);
 	--gap->ga_len;
 	if (idx < gap->ga_len)
@@ -1419,15 +1418,15 @@
     }
     else
     {
-	/* Move nested folds one level up, to overwrite the fold that is
-	 * deleted. */
+	// Move nested folds one level up, to overwrite the fold that is
+	// deleted.
 	moved = fp->fd_nested.ga_len;
 	if (ga_grow(gap, (int)(moved - 1)) == OK)
 	{
-	    /* Get "fp" again, the array may have been reallocated. */
+	    // Get "fp" again, the array may have been reallocated.
 	    fp = (fold_T *)gap->ga_data + idx;
 
-	    /* adjust fd_top and fd_flags for the moved folds */
+	    // adjust fd_top and fd_flags for the moved folds
 	    nfp = (fold_T *)fp->fd_nested.ga_data;
 	    for (i = 0; i < moved; ++i)
 	    {
@@ -1438,11 +1437,11 @@
 		    nfp[i].fd_small = MAYBE;
 	    }
 
-	    /* move the existing folds down to make room */
+	    // move the existing folds down to make room
 	    if (idx + 1 < gap->ga_len)
 		mch_memmove(fp + moved, fp + 1,
 				  sizeof(fold_T) * (gap->ga_len - (idx + 1)));
-	    /* move the contained folds one level up */
+	    // move the contained folds one level up
 	    mch_memmove(fp, nfp, (size_t)(sizeof(fold_T) * moved));
 	    vim_free(nfp);
 	    gap->ga_len += moved - 1;
@@ -1450,7 +1449,7 @@
     }
 }
 
-/* deleteFoldRecurse() {{{2 */
+// deleteFoldRecurse() {{{2
 /*
  * Delete nested folds in a fold.
  */
@@ -1464,7 +1463,7 @@
     ga_clear(gap);
 }
 
-/* foldMarkAdjust() {{{2 */
+// foldMarkAdjust() {{{2
 /*
  * Update line numbers of folds for inserted/deleted lines.
  */
@@ -1476,18 +1475,18 @@
     long	amount,
     long	amount_after)
 {
-    /* If deleting marks from line1 to line2, but not deleting all those
-     * lines, set line2 so that only deleted lines have their folds removed. */
+    // If deleting marks from line1 to line2, but not deleting all those
+    // lines, set line2 so that only deleted lines have their folds removed.
     if (amount == MAXLNUM && line2 >= line1 && line2 - line1 >= -amount_after)
 	line2 = line1 - amount_after - 1;
-    /* If appending a line in Insert mode, it should be included in the fold
-     * just above the line. */
+    // If appending a line in Insert mode, it should be included in the fold
+    // just above the line.
     if ((State & INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM)
 	--line1;
     foldMarkAdjustRecurse(&wp->w_folds, line1, line2, amount, amount_after);
 }
 
-/* foldMarkAdjustRecurse() {{{2 */
+// foldMarkAdjustRecurse() {{{2
     static void
 foldMarkAdjustRecurse(
     garray_T	*gap,
@@ -1501,14 +1500,14 @@
     linenr_T	last;
     linenr_T	top;
 
-    /* In Insert mode an inserted line at the top of a fold is considered part
-     * of the fold, otherwise it isn't. */
+    // In Insert mode an inserted line at the top of a fold is considered part
+    // of the fold, otherwise it isn't.
     if ((State & INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM)
 	top = line1 + 1;
     else
 	top = line1;
 
-    /* Find the fold containing or just below "line1". */
+    // Find the fold containing or just below "line1".
     (void)foldFind(gap, line1, &fp);
 
     /*
@@ -1528,13 +1527,13 @@
 	 *		3     5  6
 	 */
 
-	last = fp->fd_top + fp->fd_len - 1; /* last line of fold */
+	last = fp->fd_top + fp->fd_len - 1; // last line of fold
 
-	/* 1. fold completely above line1: nothing to do */
+	// 1. fold completely above line1: nothing to do
 	if (last < line1)
 	    continue;
 
-	/* 6. fold below line2: only adjust for amount_after */
+	// 6. fold below line2: only adjust for amount_after
 	if (fp->fd_top > line2)
 	{
 	    if (amount_after == 0)
@@ -1545,12 +1544,12 @@
 	{
 	    if (fp->fd_top >= top && last <= line2)
 	    {
-		/* 4. fold completely contained in range */
+		// 4. fold completely contained in range
 		if (amount == MAXLNUM)
 		{
-		    /* Deleting lines: delete the fold completely */
+		    // Deleting lines: delete the fold completely
 		    deleteFoldEntry(gap, i, TRUE);
-		    --i;    /* adjust index for deletion */
+		    --i;    // adjust index for deletion
 		    --fp;
 		}
 		else
@@ -1560,12 +1559,12 @@
 	    {
 		if (fp->fd_top < top)
 		{
-		    /* 2 or 3: need to correct nested folds too */
+		    // 2 or 3: need to correct nested folds too
 		    foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
 				  line2 - fp->fd_top, amount, amount_after);
 		    if (last <= line2)
 		    {
-			/* 2. fold contains line1, line2 is below fold */
+			// 2. fold contains line1, line2 is below fold
 			if (amount == MAXLNUM)
 			    fp->fd_len = line1 - fp->fd_top;
 			else
@@ -1573,14 +1572,14 @@
 		    }
 		    else
 		    {
-			/* 3. fold contains line1 and line2 */
+			// 3. fold contains line1 and line2
 			fp->fd_len += amount_after;
 		    }
 		}
 		else
 		{
-		    /* 5. fold is below line1 and contains line2; need to
-		     * correct nested folds too */
+		    // 5. fold is below line1 and contains line2; need to
+		    // correct nested folds too
 		    if (amount == MAXLNUM)
 		    {
 			foldMarkAdjustRecurse(&fp->fd_nested,
@@ -1607,7 +1606,7 @@
     }
 }
 
-/* getDeepestNesting() {{{2 */
+// getDeepestNesting() {{{2
 /*
  * Get the lowest 'foldlevel' value that makes the deepest nested fold in the
  * current window open.
@@ -1638,7 +1637,7 @@
     return maxlevel;
 }
 
-/* check_closed() {{{2 */
+// check_closed() {{{2
 /*
  * Check if a fold is closed and update the info needed to check nested folds.
  */
@@ -1646,15 +1645,15 @@
 check_closed(
     win_T	*win,
     fold_T	*fp,
-    int		*use_levelp,	    /* TRUE: outer fold had FD_LEVEL */
-    int		level,		    /* folding depth */
-    int		*maybe_smallp,	    /* TRUE: outer this had fd_small == MAYBE */
-    linenr_T	lnum_off)	    /* line number offset for fp->fd_top */
+    int		*use_levelp,	    // TRUE: outer fold had FD_LEVEL
+    int		level,		    // folding depth
+    int		*maybe_smallp,	    // TRUE: outer this had fd_small == MAYBE
+    linenr_T	lnum_off)	    // line number offset for fp->fd_top
 {
     int		closed = FALSE;
 
-    /* Check if this fold is closed.  If the flag is FD_LEVEL this
-     * fold and all folds it contains depend on 'foldlevel'. */
+    // Check if this fold is closed.  If the flag is FD_LEVEL this
+    // fold and all folds it contains depend on 'foldlevel'.
     if (*use_levelp || fp->fd_flags == FD_LEVEL)
     {
 	*use_levelp = TRUE;
@@ -1664,7 +1663,7 @@
     else if (fp->fd_flags == FD_CLOSED)
 	closed = TRUE;
 
-    /* Small fold isn't closed anyway. */
+    // Small fold isn't closed anyway.
     if (fp->fd_small == MAYBE)
 	*maybe_smallp = TRUE;
     if (closed)
@@ -1678,7 +1677,7 @@
     return closed;
 }
 
-/* checkSmall() {{{2 */
+// checkSmall() {{{2
 /*
  * Update fd_small field of fold "fp".
  */
@@ -1686,14 +1685,14 @@
 checkSmall(
     win_T	*wp,
     fold_T	*fp,
-    linenr_T	lnum_off)	/* offset for fp->fd_top */
+    linenr_T	lnum_off)	// offset for fp->fd_top
 {
     int		count;
     int		n;
 
     if (fp->fd_small == MAYBE)
     {
-	/* Mark any nested folds to maybe-small */
+	// Mark any nested folds to maybe-small
 	setSmallMaybe(&fp->fd_nested);
 
 	if (fp->fd_len > curwin->w_p_fml)
@@ -1715,7 +1714,7 @@
     }
 }
 
-/* setSmallMaybe() {{{2 */
+// setSmallMaybe() {{{2
 /*
  * Set small flags in "gap" to MAYBE.
  */
@@ -1730,7 +1729,7 @@
 	fp[i].fd_small = MAYBE;
 }
 
-/* foldCreateMarkers() {{{2 */
+// foldCreateMarkers() {{{2
 /*
  * Create a fold from line "start" to line "end" (inclusive) in the current
  * window by adding markers.
@@ -1748,12 +1747,12 @@
     foldAddMarker(start, curwin->w_p_fmr, foldstartmarkerlen);
     foldAddMarker(end, foldendmarker, foldendmarkerlen);
 
-    /* Update both changes here, to avoid all folds after the start are
-     * changed when the start marker is inserted and the end isn't. */
+    // Update both changes here, to avoid all folds after the start are
+    // changed when the start marker is inserted and the end isn't.
     changed_lines(start, (colnr_T)0, end, 0L);
 }
 
-/* foldAddMarker() {{{2 */
+// foldAddMarker() {{{2
 /*
  * Add "marker[markerlen]" in 'commentstring' to line "lnum".
  */
@@ -1767,19 +1766,19 @@
     char_u	*p = (char_u *)strstr((char *)curbuf->b_p_cms, "%s");
     int		line_is_comment = FALSE;
 
-    /* Allocate a new line: old-line + 'cms'-start + marker + 'cms'-end */
+    // Allocate a new line: old-line + 'cms'-start + marker + 'cms'-end
     line = ml_get(lnum);
     line_len = (int)STRLEN(line);
 
     if (u_save(lnum - 1, lnum + 1) == OK)
     {
-	/* Check if the line ends with an unclosed comment */
+	// Check if the line ends with an unclosed comment
 	(void)skip_comment(line, FALSE, FALSE, &line_is_comment);
 	newline = alloc(line_len + markerlen + STRLEN(cms) + 1);
 	if (newline == NULL)
 	    return;
 	STRCPY(newline, line);
-	/* Append the marker to the end of the line */
+	// Append the marker to the end of the line
 	if (p == NULL || line_is_comment)
 	    vim_strncpy(newline + line_len, marker, markerlen);
 	else
@@ -1793,7 +1792,7 @@
     }
 }
 
-/* deleteFoldMarkers() {{{2 */
+// deleteFoldMarkers() {{{2
 /*
  * Delete the markers for a fold, causing it to be deleted.
  */
@@ -1801,7 +1800,7 @@
 deleteFoldMarkers(
     fold_T	*fp,
     int		recursive,
-    linenr_T	lnum_off)	/* offset for fp->fd_top */
+    linenr_T	lnum_off)	// offset for fp->fd_top
 {
     int		i;
 
@@ -1814,7 +1813,7 @@
 					     foldendmarker, foldendmarkerlen);
 }
 
-/* foldDelMarker() {{{2 */
+// foldDelMarker() {{{2
 /*
  * Delete marker "marker[markerlen]" at the end of line "lnum".
  * Delete 'commentstring' if it matches.
@@ -1838,13 +1837,13 @@
     for (p = line; *p != NUL; ++p)
 	if (STRNCMP(p, marker, markerlen) == 0)
 	{
-	    /* Found the marker, include a digit if it's there. */
+	    // Found the marker, include a digit if it's there.
 	    len = markerlen;
 	    if (VIM_ISDIGIT(p[len]))
 		++len;
 	    if (*cms != NUL)
 	    {
-		/* Also delete 'commentstring' if it matches. */
+		// Also delete 'commentstring' if it matches.
 		cms2 = (char_u *)strstr((char *)cms, "%s");
 		if (p - line >= cms2 - cms
 			&& STRNCMP(p - (cms2 - cms), cms, cms2 - cms) == 0
@@ -1856,7 +1855,7 @@
 	    }
 	    if (u_save(lnum - 1, lnum + 1) == OK)
 	    {
-		/* Make new line: text-before-marker + text-after-marker */
+		// Make new line: text-before-marker + text-after-marker
 		newline = alloc(STRLEN(line) - len + 1);
 		if (newline != NULL)
 		{
@@ -1869,7 +1868,7 @@
 	}
 }
 
-/* get_foldtext() {{{2 */
+// 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[FOLD_TEXT_LEN]".
@@ -1885,7 +1884,7 @@
 {
     char_u	*text = NULL;
 #ifdef FEAT_EVAL
-     /* an error occurred when evaluating 'fdt' setting */
+     // an error occurred when evaluating 'fdt' setting
     static int	    got_fdt_error = FALSE;
     int		    save_did_emsg = did_emsg;
     static win_T    *last_wp = NULL;
@@ -1893,11 +1892,11 @@
 
     if (last_wp != wp || last_wp == NULL
 					|| last_lnum > lnum || last_lnum == 0)
-	/* window changed, try evaluating foldtext setting once again */
+	// window changed, try evaluating foldtext setting once again
 	got_fdt_error = FALSE;
 
     if (!got_fdt_error)
-	/* a previous error should not abort evaluating 'foldexpr' */
+	// a previous error should not abort evaluating 'foldexpr'
 	did_emsg = FALSE;
 
     if (*wp->w_p_fdt != NUL)
@@ -1907,12 +1906,12 @@
 	int	level;
 	char_u	*p;
 
-	/* Set "v:foldstart" and "v:foldend". */
+	// 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". */
+	// 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;
@@ -1921,14 +1920,14 @@
 	set_vim_var_string(VV_FOLDDASHES, dashes, -1);
 	set_vim_var_nr(VV_FOLDLEVEL, (long)level);
 
-	/* skip evaluating foldtext on errors */
+	// skip evaluating foldtext on errors
 	if (!got_fdt_error)
 	{
 	    save_curwin = curwin;
 	    curwin = wp;
 	    curbuf = wp->w_buffer;
 
-	    ++emsg_silent; /* handle exceptions, but don't display errors */
+	    ++emsg_silent; // handle exceptions, but don't display errors
 	    text = eval_to_string_safe(wp->w_p_fdt, NULL,
 			 was_set_insecurely((char_u *)"foldtext", OPT_LOCAL));
 	    --emsg_silent;
@@ -1948,8 +1947,8 @@
 
 	if (text != NULL)
 	{
-	    /* Replace unprintable characters, if there are any.  But
-	     * replace a TAB with a space. */
+	    // Replace unprintable characters, if there are any.  But
+	    // replace a TAB with a space.
 	    for (p = text; *p != NUL; ++p)
 	    {
 		int	len;
@@ -1988,7 +1987,7 @@
     return text;
 }
 
-/* foldtext_cleanup() {{{2 */
+// foldtext_cleanup() {{{2
 #ifdef FEAT_EVAL
 /*
  * Remove 'foldmarker' and 'commentstring' from "str" (in-place).
@@ -1996,34 +1995,34 @@
     static void
 foldtext_cleanup(char_u *str)
 {
-    char_u	*cms_start;	/* first part or the whole comment */
-    int		cms_slen = 0;	/* length of cms_start */
-    char_u	*cms_end;	/* last part of the comment or NULL */
-    int		cms_elen = 0;	/* length of cms_end */
+    char_u	*cms_start;	// first part or the whole comment
+    int		cms_slen = 0;	// length of cms_start
+    char_u	*cms_end;	// last part of the comment or NULL
+    int		cms_elen = 0;	// length of cms_end
     char_u	*s;
     char_u	*p;
     int		len;
     int		did1 = FALSE;
     int		did2 = FALSE;
 
-    /* Ignore leading and trailing white space in 'commentstring'. */
+    // Ignore leading and trailing white space in 'commentstring'.
     cms_start = skipwhite(curbuf->b_p_cms);
     cms_slen = (int)STRLEN(cms_start);
     while (cms_slen > 0 && VIM_ISWHITE(cms_start[cms_slen - 1]))
 	--cms_slen;
 
-    /* locate "%s" in 'commentstring', use the part before and after it. */
+    // locate "%s" in 'commentstring', use the part before and after it.
     cms_end = (char_u *)strstr((char *)cms_start, "%s");
     if (cms_end != NULL)
     {
 	cms_elen = cms_slen - (int)(cms_end - cms_start);
 	cms_slen = (int)(cms_end - cms_start);
 
-	/* exclude white space before "%s" */
+	// exclude white space before "%s"
 	while (cms_slen > 0 && VIM_ISWHITE(cms_start[cms_slen - 1]))
 	    --cms_slen;
 
-	/* skip "%s" and white space after it */
+	// skip "%s" and white space after it
 	s = skipwhite(cms_end + 2);
 	cms_elen -= (int)(s - cms_end);
 	cms_end = s;
@@ -2042,8 +2041,8 @@
 	    if (VIM_ISDIGIT(s[len]))
 		++len;
 
-	    /* May remove 'commentstring' start.  Useful when it's a double
-	     * quote and we already removed a double quote. */
+	    // May remove 'commentstring' start.  Useful when it's a double
+	    // quote and we already removed a double quote.
 	    for (p = s; p > str && VIM_ISWHITE(p[-1]); --p)
 		;
 	    if (p >= str + cms_slen
@@ -2081,28 +2080,28 @@
 }
 #endif
 
-/* Folding by indent, expr, marker and syntax. {{{1 */
-/* Define "fline_T", passed to get fold level for a line. {{{2 */
+// Folding by indent, expr, marker and syntax. {{{1
+// Define "fline_T", passed to get fold level for a line. {{{2
 typedef struct
 {
-    win_T	*wp;		/* window */
-    linenr_T	lnum;		/* current line number */
-    linenr_T	off;		/* offset between lnum and real line number */
-    linenr_T	lnum_save;	/* line nr used by foldUpdateIEMSRecurse() */
-    int		lvl;		/* current level (-1 for undefined) */
-    int		lvl_next;	/* level used for next line */
-    int		start;		/* number of folds that are forced to start at
-				   this line. */
-    int		end;		/* level of fold that is forced to end below
-				   this line */
-    int		had_end;	/* level of fold that is forced to end above
-				   this line (copy of "end" of prev. line) */
+    win_T	*wp;		// window
+    linenr_T	lnum;		// current line number
+    linenr_T	off;		// offset between lnum and real line number
+    linenr_T	lnum_save;	// line nr used by foldUpdateIEMSRecurse()
+    int		lvl;		// current level (-1 for undefined)
+    int		lvl_next;	// level used for next line
+    int		start;		// number of folds that are forced to start at
+				// this line.
+    int		end;		// level of fold that is forced to end below
+				// this line
+    int		had_end;	// level of fold that is forced to end above
+				// this line (copy of "end" of prev. line)
 } fline_T;
 
-/* Flag is set when redrawing is needed. */
+// Flag is set when redrawing is needed.
 static int fold_changed;
 
-/* Function declarations. {{{2 */
+// Function declarations. {{{2
 static linenr_T foldUpdateIEMSRecurse(garray_T *gap, int level, linenr_T startlnum, fline_T *flp, void (*getlevel)(fline_T *), linenr_T bot, int topflags);
 static int foldInsert(garray_T *gap, int i);
 static void foldSplit(garray_T *gap, int i, linenr_T top, linenr_T bot);
@@ -2116,7 +2115,7 @@
 static void foldlevelMarker(fline_T *flp);
 static void foldlevelSyntax(fline_T *flp);
 
-/* foldUpdateIEMS() {{{2 */
+// foldUpdateIEMS() {{{2
 /*
  * Update the folding for window "wp", at least from lines "top" to "bot".
  * Return TRUE if any folds did change.
@@ -2131,23 +2130,23 @@
     int		level;
     fold_T	*fp;
 
-    /* Avoid problems when being called recursively. */
+    // Avoid problems when being called recursively.
     if (invalid_top != (linenr_T)0)
 	return;
 
     if (wp->w_foldinvalid)
     {
-	/* Need to update all folds. */
+	// Need to update all folds.
 	top = 1;
 	bot = wp->w_buffer->b_ml.ml_line_count;
 	wp->w_foldinvalid = FALSE;
 
-	/* Mark all folds a maybe-small. */
+	// Mark all folds a maybe-small.
 	setSmallMaybe(&wp->w_folds);
     }
 
 #ifdef FEAT_DIFF
-    /* add the context for "diff" folding */
+    // add the context for "diff" folding
     if (foldmethodIsDiff(wp))
     {
 	if (top > diff_context)
@@ -2158,8 +2157,8 @@
     }
 #endif
 
-    /* When deleting lines at the end of the buffer "top" can be past the end
-     * of the buffer. */
+    // When deleting lines at the end of the buffer "top" can be past the end
+    // of the buffer.
     if (top > wp->w_buffer->b_ml.ml_line_count)
 	top = wp->w_buffer->b_ml.ml_line_count;
 
@@ -2179,24 +2178,24 @@
     {
 	getlevel = foldlevelMarker;
 
-	/* Init marker variables to speed up foldlevelMarker(). */
+	// Init marker variables to speed up foldlevelMarker().
 	parseMarker(wp);
 
-	/* Need to get the level of the line above top, it is used if there is
-	 * no marker at the top. */
+	// Need to get the level of the line above top, it is used if there is
+	// no marker at the top.
 	if (top > 1)
 	{
-	    /* Get the fold level at top - 1. */
+	    // Get the fold level at top - 1.
 	    level = foldLevelWin(wp, top - 1);
 
-	    /* The fold may end just above the top, check for that. */
+	    // The fold may end just above the top, check for that.
 	    fline.lnum = top - 1;
 	    fline.lvl = level;
 	    getlevel(&fline);
 
-	    /* If a fold started here, we already had the level, if it stops
-	     * here, we need to use lvl_next.  Could also start and end a fold
-	     * in the same line. */
+	    // If a fold started here, we already had the level, if it stops
+	    // here, we need to use lvl_next.  Could also start and end a fold
+	    // in the same line.
 	    if (fline.lvl > level)
 		fline.lvl = level - (fline.lvl - fline.lvl_next);
 	    else
@@ -2211,8 +2210,8 @@
 	if (foldmethodIsExpr(wp))
 	{
 	    getlevel = foldlevelExpr;
-	    /* start one line back, because a "<1" may indicate the end of a
-	     * fold in the topline */
+	    // start one line back, because a "<1" may indicate the end of a
+	    // fold in the topline
 	    if (top > 1)
 		--fline.lnum;
 	}
@@ -2225,13 +2224,13 @@
 	else
 	    getlevel = foldlevelIndent;
 
-	/* Backup to a line for which the fold level is defined.  Since it's
-	 * always defined for line one, we will stop there. */
+	// Backup to a line for which the fold level is defined.  Since it's
+	// always defined for line one, we will stop there.
 	fline.lvl = -1;
 	for ( ; !got_int; --fline.lnum)
 	{
-	    /* Reset lvl_next each time, because it will be set to a value for
-	     * the next line, but we search backwards here. */
+	    // Reset lvl_next each time, because it will be set to a value for
+	    // the next line, but we search backwards here.
 	    fline.lvl_next = -1;
 	    getlevel(&fline);
 	    if (fline.lvl >= 0)
@@ -2275,20 +2274,20 @@
 
     start = fline.lnum;
     end = bot;
-    /* Do at least one line. */
+    // Do at least one line.
     if (start > end && end < wp->w_buffer->b_ml.ml_line_count)
 	end = start;
     while (!got_int)
     {
-	/* Always stop at the end of the file ("end" can be past the end of
-	 * the file). */
+	// Always stop at the end of the file ("end" can be past the end of
+	// the file).
 	if (fline.lnum > wp->w_buffer->b_ml.ml_line_count)
 	    break;
 	if (fline.lnum > end)
 	{
-	    /* For "marker", "expr"  and "syntax"  methods: If a change caused
-	     * a fold to be removed, we need to continue at least until where
-	     * it ended. */
+	    // For "marker", "expr"  and "syntax"  methods: If a change caused
+	    // a fold to be removed, we need to continue at least until where
+	    // it ended.
 	    if (getlevel != foldlevelMarker
 		    && getlevel != foldlevelSyntax
 		    && getlevel != foldlevelExpr)
@@ -2302,15 +2301,15 @@
 		end = fp->fd_top + fp->fd_len - 1;
 	    else if (getlevel == foldlevelSyntax
 		    && foldLevelWin(wp, fline.lnum) != fline.lvl)
-		/* For "syntax" method: Compare the foldlevel that the syntax
-		 * tells us to the foldlevel from the existing folds.  If they
-		 * don't match continue updating folds. */
+		// For "syntax" method: Compare the foldlevel that the syntax
+		// tells us to the foldlevel from the existing folds.  If they
+		// don't match continue updating folds.
 		end = fline.lnum;
 	    else
 		break;
 	}
 
-	/* A level 1 fold starts at a line with foldlevel > 0. */
+	// A level 1 fold starts at a line with foldlevel > 0.
 	if (fline.lvl > 0)
 	{
 	    invalid_top = fline.lnum;
@@ -2329,16 +2328,16 @@
 	}
     }
 
-    /* There can't be any folds from start until end now. */
+    // There can't be any folds from start until end now.
     foldRemove(&wp->w_folds, start, end);
 
-    /* If some fold changed, need to redraw and position cursor. */
+    // If some fold changed, need to redraw and position cursor.
     if (fold_changed && wp->w_p_fen)
 	changed_window_setting_win(wp);
 
-    /* If we updated folds past "bot", need to redraw more lines.  Don't do
-     * this in other situations, the changed lines will be redrawn anyway and
-     * this method can cause the whole window to be updated. */
+    // If we updated folds past "bot", need to redraw more lines.  Don't do
+    // this in other situations, the changed lines will be redrawn anyway and
+    // this method can cause the whole window to be updated.
     if (end != bot)
     {
 	if (wp->w_redraw_top == 0 || wp->w_redraw_top > top)
@@ -2350,7 +2349,7 @@
     invalid_top = (linenr_T)0;
 }
 
-/* foldUpdateIEMSRecurse() {{{2 */
+// foldUpdateIEMSRecurse() {{{2
 /*
  * Update a fold that starts at "flp->lnum".  At this line there is always a
  * valid foldlevel, and its level >= "level".
@@ -2382,14 +2381,14 @@
     fline_T	*flp,
     void	(*getlevel)(fline_T *),
     linenr_T	bot,
-    int		topflags)	/* flags used by containing fold */
+    int		topflags)	// flags used by containing fold
 {
     linenr_T	ll;
     fold_T	*fp = NULL;
     fold_T	*fp2;
     int		lvl = level;
     linenr_T	startlnum2 = startlnum;
-    linenr_T	firstlnum = flp->lnum;	/* first lnum we got */
+    linenr_T	firstlnum = flp->lnum;	// first lnum we got
     int		i;
     int		finish = FALSE;
     linenr_T	linecount = flp->wp->w_buffer->b_ml.ml_line_count - flp->off;
@@ -2424,13 +2423,13 @@
     flp->lnum_save = flp->lnum;
     while (!got_int)
     {
-	/* Updating folds can be slow, check for CTRL-C. */
+	// Updating folds can be slow, check for CTRL-C.
 	line_breakcheck();
 
-	/* Set "lvl" to the level of line "flp->lnum".  When flp->start is set
-	 * and after the first line of the fold, set the level to zero to
-	 * force the fold to end.  Do the same when had_end is set: Previous
-	 * line was marked as end of a fold. */
+	// Set "lvl" to the level of line "flp->lnum".  When flp->start is set
+	// and after the first line of the fold, set the level to zero to
+	// force the fold to end.  Do the same when had_end is set: Previous
+	// line was marked as end of a fold.
 	lvl = flp->lvl;
 	if (lvl > MAX_LEVEL)
 	    lvl = MAX_LEVEL;
@@ -2440,12 +2439,11 @@
 
 	if (flp->lnum > bot && !finish && fp != NULL)
 	{
-	    /* For "marker" and "syntax" methods:
-	     * - If a change caused a nested fold to be removed, we need to
-	     *   delete it and continue at least until where it ended.
-	     * - If a change caused a nested fold to be created, or this fold
-	     *   to continue below its original end, need to finish this fold.
-	     */
+	    // For "marker" and "syntax" methods:
+	    // - If a change caused a nested fold to be removed, we need to
+	    //   delete it and continue at least until where it ended.
+	    // - If a change caused a nested fold to be created, or this fold
+	    //   to continue below its original end, need to finish this fold.
 	    if (getlevel != foldlevelMarker
 		    && getlevel != foldlevelExpr
 		    && getlevel != foldlevelSyntax)
@@ -2454,9 +2452,9 @@
 	    fp2 = fp;
 	    if (lvl >= level)
 	    {
-		/* Compute how deep the folds currently are, if it's deeper
-		 * than "lvl" then some must be deleted, need to update
-		 * at least one nested fold. */
+		// Compute how deep the folds currently are, if it's deeper
+		// than "lvl" then some must be deleted, need to update
+		// at least one nested fold.
 		ll = flp->lnum - fp->fd_top;
 		while (foldFind(&fp2->fd_nested, ll, &fp2))
 		{
@@ -2476,9 +2474,9 @@
 		break;
 	}
 
-	/* At the start of the first nested fold and at the end of the current
-	 * fold: check if existing folds at this level, before the current
-	 * one, need to be deleted or truncated. */
+	// At the start of the first nested fold and at the end of the current
+	// fold: check if existing folds at this level, before the current
+	// one, need to be deleted or truncated.
 	if (fp == NULL
 		&& (lvl != level
 		    || flp->lnum_save >= bot
@@ -2492,16 +2490,16 @@
 	     */
 	    while (!got_int)
 	    {
-		/* set concat to 1 if it's allowed to concatenated this fold
-		 * with a previous one that touches it. */
+		// set concat to 1 if it's allowed to concatenated this fold
+		// with a previous one that touches it.
 		if (flp->start != 0 || flp->had_end <= MAX_LEVEL)
 		    concat = 0;
 		else
 		    concat = 1;
 
-		/* Find an existing fold to re-use.  Preferably one that
-		 * includes startlnum, otherwise one that ends just before
-		 * startlnum or starts after it. */
+		// Find an existing fold to re-use.  Preferably one that
+		// includes startlnum, otherwise one that ends just before
+		// startlnum or starts after it.
 		if (foldFind(gap, startlnum, &fp)
 			|| (fp < ((fold_T *)gap->ga_data) + gap->ga_len
 			    && fp->fd_top <= firstlnum)
@@ -2513,23 +2511,23 @@
 		{
 		    if (fp->fd_top + fp->fd_len + concat > firstlnum)
 		    {
-			/* Use existing fold for the new fold.  If it starts
-			 * before where we started looking, extend it.  If it
-			 * starts at another line, update nested folds to keep
-			 * their position, compensating for the new fd_top. */
+			// Use existing fold for the new fold.  If it starts
+			// before where we started looking, extend it.  If it
+			// starts at another line, update nested folds to keep
+			// their position, compensating for the new fd_top.
 			if (fp->fd_top == firstlnum)
 			{
-			    /* have found a fold beginning where we want */
+			    // have found a fold beginning where we want
 			}
 			else if (fp->fd_top >= startlnum)
 			{
 			    if (fp->fd_top > firstlnum)
-				/* like lines are inserted */
+				// like lines are inserted
 				foldMarkAdjustRecurse(&fp->fd_nested,
 					(linenr_T)0, (linenr_T)MAXLNUM,
 					(long)(fp->fd_top - firstlnum), 0L);
 			    else
-				/* like lines are deleted */
+				// like lines are deleted
 				foldMarkAdjustRecurse(&fp->fd_nested,
 					(linenr_T)0,
 					(long)(firstlnum - fp->fd_top - 1),
@@ -2577,9 +2575,9 @@
 			    foldSplit(gap, i, breakstart, breakend - 1);
 			    fp = (fold_T *)gap->ga_data + i + 1;
 
-			    /* If using the "marker" or "syntax" method, we
-			     * need to continue until the end of the fold is
-			     * found. */
+			    // If using the "marker" or "syntax" method, we
+			    // need to continue until the end of the fold is
+			    // found.
 			    if (getlevel == foldlevelMarker
 				    || getlevel == foldlevelExpr
 				    || getlevel == foldlevelSyntax)
@@ -2603,16 +2601,16 @@
 		    }
 		    if (fp->fd_top >= startlnum)
 		    {
-			/* A fold that starts at or after startlnum and stops
-			 * before the new fold must be deleted.  Continue
-			 * looking for the next one. */
+			// A fold that starts at or after startlnum and stops
+			// before the new fold must be deleted.  Continue
+			// looking for the next one.
 			deleteFoldEntry(gap,
 				     (int)(fp - (fold_T *)gap->ga_data), TRUE);
 		    }
 		    else
 		    {
-			/* A fold has some lines above startlnum, truncate it
-			 * to stop just above startlnum.  */
+			// A fold has some lines above startlnum, truncate it
+			// to stop just above startlnum.
 			fp->fd_len = startlnum - fp->fd_top;
 			foldMarkAdjustRecurse(&fp->fd_nested,
 				(linenr_T)fp->fd_len, (linenr_T)MAXLNUM,
@@ -2622,19 +2620,19 @@
 		}
 		else
 		{
-		    /* Insert new fold.  Careful: ga_data may be NULL and it
-		     * may change! */
+		    // Insert new fold.  Careful: ga_data may be NULL and it
+		    // may change!
 		    i = (int)(fp - (fold_T *)gap->ga_data);
 		    if (foldInsert(gap, i) != OK)
 			return bot;
 		    fp = (fold_T *)gap->ga_data + i;
-		    /* The new fold continues until bot, unless we find the
-		     * end earlier. */
+		    // The new fold continues until bot, unless we find the
+		    // end earlier.
 		    fp->fd_top = firstlnum;
 		    fp->fd_len = bot - firstlnum + 1;
-		    /* When the containing fold is open, the new fold is open.
-		     * The new fold is closed if the fold above it is closed.
-		     * The first fold depends on the containing fold. */
+		    // When the containing fold is open, the new fold is open.
+		    // The new fold is closed if the fold above it is closed.
+		    // The first fold depends on the containing fold.
 		    if (topflags == FD_OPEN)
 		    {
 			flp->wp->w_fold_manual = TRUE;
@@ -2649,8 +2647,8 @@
 		    else
 			fp->fd_flags = (fp - 1)->fd_flags;
 		    fp->fd_small = MAYBE;
-		    /* If using the "marker", "expr" or "syntax" method, we
-		     * need to continue until the end of the fold is found. */
+		    // If using the "marker", "expr" or "syntax" method, we
+		    // need to continue until the end of the fold is found.
 		    if (getlevel == foldlevelMarker
 			    || getlevel == foldlevelExpr
 			    || getlevel == foldlevelSyntax)
@@ -2679,12 +2677,12 @@
 	    /*
 	     * There is a nested fold, handle it recursively.
 	     */
-	    /* At least do one line (can happen when finish is TRUE). */
+	    // At least do one line (can happen when finish is TRUE).
 	    if (bot < flp->lnum)
 		bot = flp->lnum;
 
-	    /* Line numbers in the nested fold are relative to the start of
-	     * this fold. */
+	    // Line numbers in the nested fold are relative to the start of
+	    // this fold.
 	    flp->lnum = flp->lnum_save - fp->fd_top;
 	    flp->off += fp->fd_top;
 	    i = (int)(fp - (fold_T *)gap->ga_data);
@@ -2698,7 +2696,7 @@
 	    bot += fp->fd_top;
 	    startlnum2 = flp->lnum;
 
-	    /* This fold may end at the same line, don't incr. flp->lnum. */
+	    // This fold may end at the same line, don't incr. flp->lnum.
 	}
 	else
 	{
@@ -2712,7 +2710,7 @@
 	    ll = flp->lnum + 1;
 	    while (!got_int)
 	    {
-		/* Make the previous level available to foldlevel(). */
+		// Make the previous level available to foldlevel().
 		prev_lnum = flp->lnum;
 		prev_lnum_lvl = flp->lvl;
 
@@ -2727,14 +2725,14 @@
 	    if (flp->lnum > linecount)
 		break;
 
-	    /* leave flp->lnum_save to lnum of the line that was used to get
-	     * the level, flp->lnum to the lnum of the next line. */
+	    // leave flp->lnum_save to lnum of the line that was used to get
+	    // the level, flp->lnum to the lnum of the next line.
 	    flp->lnum_save = flp->lnum;
 	    flp->lnum = ll;
 	}
     }
 
-    if (fp == NULL)	/* only happens when got_int is set */
+    if (fp == NULL)	// only happens when got_int is set
 	return bot;
 
     /*
@@ -2761,25 +2759,25 @@
 
     if (lvl < level)
     {
-	/* End of fold found, update the length when it got shorter. */
+	// End of fold found, update the length when it got shorter.
 	if (fp->fd_len != flp->lnum - fp->fd_top)
 	{
 	    if (fp->fd_top + fp->fd_len - 1 > bot)
 	    {
-		/* fold continued below bot */
+		// fold continued below bot
 		if (getlevel == foldlevelMarker
 			|| getlevel == foldlevelExpr
 			|| getlevel == foldlevelSyntax)
 		{
-		    /* marker method: truncate the fold and make sure the
-		     * previously included lines are processed again */
+		    // marker method: truncate the fold and make sure the
+		    // previously included lines are processed again
 		    bot = fp->fd_top + fp->fd_len - 1;
 		    fp->fd_len = flp->lnum - fp->fd_top;
 		}
 		else
 		{
-		    /* indent or expr method: split fold to create a new one
-		     * below bot */
+		    // indent or expr method: split fold to create a new one
+		    // below bot
 		    i = (int)(fp - (fold_T *)gap->ga_data);
 		    foldSplit(gap, i, flp->lnum, bot);
 		    fp = (fold_T *)gap->ga_data + i;
@@ -2791,7 +2789,7 @@
 	}
     }
 
-    /* delete following folds that end before the current line */
+    // delete following folds that end before the current line
     for (;;)
     {
 	fp2 = fp + 1;
@@ -2802,7 +2800,7 @@
 	{
 	    if (fp2->fd_top < flp->lnum)
 	    {
-		/* Make fold that includes lnum start at lnum. */
+		// Make fold that includes lnum start at lnum.
 		foldMarkAdjustRecurse(&fp2->fd_nested,
 			(linenr_T)0, (long)(flp->lnum - fp2->fd_top - 1),
 			(linenr_T)MAXLNUM, (long)(fp2->fd_top - flp->lnum));
@@ -2813,7 +2811,7 @@
 
 	    if (lvl >= level)
 	    {
-		/* merge new fold with existing fold that follows */
+		// merge new fold with existing fold that follows
 		foldMerge(fp, gap, fp2);
 	    }
 	    break;
@@ -2822,15 +2820,15 @@
 	deleteFoldEntry(gap, (int)(fp2 - (fold_T *)gap->ga_data), TRUE);
     }
 
-    /* Need to redraw the lines we inspected, which might be further down than
-     * was asked for. */
+    // Need to redraw the lines we inspected, which might be further down than
+    // was asked for.
     if (bot < flp->lnum - 1)
 	bot = flp->lnum - 1;
 
     return bot;
 }
 
-/* foldInsert() {{{2 */
+// foldInsert() {{{2
 /*
  * Insert a new fold in "gap" at position "i".
  * Returns OK for success, FAIL for failure.
@@ -2850,7 +2848,7 @@
     return OK;
 }
 
-/* foldSplit() {{{2 */
+// foldSplit() {{{2
 /*
  * Split the "i"th fold in "gap", which starts before "top" and ends below
  * "bot" in two pieces, one ending above "top" and the other starting below
@@ -2872,7 +2870,7 @@
     int		idx;
     int		len;
 
-    /* The fold continues below bot, need to split it. */
+    // The fold continues below bot, need to split it.
     if (foldInsert(gap, i + 1) == FAIL)
 	return;
     fp = (fold_T *)gap->ga_data + i;
@@ -2882,8 +2880,8 @@
     fp[1].fd_small = MAYBE;
     fp->fd_small = MAYBE;
 
-    /* Move nested folds below bot to new fold.  There can't be
-     * any between top and bot, they have been removed by the caller. */
+    // Move nested folds below bot to new fold.  There can't be
+    // any between top and bot, they have been removed by the caller.
     gap1 = &fp->fd_nested;
     gap2 = &fp[1].fd_nested;
     (void)(foldFind(gap1, bot + 1 - fp->fd_top, &fp2));
@@ -2903,7 +2901,7 @@
     fold_changed = TRUE;
 }
 
-/* foldRemove() {{{2 */
+// foldRemove() {{{2
 /*
  * Remove folds within the range "top" to and including "bot".
  * Check for these situations:
@@ -2928,23 +2926,23 @@
     fold_T	*fp = NULL;
 
     if (bot < top)
-	return;		/* nothing to do */
+	return;		// nothing to do
 
     for (;;)
     {
-	/* Find fold that includes top or a following one. */
+	// Find fold that includes top or a following one.
 	if (foldFind(gap, top, &fp) && fp->fd_top < top)
 	{
-	    /* 2: or 3: need to delete nested folds */
+	    // 2: or 3: need to delete nested folds
 	    foldRemove(&fp->fd_nested, top - fp->fd_top, bot - fp->fd_top);
 	    if (fp->fd_top + fp->fd_len - 1 > bot)
 	    {
-		/* 3: need to split it. */
+		// 3: need to split it.
 		foldSplit(gap, (int)(fp - (fold_T *)gap->ga_data), top, bot);
 	    }
 	    else
 	    {
-		/* 2: truncate fold at "top". */
+		// 2: truncate fold at "top".
 		fp->fd_len = top - fp->fd_top;
 	    }
 	    fold_changed = TRUE;
@@ -2953,16 +2951,16 @@
 	if (fp >= (fold_T *)(gap->ga_data) + gap->ga_len
 		|| fp->fd_top > bot)
 	{
-	    /* 6: Found a fold below bot, can stop looking. */
+	    // 6: Found a fold below bot, can stop looking.
 	    break;
 	}
 	if (fp->fd_top >= top)
 	{
-	    /* Found an entry below top. */
+	    // Found an entry below top.
 	    fold_changed = TRUE;
 	    if (fp->fd_top + fp->fd_len - 1 > bot)
 	    {
-		/* 5: Make fold that includes bot start below bot. */
+		// 5: Make fold that includes bot start below bot.
 		foldMarkAdjustRecurse(&fp->fd_nested,
 			(linenr_T)0, (long)(bot - fp->fd_top),
 			(linenr_T)MAXLNUM, (long)(fp->fd_top - bot - 1));
@@ -2971,13 +2969,13 @@
 		break;
 	    }
 
-	    /* 4: Delete completely contained fold. */
+	    // 4: Delete completely contained fold.
 	    deleteFoldEntry(gap, (int)(fp - (fold_T *)gap->ga_data), TRUE);
 	}
     }
 }
 
-/* foldReverseOrder() {{{2 */
+// foldReverseOrder() {{{2
     static void
 foldReverseOrder(garray_T *gap, linenr_T start_arg, linenr_T end_arg)
 {
@@ -2996,7 +2994,7 @@
     }
 }
 
-/* foldMoveRange() {{{2 */
+// foldMoveRange() {{{2
 /*
  * Move folds within the inclusive range "line1" to "line2" to after "dest"
  * requires "line1" <= "line2" <= "dest"
@@ -3054,49 +3052,46 @@
     {
 	if (fold_end(fp) > dest)
 	{
-	    /* Case 4
-	    * don't have to change this fold, but have to move nested folds.
-	    */
+	    // Case 4
+	   // don't have to change this fold, but have to move nested folds.
 	    foldMoveRange(&fp->fd_nested, line1 - fp->fd_top, line2 -
 		    fp->fd_top, dest - fp->fd_top);
 	    return;
 	}
 	else if (fold_end(fp) > line2)
 	{
-	    /* Case 3
-	     * Remove nested folds between line1 and line2 & reduce the
-	     * length of fold by "range_len".
-	     * Folds after this one must be dealt with.
-	     */
+	    // Case 3
+	    // Remove nested folds between line1 and line2 & reduce the
+	    // length of fold by "range_len".
+	    // Folds after this one must be dealt with.
 	    foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top, line2 -
 		    fp->fd_top, MAXLNUM, -range_len);
 	    fp->fd_len -= range_len;
 	}
 	else
-	    /* Case 2 truncate fold, folds after this one must be dealt with. */
+	    // Case 2 truncate fold, folds after this one must be dealt with.
 	    truncate_fold(fp, line1 - 1);
 
-	/* Look at the next fold, and treat that one as if it were the first
-	 * after  "line1" (because now it is). */
+	// Look at the next fold, and treat that one as if it were the first
+	// after  "line1" (because now it is).
 	fp = fp + 1;
     }
 
     if (!valid_fold(fp, gap) || fp->fd_top > dest)
     {
-	/* Case 10
-	 * No folds after "line1" and before "dest"
-	 */
+	// Case 10
+	// No folds after "line1" and before "dest"
 	return;
     }
     else if (fp->fd_top > line2)
     {
 	for (; valid_fold(fp, gap) && fold_end(fp) <= dest; fp++)
-	/* Case 9. (for all case 9's) -- shift up. */
+	// Case 9. (for all case 9's) -- shift up.
 	    fp->fd_top -= range_len;
 
 	if (valid_fold(fp, gap) && fp->fd_top <= dest)
 	{
-	    /* Case 8. -- ensure truncated at dest, shift up */
+	    // Case 8. -- ensure truncated at dest, shift up
 	    truncate_fold(fp, dest);
 	    fp->fd_top -= range_len;
 	}
@@ -3104,7 +3099,7 @@
     }
     else if (fold_end(fp) > dest)
     {
-	/* Case 7 -- remove nested folds and shrink */
+	// Case 7 -- remove nested folds and shrink
 	foldMarkAdjustRecurse(&fp->fd_nested, line2 + 1 - fp->fd_top, dest -
 		fp->fd_top, MAXLNUM, -move_len);
 	fp->fd_len -= move_len;
@@ -3112,26 +3107,25 @@
 	return;
     }
 
-    /* Case 5 or 6
-     * changes rely on whether there are folds between the end of
-     * this fold and "dest".
-     */
+    // Case 5 or 6
+    // changes rely on whether there are folds between the end of
+    // this fold and "dest".
     move_start = fold_index(fp, gap);
 
     for (; valid_fold(fp, gap) && fp->fd_top <= dest; fp++)
     {
 	if (fp->fd_top <= line2)
 	{
-	    /* 1. 2. or 3. */
+	    // 1. 2. or 3.
 	    if (fold_end(fp) > line2)
-		/* 2. or 3., truncate before moving */
+		// 2. or 3., truncate before moving
 		truncate_fold(fp, line2);
 
 	    fp->fd_top += move_len;
 	    continue;
 	}
 
-	/* Record index of the first fold after the moved range. */
+	// Record index of the first fold after the moved range.
 	if (move_end == 0)
 	    move_end = fold_index(fp, gap);
 
@@ -3149,8 +3143,8 @@
      * range [move_start, move_end).
      */
     if (move_end == 0)
-	/* There are no folds after those moved, hence no folds have been moved
-	 * out of order. */
+	// There are no folds after those moved, hence no folds have been moved
+	// out of order.
 	return;
     foldReverseOrder(gap, (linenr_T)move_start, (linenr_T)dest_index - 1);
     foldReverseOrder(gap, (linenr_T)move_start,
@@ -3162,7 +3156,7 @@
 #undef valid_fold
 #undef fold_index
 
-/* foldMerge() {{{2 */
+// foldMerge() {{{2
 /*
  * Merge two adjacent folds (and the nested ones in them).
  * This only works correctly when the folds are really adjacent!  Thus "fp1"
@@ -3179,12 +3173,12 @@
     garray_T	*gap1 = &fp1->fd_nested;
     garray_T	*gap2 = &fp2->fd_nested;
 
-    /* If the last nested fold in fp1 touches the first nested fold in fp2,
-     * merge them recursively. */
+    // If the last nested fold in fp1 touches the first nested fold in fp2,
+    // merge them recursively.
     if (foldFind(gap1, fp1->fd_len - 1L, &fp3) && foldFind(gap2, 0L, &fp4))
 	foldMerge(fp3, gap2, fp4);
 
-    /* Move nested folds in fp2 to the end of fp1. */
+    // Move nested folds in fp2 to the end of fp1.
     if (gap2->ga_len > 0 && ga_grow(gap1, gap2->ga_len) == OK)
     {
 	for (idx = 0; idx < gap2->ga_len; ++idx)
@@ -3202,7 +3196,7 @@
     fold_changed = TRUE;
 }
 
-/* foldlevelIndent() {{{2 */
+// foldlevelIndent() {{{2
 /*
  * Low level function to get the foldlevel for the "indent" method.
  * Doesn't use any caching.
@@ -3218,11 +3212,11 @@
     buf = flp->wp->w_buffer;
     s = skipwhite(ml_get_buf(buf, lnum, FALSE));
 
-    /* empty line or lines starting with a character in 'foldignore': level
-     * depends on surrounding lines */
+    // empty line or lines starting with a character in 'foldignore': level
+    // depends on surrounding lines
     if (*s == NUL || vim_strchr(flp->wp->w_p_fdi, *s) != NULL)
     {
-	/* first and last line can't be undefined, use level 0 */
+	// first and last line can't be undefined, use level 0
 	if (lnum == 1 || lnum == buf->b_ml.ml_line_count)
 	    flp->lvl = 0;
 	else
@@ -3238,7 +3232,7 @@
     }
 }
 
-/* foldlevelDiff() {{{2 */
+// foldlevelDiff() {{{2
 #ifdef FEAT_DIFF
 /*
  * Low level function to get the foldlevel for the "diff" method.
@@ -3254,7 +3248,7 @@
 }
 #endif
 
-/* foldlevelExpr() {{{2 */
+// foldlevelExpr() {{{2
 /*
  * Low level function to get the foldlevel for the "expr" method.
  * Doesn't use any caching.
@@ -3284,15 +3278,15 @@
     if (lnum <= 1)
 	flp->lvl = 0;
 
-    /* KeyTyped may be reset to 0 when calling a function which invokes
-     * do_cmdline().  To make 'foldopen' work correctly restore KeyTyped. */
+    // KeyTyped may be reset to 0 when calling a function which invokes
+    // do_cmdline().  To make 'foldopen' work correctly restore KeyTyped.
     save_keytyped = KeyTyped;
     n = (int)eval_foldexpr(flp->wp->w_p_fde, &c);
     KeyTyped = save_keytyped;
 
     switch (c)
     {
-	/* "a1", "a2", .. : add to the fold level */
+	// "a1", "a2", .. : add to the fold level
 	case 'a': if (flp->lvl >= 0)
 		  {
 		      flp->lvl += n;
@@ -3301,7 +3295,7 @@
 		  flp->start = n;
 		  break;
 
-	/* "s1", "s2", .. : subtract from the fold level */
+	// "s1", "s2", .. : subtract from the fold level
 	case 's': if (flp->lvl >= 0)
 		  {
 		      if (n > flp->lvl)
@@ -3312,25 +3306,25 @@
 		  }
 		  break;
 
-	/* ">1", ">2", .. : start a fold with a certain level */
+	// ">1", ">2", .. : start a fold with a certain level
 	case '>': flp->lvl = n;
 		  flp->lvl_next = n;
 		  flp->start = 1;
 		  break;
 
-	/* "<1", "<2", .. : end a fold with a certain level */
+	// "<1", "<2", .. : end a fold with a certain level
 	case '<': flp->lvl_next = n - 1;
 		  flp->end = n;
 		  break;
 
-	/* "=": No change in level */
+	// "=": No change in level
 	case '=': flp->lvl_next = flp->lvl;
 		  break;
 
-	/* "-1", "0", "1", ..: set fold level */
+	// "-1", "0", "1", ..: set fold level
 	default:  if (n < 0)
-		      /* Use the current level for the next line, so that "a1"
-		       * will work there. */
+		      // Use the current level for the next line, so that "a1"
+		      // will work there.
 		      flp->lvl_next = flp->lvl;
 		  else
 		      flp->lvl_next = n;
@@ -3338,8 +3332,8 @@
 		  break;
     }
 
-    /* If the level is unknown for the first or the last line in the file, use
-     * level 0. */
+    // If the level is unknown for the first or the last line in the file, use
+    // level 0.
     if (flp->lvl < 0)
     {
 	if (lnum <= 1)
@@ -3356,7 +3350,7 @@
 #endif
 }
 
-/* parseMarker() {{{2 */
+// parseMarker() {{{2
 /*
  * Parse 'foldmarker' and set "foldendmarker", "foldstartmarkerlen" and
  * "foldendmarkerlen".
@@ -3370,7 +3364,7 @@
     foldendmarkerlen = (int)STRLEN(foldendmarker);
 }
 
-/* foldlevelMarker() {{{2 */
+// foldlevelMarker() {{{2
 /*
  * Low level function to get the foldlevel for the "marker" method.
  * "foldendmarker", "foldstartmarkerlen" and "foldendmarkerlen" must have been
@@ -3390,13 +3384,13 @@
     char_u	*s;
     int		n;
 
-    /* cache a few values for speed */
+    // cache a few values for speed
     startmarker = flp->wp->w_p_fmr;
     cstart = *startmarker;
     ++startmarker;
     cend = *foldendmarker;
 
-    /* Default: no start found, next level is same as current level */
+    // Default: no start found, next level is same as current level
     flp->start = 0;
     flp->lvl_next = flp->lvl;
 
@@ -3406,7 +3400,7 @@
 	if (*s == cstart
 		  && STRNCMP(s + 1, startmarker, foldstartmarkerlen - 1) == 0)
 	{
-	    /* found startmarker: set flp->lvl */
+	    // found startmarker: set flp->lvl
 	    s += foldstartmarkerlen;
 	    if (VIM_ISDIGIT(*s))
 	    {
@@ -3431,7 +3425,7 @@
 	else if (*s == cend
 	      && STRNCMP(s + 1, foldendmarker + 1, foldendmarkerlen - 1) == 0)
 	{
-	    /* found endmarker: set flp->lvl_next */
+	    // found endmarker: set flp->lvl_next
 	    s += foldendmarkerlen;
 	    if (VIM_ISDIGIT(*s))
 	    {
@@ -3440,7 +3434,7 @@
 		{
 		    flp->lvl = n;
 		    flp->lvl_next = n - 1;
-		    /* never start a fold with an end marker */
+		    // never start a fold with an end marker
 		    if (flp->lvl_next > start_lvl)
 			flp->lvl_next = start_lvl;
 		}
@@ -3452,12 +3446,12 @@
 	    MB_PTR_ADV(s);
     }
 
-    /* The level can't go negative, must be missing a start marker. */
+    // The level can't go negative, must be missing a start marker.
     if (flp->lvl_next < 0)
 	flp->lvl_next = 0;
 }
 
-/* foldlevelSyntax() {{{2 */
+// foldlevelSyntax() {{{2
 /*
  * Low level function to get the foldlevel for the "syntax" method.
  * Doesn't use any caching.
@@ -3472,7 +3466,7 @@
     linenr_T	lnum = flp->lnum + flp->off;
     int		n;
 
-    /* Use the maximum fold level at the start of this line and the next. */
+    // Use the maximum fold level at the start of this line and the next.
     flp->lvl = syn_get_foldlevel(flp->wp, lnum);
     flp->start = 0;
     if (lnum < flp->wp->w_buffer->b_ml.ml_line_count)
@@ -3480,15 +3474,15 @@
 	n = syn_get_foldlevel(flp->wp, lnum + 1);
 	if (n > flp->lvl)
 	{
-	    flp->start = n - flp->lvl;	/* fold(s) start here */
+	    flp->start = n - flp->lvl;	// fold(s) start here
 	    flp->lvl = n;
 	}
     }
 #endif
 }
 
-/* functions for storing the fold state in a View {{{1 */
-/* put_folds() {{{2 */
+// functions for storing the fold state in a View {{{1
+// put_folds() {{{2
 #if defined(FEAT_SESSION) || defined(PROTO)
 static int put_folds_recurse(FILE *fd, garray_T *gap, linenr_T off);
 static int put_foldopen_recurse(FILE *fd, win_T *wp, garray_T *gap, linenr_T off);
@@ -3508,14 +3502,14 @@
 	    return FAIL;
     }
 
-    /* If some folds are manually opened/closed, need to restore that. */
+    // If some folds are manually opened/closed, need to restore that.
     if (wp->w_fold_manual)
 	return put_foldopen_recurse(fd, wp, &wp->w_folds, (linenr_T)0);
 
     return OK;
 }
 
-/* put_folds_recurse() {{{2 */
+// put_folds_recurse() {{{2
 /*
  * Write commands to "fd" to recreate manually created folds.
  * Returns FAIL when writing failed.
@@ -3529,7 +3523,7 @@
     fp = (fold_T *)gap->ga_data;
     for (i = 0; i < gap->ga_len; i++)
     {
-	/* Do nested folds first, they will be created closed. */
+	// Do nested folds first, they will be created closed.
 	if (put_folds_recurse(fd, &fp->fd_nested, off + fp->fd_top) == FAIL)
 	    return FAIL;
 	if (fprintf(fd, "%ld,%ldfold", fp->fd_top + off,
@@ -3541,7 +3535,7 @@
     return OK;
 }
 
-/* put_foldopen_recurse() {{{2 */
+// put_foldopen_recurse() {{{2
 /*
  * Write commands to "fd" to open and close manually opened/closed folds.
  * Returns FAIL when writing failed.
@@ -3564,7 +3558,7 @@
 	{
 	    if (fp->fd_nested.ga_len > 0)
 	    {
-		/* open nested folds while this fold is open */
+		// open nested folds while this fold is open
 		if (fprintf(fd, "%ld", fp->fd_top + off) < 0
 			|| put_eol(fd) == FAIL
 			|| put_line(fd, "normal! zo") == FAIL)
@@ -3573,7 +3567,7 @@
 							     off + fp->fd_top)
 			== FAIL)
 		    return FAIL;
-		/* close the parent when needed */
+		// close the parent when needed
 		if (fp->fd_flags == FD_CLOSED)
 		{
 		    if (put_fold_open_close(fd, fp, off) == FAIL)
@@ -3582,9 +3576,9 @@
 	    }
 	    else
 	    {
-		/* Open or close the leaf according to the window foldlevel.
-		 * Do not close a leaf that is already closed, as it will close
-		 * the parent. */
+		// Open or close the leaf according to the window foldlevel.
+		// Do not close a leaf that is already closed, as it will close
+		// the parent.
 		level = foldLevelWin(wp, off + fp->fd_top);
 		if ((fp->fd_flags == FD_CLOSED && wp->w_p_fdl >= level)
 			|| (fp->fd_flags != FD_CLOSED && wp->w_p_fdl < level))
@@ -3598,7 +3592,7 @@
     return OK;
 }
 
-/* put_fold_open_close() {{{2 */
+// put_fold_open_close() {{{2
 /*
  * Write the open or close command to "fd".
  * Returns FAIL when writing failed.
@@ -3615,9 +3609,9 @@
 
     return OK;
 }
-#endif /* FEAT_SESSION */
+#endif // FEAT_SESSION
 
-/* }}}1 */
+// }}}1
 #endif // defined(FEAT_FOLDING) || defined(PROTO)
 
 #if defined(FEAT_EVAL) || defined(PROTO)
