diff --git a/src/eval.c b/src/eval.c
index c37d6fd..178f473 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -36,19 +36,19 @@
  */
 static int current_copyID = 0;
 
-static int echo_attr = 0;   /* attributes used for ":echo" */
+static int echo_attr = 0;   // attributes used for ":echo"
 
 /*
  * Info used by a ":for" loop.
  */
 typedef struct
 {
-    int		fi_semicolon;	/* TRUE if ending in '; var]' */
-    int		fi_varcount;	/* nr of variables in the list */
-    listwatch_T	fi_lw;		/* keep an eye on the item used. */
-    list_T	*fi_list;	/* list being used */
-    int		fi_bi;		/* index of blob */
-    blob_T	*fi_blob;	/* blob being used */
+    int		fi_semicolon;	// TRUE if ending in '; var]'
+    int		fi_varcount;	// nr of variables in the list
+    listwatch_T	fi_lw;		// keep an eye on the item used.
+    list_T	*fi_list;	// list being used
+    int		fi_bi;		// index of blob
+    blob_T	*fi_blob;	// blob being used
 } forinfo_T;
 
 static int tv_op(typval_T *tv1, typval_T *tv2, char_u  *op);
@@ -174,7 +174,7 @@
     char_u	*arg,
     int		*error,
     char_u	**nextcmd,
-    int		skip)	    /* only parse, don't execute */
+    int		skip)	    // only parse, don't execute
 {
     typval_T	tv;
     varnumber_T	retval = FALSE;
@@ -261,7 +261,7 @@
 	s = skipwhite(s);
 	if (eval1_emsg(&s, rettv, TRUE) == FAIL)
 	    return FAIL;
-	if (*s != NUL)  /* check for trailing chars after expr */
+	if (*s != NUL)  // check for trailing chars after expr
 	{
 	    clear_tv(rettv);
 	    semsg(_(e_invexpr2), s);
@@ -300,7 +300,7 @@
 eval_to_string_skip(
     char_u	*arg,
     char_u	**nextcmd,
-    int		skip)	    /* only parse, don't execute */
+    int		skip)	    // only parse, don't execute
 {
     typval_T	tv;
     char_u	*retval;
@@ -467,7 +467,7 @@
     int		ret;
     funcexe_T	funcexe;
 
-    rettv->v_type = VAR_UNKNOWN;		/* clear_tv() uses this */
+    rettv->v_type = VAR_UNKNOWN;		// clear_tv() uses this
     vim_memset(&funcexe, 0, sizeof(funcexe));
     funcexe.firstline = curwin->w_cursor.lnum;
     funcexe.lastline = curwin->w_cursor.lnum;
@@ -574,15 +574,15 @@
 	retval = 0;
     else
     {
-	/* If the result is a number, just return the number. */
+	// If the result is a number, just return the number.
 	if (tv.v_type == VAR_NUMBER)
 	    retval = tv.vval.v_number;
 	else if (tv.v_type != VAR_STRING || tv.vval.v_string == NULL)
 	    retval = 0;
 	else
 	{
-	    /* If the result is a string, check if there is a non-digit before
-	     * the number. */
+	    // If the result is a string, check if there is a non-digit before
+	    // the number.
 	    s = tv.vval.v_string;
 	    if (!VIM_ISDIGIT(*s) && *s != '-')
 		*cp = *s++;
@@ -625,8 +625,8 @@
     lval_T	*lp,
     int		unlet,
     int		skip,
-    int		flags,	    /* GLV_ values */
-    int		fne_flags)  /* flags for find_name_end() */
+    int		flags,	    // GLV_ values
+    int		fne_flags)  // flags for find_name_end()
 {
     char_u	*p;
     char_u	*expr_start, *expr_end;
@@ -641,21 +641,21 @@
     hashtab_T	*ht;
     int		quiet = flags & GLV_QUIET;
 
-    /* Clear everything in "lp". */
+    // Clear everything in "lp".
     vim_memset(lp, 0, sizeof(lval_T));
 
     if (skip)
     {
-	/* When skipping just find the end of the name. */
+	// When skipping just find the end of the name.
 	lp->ll_name = name;
 	return find_name_end(name, NULL, NULL, FNE_INCL_BR | fne_flags);
     }
 
-    /* Find the end of the name. */
+    // Find the end of the name.
     p = find_name_end(name, &expr_start, &expr_end, fne_flags);
     if (expr_start != NULL)
     {
-	/* Don't expand the name when we already know there is an error. */
+	// Don't expand the name when we already know there is an error.
 	if (unlet && !VIM_ISWHITE(*p) && !ends_excmd(*p)
 						    && *p != '[' && *p != '.')
 	{
@@ -666,9 +666,9 @@
 	lp->ll_exp_name = make_expanded_name(name, expr_start, expr_end, p);
 	if (lp->ll_exp_name == NULL)
 	{
-	    /* Report an invalid expression in braces, unless the
-	     * expression evaluation has been cancelled due to an
-	     * aborting error, an interrupt, or an exception. */
+	    // Report an invalid expression in braces, unless the
+	    // expression evaluation has been cancelled due to an
+	    // aborting error, an interrupt, or an exception.
 	    if (!aborting() && !quiet)
 	    {
 		emsg_severe = TRUE;
@@ -681,14 +681,14 @@
     else
 	lp->ll_name = name;
 
-    /* Without [idx] or .key we are done. */
+    // Without [idx] or .key we are done.
     if ((*p != '[' && *p != '.') || lp->ll_name == NULL)
 	return p;
 
     cc = *p;
     *p = NUL;
-    /* Only pass &ht when we would write to the variable, it prevents autoload
-     * as well. */
+    // Only pass &ht when we would write to the variable, it prevents autoload
+    // as well.
     v = find_var(lp->ll_name, (flags & GLV_READ_ONLY) ? NULL : &ht,
 						      flags & GLV_NO_AUTOLOAD);
     if (v == NULL && !quiet)
@@ -738,24 +738,24 @@
 	}
 	else
 	{
-	    /* Get the index [expr] or the first index [expr: ]. */
+	    // Get the index [expr] or the first index [expr: ].
 	    p = skipwhite(p + 1);
 	    if (*p == ':')
 		empty1 = TRUE;
 	    else
 	    {
 		empty1 = FALSE;
-		if (eval1(&p, &var1, TRUE) == FAIL)	/* recursive! */
+		if (eval1(&p, &var1, TRUE) == FAIL)	// recursive!
 		    return NULL;
 		if (tv_get_string_chk(&var1) == NULL)
 		{
-		    /* not a number or string */
+		    // not a number or string
 		    clear_tv(&var1);
 		    return NULL;
 		}
 	    }
 
-	    /* Optionally get the second index [ :expr]. */
+	    // Optionally get the second index [ :expr].
 	    if (*p == ':')
 	    {
 		if (lp->ll_tv->v_type == VAR_DICT)
@@ -782,14 +782,14 @@
 		else
 		{
 		    lp->ll_empty2 = FALSE;
-		    if (eval1(&p, &var2, TRUE) == FAIL)	/* recursive! */
+		    if (eval1(&p, &var2, TRUE) == FAIL)	// recursive!
 		    {
 			clear_tv(&var1);
 			return NULL;
 		    }
 		    if (tv_get_string_chk(&var2) == NULL)
 		    {
-			/* not a number or string */
+			// not a number or string
 			clear_tv(&var1);
 			clear_tv(&var2);
 			return NULL;
@@ -809,7 +809,7 @@
 		return NULL;
 	    }
 
-	    /* Skip to past ']'. */
+	    // Skip to past ']'.
 	    ++p;
 	}
 
@@ -817,8 +817,8 @@
 	{
 	    if (len == -1)
 	    {
-		/* "[key]": get key from "var1" */
-		key = tv_get_string_chk(&var1);	/* is number or string */
+		// "[key]": get key from "var1"
+		key = tv_get_string_chk(&var1);	// is number or string
 		if (key == NULL)
 		{
 		    clear_tv(&var1);
@@ -829,9 +829,9 @@
 	    lp->ll_dict = lp->ll_tv->vval.v_dict;
 	    lp->ll_di = dict_find(lp->ll_dict, key, len);
 
-	    /* When assigning to a scope dictionary check that a function and
-	     * variable name is valid (only variable name unless it is l: or
-	     * g: dictionary). Disallow overwriting a builtin function. */
+	    // When assigning to a scope dictionary check that a function and
+	    // variable name is valid (only variable name unless it is l: or
+	    // g: dictionary). Disallow overwriting a builtin function.
 	    if (rettv != NULL && lp->ll_dict->dv_scope != 0)
 	    {
 		int prevval;
@@ -843,7 +843,7 @@
 		    key[len] = NUL;
 		}
 		else
-		    prevval = 0; /* avoid compiler warning */
+		    prevval = 0; // avoid compiler warning
 		wrong = (lp->ll_dict->dv_scope == VAR_DEF_SCOPE
 			       && rettv->v_type == VAR_FUNC
 			       && var_check_func_name(key, lp->ll_di == NULL))
@@ -882,7 +882,7 @@
 		    p = NULL;
 		break;
 	    }
-	    /* existing variable, need to check if it can be changed */
+	    // existing variable, need to check if it can be changed
 	    else if ((flags & GLV_READ_ONLY) == 0
 			     && var_check_ro(lp->ll_di->di_flags, name, FALSE))
 	    {
@@ -941,7 +941,7 @@
 	    if (empty1)
 		lp->ll_n1 = 0;
 	    else
-		/* is number or string */
+		// is number or string
 		lp->ll_n1 = (long)tv_get_number(&var1);
 	    clear_tv(&var1);
 
@@ -973,7 +973,7 @@
 	    if (lp->ll_range && !lp->ll_empty2)
 	    {
 		lp->ll_n2 = (long)tv_get_number(&var2);
-						    /* is number or string */
+						    // is number or string
 		clear_tv(&var2);
 		if (lp->ll_n2 < 0)
 		{
@@ -987,7 +987,7 @@
 		    lp->ll_n2 = list_idx_of_item(lp->ll_list, ni);
 		}
 
-		/* Check that lp->ll_n2 isn't before lp->ll_n1. */
+		// Check that lp->ll_n2 isn't before lp->ll_n1.
 		if (lp->ll_n1 < 0)
 		    lp->ll_n1 = list_idx_of_item(lp->ll_list, lp->ll_li);
 		if (lp->ll_n2 < lp->ll_n1)
@@ -1164,7 +1164,7 @@
 		break;
 	    if (lp->ll_li->li_next == NULL)
 	    {
-		/* Need to add an empty item. */
+		// Need to add an empty item.
 		if (list_append_number(lp->ll_list, 0) == FAIL)
 		{
 		    ri = NULL;
@@ -1199,7 +1199,7 @@
 		return;
 	    }
 
-	    /* Need to add an item to the Dictionary. */
+	    // Need to add an item to the Dictionary.
 	    di = dictitem_alloc(lp->ll_newkey);
 	    if (di == NULL)
 		return;
@@ -1244,7 +1244,7 @@
     char_u	numbuf[NUMBUFLEN];
     char_u	*s;
 
-    /* Can't do anything with a Funcref, Dict, v:true on the right. */
+    // Can't do anything with a Funcref, Dict, v:true on the right.
     if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT
 						&& tv2->v_type != VAR_SPECIAL)
     {
@@ -1386,7 +1386,7 @@
     typval_T	tv;
     list_T	*l;
 
-    *errp = TRUE;	/* default: there is an error */
+    *errp = TRUE;	// default: there is an error
 
     fi = ALLOC_CLEAR_ONE(forinfo_T);
     if (fi == NULL)
@@ -1526,7 +1526,7 @@
 	xp->xp_context = EXPAND_USER_VARS;
 	if (vim_strpbrk(arg, (char_u *)"\"'+-*/%.=!?~|&$([<>,#") == NULL)
 	{
-	    /* ":let var1 var2 ...": find last space. */
+	    // ":let var1 var2 ...": find last space.
 	    for (p = arg + STRLEN(arg); p >= arg; )
 	    {
 		xp->xp_pattern = p;
@@ -1563,7 +1563,7 @@
 	}
 	else if (c == '$')
 	{
-	    /* environment variable */
+	    // environment variable
 	    xp->xp_context = EXPAND_ENV_VARS;
 	}
 	else if (c == '=')
@@ -1574,28 +1574,28 @@
 	else if (c == '#'
 		&& xp->xp_context == EXPAND_EXPRESSION)
 	{
-	    /* Autoload function/variable contains '#'. */
+	    // Autoload function/variable contains '#'.
 	    break;
 	}
 	else if ((c == '<' || c == '#')
 		&& xp->xp_context == EXPAND_FUNCTIONS
 		&& vim_strchr(xp->xp_pattern, '(') == NULL)
 	{
-	    /* Function name can start with "<SNR>" and contain '#'. */
+	    // Function name can start with "<SNR>" and contain '#'.
 	    break;
 	}
 	else if (cmdidx != CMD_let || got_eq)
 	{
-	    if (c == '"')	    /* string */
+	    if (c == '"')	    // string
 	    {
 		while ((c = *++xp->xp_pattern) != NUL && c != '"')
 		    if (c == '\\' && xp->xp_pattern[1] != NUL)
 			++xp->xp_pattern;
 		xp->xp_context = EXPAND_NOTHING;
 	    }
-	    else if (c == '\'')	    /* literal string */
+	    else if (c == '\'')	    // literal string
 	    {
-		/* Trick: '' is like stopping and starting a literal string. */
+		// Trick: '' is like stopping and starting a literal string.
 		while ((c = *++xp->xp_pattern) != NUL && c != '\'')
 		    /* skip */ ;
 		xp->xp_context = EXPAND_NOTHING;
@@ -1614,8 +1614,8 @@
 		xp->xp_context = EXPAND_EXPRESSION;
 	}
 	else
-	    /* Doesn't look like something valid, expand as an expression
-	     * anyway. */
+	    // Doesn't look like something valid, expand as an expression
+	    // anyway.
 	    xp->xp_context = EXPAND_EXPRESSION;
 	arg = xp->xp_pattern;
 	if (*arg != NUL)
@@ -1636,7 +1636,7 @@
     char_u	*save_cpo;
     regmatch_T	regmatch;
 
-    /* avoid 'l' flag in 'cpoptions' */
+    // avoid 'l' flag in 'cpoptions'
     save_cpo = p_cpo;
     p_cpo = (char_u *)"";
     regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
@@ -1672,12 +1672,12 @@
     if (!evaluate)
 	check_vars(s, len);
 
-    /* If "s" is the name of a variable of type VAR_FUNC
-     * use its contents. */
+    // If "s" is the name of a variable of type VAR_FUNC
+    // use its contents.
     s = deref_func_name(s, &len, &partial, !evaluate);
 
-    /* Need to make a copy, in case evaluating the arguments makes
-     * the name invalid. */
+    // Need to make a copy, in case evaluating the arguments makes
+    // the name invalid.
     s = vim_strsave(s);
     if (s == NULL)
 	ret = FAIL;
@@ -1696,18 +1696,18 @@
     }
     vim_free(s);
 
-    /* If evaluate is FALSE rettv->v_type was not set in
-     * get_func_tv, but it's needed in handle_subscript() to parse
-     * what follows. So set it here. */
+    // If evaluate is FALSE rettv->v_type was not set in
+    // get_func_tv, but it's needed in handle_subscript() to parse
+    // what follows. So set it here.
     if (rettv->v_type == VAR_UNKNOWN && !evaluate && **arg == '(')
     {
 	rettv->vval.v_string = NULL;
 	rettv->v_type = VAR_FUNC;
     }
 
-    /* Stop the expression evaluation when immediately
-     * aborting on error, or when an interrupt occurred or
-     * an exception was thrown but not caught. */
+    // Stop the expression evaluation when immediately
+    // aborting on error, or when an interrupt occurred or
+    // an exception was thrown but not caught.
     if (evaluate && aborting())
     {
 	if (ret == OK)
@@ -1806,7 +1806,7 @@
 	 * Get the second variable.
 	 */
 	*arg = skipwhite(*arg + 1);
-	if (eval1(arg, rettv, evaluate && result) == FAIL) /* recursive! */
+	if (eval1(arg, rettv, evaluate && result) == FAIL) // recursive!
 	    return FAIL;
 
 	/*
@@ -1824,7 +1824,7 @@
 	 * Get the third variable.
 	 */
 	*arg = skipwhite(*arg + 1);
-	if (eval1(arg, &var2, evaluate && !result) == FAIL) /* recursive! */
+	if (eval1(arg, &var2, evaluate && !result) == FAIL) // recursive!
 	{
 	    if (evaluate && result)
 		clear_tv(rettv);
@@ -1998,7 +1998,7 @@
     char_u	*p;
     int		i;
     exptype_T	type = TYPE_UNKNOWN;
-    int		type_is = FALSE;    /* TRUE for "is" and "isnot" */
+    int		type_is = FALSE;    // TRUE for "is" and "isnot"
     int		len = 2;
     int		ic;
 
@@ -2056,19 +2056,19 @@
      */
     if (type != TYPE_UNKNOWN)
     {
-	/* extra question mark appended: ignore case */
+	// extra question mark appended: ignore case
 	if (p[len] == '?')
 	{
 	    ic = TRUE;
 	    ++len;
 	}
-	/* extra '#' appended: match case */
+	// extra '#' appended: match case
 	else if (p[len] == '#')
 	{
 	    ic = FALSE;
 	    ++len;
 	}
-	/* nothing appended: use 'ignorecase' */
+	// nothing appended: use 'ignorecase'
 	else
 	    ic = p_ic;
 
@@ -2145,13 +2145,13 @@
 #endif
 		)
 	{
-	    /* For "list + ...", an illegal use of the first operand as
-	     * a number cannot be determined before evaluating the 2nd
-	     * operand: if this is also a list, all is ok.
-	     * For "something . ...", "something - ..." or "non-list + ...",
-	     * we know that the first operand needs to be a string or number
-	     * without evaluating the 2nd operand.  So check before to avoid
-	     * side effects after an error. */
+	    // For "list + ...", an illegal use of the first operand as
+	    // a number cannot be determined before evaluating the 2nd
+	    // operand: if this is also a list, all is ok.
+	    // For "something . ...", "something - ..." or "non-list + ...",
+	    // we know that the first operand needs to be a string or number
+	    // without evaluating the 2nd operand.  So check before to avoid
+	    // side effects after an error.
 	    if (evaluate && tv_get_string_chk(rettv) == NULL)
 	    {
 		clear_tv(rettv);
@@ -2178,9 +2178,9 @@
 	     */
 	    if (op == '.')
 	    {
-		s1 = tv_get_string_buf(rettv, buf1);	/* already checked */
+		s1 = tv_get_string_buf(rettv, buf1);	// already checked
 		s2 = tv_get_string_buf_chk(&var2, buf2);
-		if (s2 == NULL)		/* type error ? */
+		if (s2 == NULL)		// type error ?
 		{
 		    clear_tv(rettv);
 		    clear_tv(&var2);
@@ -2213,7 +2213,7 @@
 	    else if (op == '+' && rettv->v_type == VAR_LIST
 						   && var2.v_type == VAR_LIST)
 	    {
-		/* concatenate Lists */
+		// concatenate Lists
 		if (list_concat(rettv->vval.v_list, var2.vval.v_list,
 							       &var3) == FAIL)
 		{
@@ -2240,9 +2240,9 @@
 		    n1 = tv_get_number_chk(rettv, &error);
 		    if (error)
 		    {
-			/* This can only happen for "list + non-list".  For
-			 * "non-list + ..." or "something - ...", we returned
-			 * before evaluating the 2nd operand. */
+			// This can only happen for "list + non-list".  For
+			// "non-list + ..." or "something - ...", we returned
+			// before evaluating the 2nd operand.
 			clear_tv(rettv);
 			return FAIL;
 		    }
@@ -2275,7 +2275,7 @@
 		clear_tv(rettv);
 
 #ifdef FEAT_FLOAT
-		/* If there is a float on either side the result is a float. */
+		// If there is a float on either side the result is a float.
 		if (rettv->v_type == VAR_FLOAT || var2.v_type == VAR_FLOAT)
 		{
 		    if (op == '+')
@@ -2318,7 +2318,7 @@
     char_u	**arg,
     typval_T	*rettv,
     int		evaluate,
-    int		want_string)  /* after "." operator */
+    int		want_string)  // after "." operator
 {
     typval_T	var2;
     int		op;
@@ -2408,11 +2408,11 @@
 		else if (op == '/')
 		{
 # ifdef VMS
-		    /* VMS crashes on divide by zero, work around it */
+		    // VMS crashes on divide by zero, work around it
 		    if (f2 == 0.0)
 		    {
 			if (f1 == 0)
-			    f1 = -1 * __F_FLT_MAX - 1L;   /* similar to NaN */
+			    f1 = -1 * __F_FLT_MAX - 1L;   // similar to NaN
 			else if (f1 < 0)
 			    f1 = -1 * __F_FLT_MAX;
 			else
@@ -2421,8 +2421,8 @@
 		    else
 			f1 = f1 / f2;
 # else
-		    /* We rely on the floating point library to handle divide
-		     * by zero to result in "inf" and not a crash. */
+		    // We rely on the floating point library to handle divide
+		    // by zero to result in "inf" and not a crash.
 		    f1 = f1 / f2;
 # endif
 		}
@@ -2487,7 +2487,7 @@
     char_u	**arg,
     typval_T	*rettv,
     int		evaluate,
-    int		want_string UNUSED)	/* after "." operator */
+    int		want_string UNUSED)	// after "." operator
 {
     varnumber_T	n;
     int		len;
@@ -2542,13 +2542,13 @@
 		char_u *p;
 		int    get_float = FALSE;
 
-		/* We accept a float when the format matches
-		 * "[0-9]\+\.[0-9]\+\([eE][+-]\?[0-9]\+\)\?".  This is very
-		 * strict to avoid backwards compatibility problems.
-		 * With script version 2 and later the leading digit can be
-		 * omitted.
-		 * Don't look for a float after the "." operator, so that
-		 * ":let vers = 1.2.3" doesn't fail. */
+		// We accept a float when the format matches
+		// "[0-9]\+\.[0-9]\+\([eE][+-]\?[0-9]\+\)\?".  This is very
+		// strict to avoid backwards compatibility problems.
+		// With script version 2 and later the leading digit can be
+		// omitted.
+		// Don't look for a float after the "." operator, so that
+		// ":let vers = 1.2.3" doesn't fail.
 		if (**arg == '.')
 		    p = *arg;
 		else
@@ -2705,7 +2705,7 @@
      * nested expression: (expression).
      */
     case '(':	*arg = skipwhite(*arg + 1);
-		ret = eval1(arg, rettv, evaluate);	/* recursive! */
+		ret = eval1(arg, rettv, evaluate);	// recursive!
 		if (**arg == ')')
 		    ++*arg;
 		else if (ret == OK)
@@ -2735,7 +2735,7 @@
 	    ret = FAIL;
 	else
 	{
-	    if (**arg == '(')		/* recursive! */
+	    if (**arg == '(')		// recursive!
 		ret = eval_func(arg, s, len, rettv, evaluate, NULL);
 	    else if (evaluate)
 		ret = get_var_tv(s, len, rettv, NULL, TRUE, FALSE);
@@ -2750,8 +2750,8 @@
 
     *arg = skipwhite(*arg);
 
-    /* Handle following '[', '(' and '.' for expr[expr], expr.name,
-     * expr(expr), expr->name(expr) */
+    // Handle following '[', '(' and '.' for expr[expr], expr.name,
+    // expr(expr), expr->name(expr)
     if (ret == OK)
 	ret = handle_subscript(arg, rettv, evaluate, TRUE,
 						    start_leader, &end_leader);
@@ -2853,7 +2853,7 @@
 	functv = *rettv;
 	rettv->v_type = VAR_UNKNOWN;
 
-	/* Invoke the function.  Recursive! */
+	// Invoke the function.  Recursive!
 	if (functv.v_type == VAR_PARTIAL)
 	{
 	    pt = functv.vval.v_partial;
@@ -2874,8 +2874,8 @@
     funcexe.basetv = basetv;
     ret = get_func_tv(s, -1, rettv, arg, &funcexe);
 
-    /* Clear the funcref afterwards, so that deleting it while
-     * evaluating the arguments is possible (see test55). */
+    // Clear the funcref afterwards, so that deleting it while
+    // evaluating the arguments is possible (see test55).
     if (evaluate)
 	clear_tv(&functv);
 
@@ -2892,7 +2892,7 @@
     char_u	**arg,
     typval_T	*rettv,
     int		evaluate,
-    int		verbose)	/* give error messages */
+    int		verbose)	// give error messages
 {
     typval_T	base = *rettv;
     int		ret;
@@ -2937,7 +2937,7 @@
     char_u	**arg,
     typval_T	*rettv,
     int		evaluate,
-    int		verbose)	/* give error messages */
+    int		verbose)	// give error messages
 {
     char_u	*name;
     long	len;
@@ -2996,7 +2996,7 @@
     char_u	**arg,
     typval_T	*rettv,
     int		evaluate,
-    int		verbose)	/* give error messages */
+    int		verbose)	// give error messages
 {
     int		empty1 = FALSE, empty2 = FALSE;
     typval_T	var1, var2;
@@ -3029,7 +3029,7 @@
 	case VAR_UNKNOWN:
 	    if (evaluate)
 		return FAIL;
-	    /* FALLTHROUGH */
+	    // FALLTHROUGH
 
 	case VAR_STRING:
 	case VAR_NUMBER:
@@ -3063,11 +3063,11 @@
 	*arg = skipwhite(*arg + 1);
 	if (**arg == ':')
 	    empty1 = TRUE;
-	else if (eval1(arg, &var1, evaluate) == FAIL)	/* recursive! */
+	else if (eval1(arg, &var1, evaluate) == FAIL)	// recursive!
 	    return FAIL;
 	else if (evaluate && tv_get_string_chk(&var1) == NULL)
 	{
-	    /* not a number or string */
+	    // not a number or string
 	    clear_tv(&var1);
 	    return FAIL;
 	}
@@ -3081,7 +3081,7 @@
 	    *arg = skipwhite(*arg + 1);
 	    if (**arg == ']')
 		empty2 = TRUE;
-	    else if (eval1(arg, &var2, evaluate) == FAIL)	/* recursive! */
+	    else if (eval1(arg, &var2, evaluate) == FAIL)	// recursive!
 	    {
 		if (!empty1)
 		    clear_tv(&var1);
@@ -3089,7 +3089,7 @@
 	    }
 	    else if (evaluate && tv_get_string_chk(&var2) == NULL)
 	    {
-		/* not a number or string */
+		// not a number or string
 		if (!empty1)
 		    clear_tv(&var1);
 		clear_tv(&var2);
@@ -3097,7 +3097,7 @@
 	    }
 	}
 
-	/* Check for the ']'. */
+	// Check for the ']'.
 	if (**arg != ']')
 	{
 	    if (verbose)
@@ -3107,7 +3107,7 @@
 		clear_tv(&var2);
 	    return FAIL;
 	}
-	*arg = skipwhite(*arg + 1);	/* skip the ']' */
+	*arg = skipwhite(*arg + 1);	// skip the ']'
     }
 
     if (evaluate)
@@ -3138,7 +3138,7 @@
 	    case VAR_SPECIAL:
 	    case VAR_JOB:
 	    case VAR_CHANNEL:
-		break; /* not evaluating, skipping over subscript */
+		break; // not evaluating, skipping over subscript
 
 	    case VAR_NUMBER:
 	    case VAR_STRING:
@@ -3146,8 +3146,8 @@
 		len = (long)STRLEN(s);
 		if (range)
 		{
-		    /* The resulting variable is a substring.  If the indexes
-		     * are out of range the result is empty. */
+		    // The resulting variable is a substring.  If the indexes
+		    // are out of range the result is empty.
 		    if (n1 < 0)
 		    {
 			n1 = len + n1;
@@ -3165,9 +3165,9 @@
 		}
 		else
 		{
-		    /* The resulting variable is a string of a single
-		     * character.  If the index is too big or negative the
-		     * result is empty. */
+		    // The resulting variable is a string of a single
+		    // character.  If the index is too big or negative the
+		    // result is empty.
 		    if (n1 >= len || n1 < 0)
 			s = NULL;
 		    else
@@ -3246,8 +3246,8 @@
 		    n1 = len + n1;
 		if (!empty1 && (n1 < 0 || n1 >= len))
 		{
-		    /* For a range we allow invalid values and return an empty
-		     * list.  A list index out of range is an error. */
+		    // For a range we allow invalid values and return an empty
+		    // list.  A list index out of range is an error.
 		    if (!range)
 		    {
 			if (verbose)
@@ -3342,7 +3342,7 @@
     int
 get_option_tv(
     char_u	**arg,
-    typval_T	*rettv,	/* when NULL, only check if option exists */
+    typval_T	*rettv,	// when NULL, only check if option exists
     int		evaluate)
 {
     char_u	*option_end;
@@ -3350,7 +3350,7 @@
     char_u	*stringval;
     int		opt_type;
     int		c;
-    int		working = (**arg == '+');    /* has("+option") */
+    int		working = (**arg == '+');    // has("+option")
     int		ret = OK;
     int		opt_flags;
 
@@ -3376,7 +3376,7 @@
     opt_type = get_option_value(*arg, &numval,
 			       rettv == NULL ? NULL : &stringval, opt_flags);
 
-    if (opt_type == -3)			/* invalid name */
+    if (opt_type == -3)			// invalid name
     {
 	if (rettv != NULL)
 	    semsg(_("E113: Unknown option: %s"), *arg);
@@ -3384,22 +3384,22 @@
     }
     else if (rettv != NULL)
     {
-	if (opt_type == -2)		/* hidden string option */
+	if (opt_type == -2)		// hidden string option
 	{
 	    rettv->v_type = VAR_STRING;
 	    rettv->vval.v_string = NULL;
 	}
-	else if (opt_type == -1)	/* hidden number option */
+	else if (opt_type == -1)	// hidden number option
 	{
 	    rettv->v_type = VAR_NUMBER;
 	    rettv->vval.v_number = 0;
 	}
-	else if (opt_type == 1)		/* number option */
+	else if (opt_type == 1)		// number option
 	{
 	    rettv->v_type = VAR_NUMBER;
 	    rettv->vval.v_number = numval;
 	}
-	else				/* string option */
+	else				// string option
 	{
 	    rettv->v_type = VAR_STRING;
 	    rettv->vval.v_string = stringval;
@@ -3408,7 +3408,7 @@
     else if (working && (opt_type == -2 || opt_type == -1))
 	ret = FAIL;
 
-    *option_end = c;		    /* put back for error messages */
+    *option_end = c;		    // put back for error messages
     *arg = option_end;
 
     return ret;
@@ -3433,8 +3433,8 @@
 	if (*p == '\\' && p[1] != NUL)
 	{
 	    ++p;
-	    /* A "\<x>" form occupies at least 4 characters, and produces up
-	     * to 6 characters: reserve space for 2 extra */
+	    // A "\<x>" form occupies at least 4 characters, and produces up
+	    // to 6 characters: reserve space for 2 extra
 	    if (*p == '<')
 		extra += 2;
 	}
@@ -3446,7 +3446,7 @@
 	return FAIL;
     }
 
-    /* If only parsing, set *arg and return here */
+    // If only parsing, set *arg and return here
     if (!evaluate)
     {
 	*arg = p + 1;
@@ -3476,9 +3476,9 @@
 		case 'r': *name++ = CAR; ++p; break;
 		case 't': *name++ = TAB; ++p; break;
 
-		case 'X': /* hex: "\x1", "\x12" */
+		case 'X': // hex: "\x1", "\x12"
 		case 'x':
-		case 'u': /* Unicode: "\u0023" */
+		case 'u': // Unicode: "\u0023"
 		case 'U':
 			  if (vim_isxdigit(p[1]))
 			  {
@@ -3498,8 +3498,8 @@
 				  nr = (nr << 4) + hex2nr(*p);
 			      }
 			      ++p;
-			      /* For "\u" store the number according to
-			       * 'encoding'. */
+			      // For "\u" store the number according to
+			      // 'encoding'.
 			      if (c != 'X')
 				  name += (*mb_char2bytes)(nr, name);
 			      else
@@ -3507,7 +3507,7 @@
 			  }
 			  break;
 
-			  /* octal: "\1", "\12", "\123" */
+			  // octal: "\1", "\12", "\123"
 		case '0':
 		case '1':
 		case '2':
@@ -3525,7 +3525,7 @@
 			  ++name;
 			  break;
 
-			    /* Special key, e.g.: "\<C-W>" */
+			    // Special key, e.g.: "\<C-W>"
 		case '<': extra = trans_special(&p, name, TRUE, TRUE,
 								   TRUE, NULL);
 			  if (extra != 0)
@@ -3533,7 +3533,7 @@
 			      name += extra;
 			      break;
 			  }
-			  /* FALLTHROUGH */
+			  // FALLTHROUGH
 
 		default:  MB_COPY_CHAR(p, name);
 			  break;
@@ -3544,7 +3544,7 @@
 
     }
     *name = NUL;
-    if (*p != NUL) /* just in case */
+    if (*p != NUL) // just in case
 	++p;
     *arg = p;
 
@@ -3582,7 +3582,7 @@
 	return FAIL;
     }
 
-    /* If only parsing return after setting "*arg" */
+    // If only parsing return after setting "*arg"
     if (!evaluate)
     {
 	*arg = p + 1;
@@ -3661,14 +3661,14 @@
 func_equal(
     typval_T *tv1,
     typval_T *tv2,
-    int	     ic)	    /* ignore case */
+    int	     ic)	    // ignore case
 {
     char_u	*s1, *s2;
     dict_T	*d1, *d2;
     int		a1, a2;
     int		i;
 
-    /* empty and NULL function name considered the same */
+    // empty and NULL function name considered the same
     s1 = tv1->v_type == VAR_FUNC ? tv1->vval.v_string
 					   : partial_name(tv1->vval.v_partial);
     if (s1 != NULL && *s1 == NUL)
@@ -3685,7 +3685,7 @@
     else if (STRCMP(s1, s2) != 0)
 	return FALSE;
 
-    /* empty dict and NULL dict is different */
+    // empty dict and NULL dict is different
     d1 = tv1->v_type == VAR_FUNC ? NULL : tv1->vval.v_partial->pt_dict;
     d2 = tv2->v_type == VAR_FUNC ? NULL : tv2->vval.v_partial->pt_dict;
     if (d1 == NULL || d2 == NULL)
@@ -3696,7 +3696,7 @@
     else if (!dict_equal(d1, d2, ic, TRUE))
 	return FALSE;
 
-    /* empty list and no list considered the same */
+    // empty list and no list considered the same
     a1 = tv1->v_type == VAR_FUNC ? 0 : tv1->vval.v_partial->pt_argc;
     a2 = tv2->v_type == VAR_FUNC ? 0 : tv2->vval.v_partial->pt_argc;
     if (a1 != a2)
@@ -3718,20 +3718,20 @@
 tv_equal(
     typval_T *tv1,
     typval_T *tv2,
-    int	     ic,	    /* ignore case */
-    int	     recursive)	    /* TRUE when used recursively */
+    int	     ic,	    // ignore case
+    int	     recursive)	    // TRUE when used recursively
 {
     char_u	buf1[NUMBUFLEN], buf2[NUMBUFLEN];
     char_u	*s1, *s2;
-    static int  recursive_cnt = 0;	    /* catch recursive loops */
+    static int  recursive_cnt = 0;	    // catch recursive loops
     int		r;
 
-    /* Catch lists and dicts that have an endless loop by limiting
-     * recursiveness to a limit.  We guess they are equal then.
-     * A fixed limit has the problem of still taking an awful long time.
-     * Reduce the limit every time running into it. That should work fine for
-     * deeply linked structures that are not recursively linked and catch
-     * recursiveness quickly. */
+    // Catch lists and dicts that have an endless loop by limiting
+    // recursiveness to a limit.  We guess they are equal then.
+    // A fixed limit has the problem of still taking an awful long time.
+    // Reduce the limit every time running into it. That should work fine for
+    // deeply linked structures that are not recursively linked and catch
+    // recursiveness quickly.
     if (!recursive)
 	tv_equal_recurse_limit = 1000;
     if (recursive_cnt >= tv_equal_recurse_limit)
@@ -3740,8 +3740,8 @@
 	return TRUE;
     }
 
-    /* For VAR_FUNC and VAR_PARTIAL compare the function name, bound dict and
-     * arguments. */
+    // For VAR_FUNC and VAR_PARTIAL compare the function name, bound dict and
+    // arguments.
     if ((tv1->v_type == VAR_FUNC
 		|| (tv1->v_type == VAR_PARTIAL && tv1->vval.v_partial != NULL))
 	    && (tv2->v_type == VAR_FUNC
@@ -3802,8 +3802,8 @@
 	    break;
     }
 
-    /* VAR_UNKNOWN can be the result of a invalid expression, let's say it
-     * does not equal anything, not even itself. */
+    // VAR_UNKNOWN can be the result of a invalid expression, let's say it
+    // does not equal anything, not even itself.
     return FALSE;
 }
 
@@ -3855,14 +3855,14 @@
 
     if (!testing)
     {
-	/* Only do this once. */
+	// Only do this once.
 	want_garbage_collect = FALSE;
 	may_garbage_collect = FALSE;
 	garbage_collect_at_exit = FALSE;
     }
 
-    /* We advance by two because we add one for items referenced through
-     * previous_funccal. */
+    // We advance by two because we add one for items referenced through
+    // previous_funccal.
     copyID = get_copyID();
 
     /*
@@ -3870,20 +3870,20 @@
      *    with copyID.
      */
 
-    /* Don't free variables in the previous_funccal list unless they are only
-     * referenced through previous_funccal.  This must be first, because if
-     * the item is referenced elsewhere the funccal must not be freed. */
+    // Don't free variables in the previous_funccal list unless they are only
+    // referenced through previous_funccal.  This must be first, because if
+    // the item is referenced elsewhere the funccal must not be freed.
     abort = abort || set_ref_in_previous_funccal(copyID);
 
-    /* script-local variables */
+    // script-local variables
     abort = abort || garbage_collect_scriptvars(copyID);
 
-    /* buffer-local variables */
+    // buffer-local variables
     FOR_ALL_BUFFERS(buf)
 	abort = abort || set_ref_in_item(&buf->b_bufvar.di_tv, copyID,
 								  NULL, NULL);
 
-    /* window-local variables */
+    // window-local variables
     FOR_ALL_TAB_WINDOWS(tp, wp)
 	abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID,
 								  NULL, NULL);
@@ -3900,23 +3900,23 @@
 								  NULL, NULL);
 #endif
 
-    /* tabpage-local variables */
+    // tabpage-local variables
     FOR_ALL_TABPAGES(tp)
 	abort = abort || set_ref_in_item(&tp->tp_winvar.di_tv, copyID,
 								  NULL, NULL);
-    /* global variables */
+    // global variables
     abort = abort || garbage_collect_globvars(copyID);
 
-    /* function-local variables */
+    // function-local variables
     abort = abort || set_ref_in_call_stack(copyID);
 
-    /* named functions (matters for closures) */
+    // named functions (matters for closures)
     abort = abort || set_ref_in_functions(copyID);
 
-    /* function call arguments, if v:testing is set. */
+    // function call arguments, if v:testing is set.
     abort = abort || set_ref_in_func_args(copyID);
 
-    /* v: vars */
+    // v: vars
     abort = abort || garbage_collect_vimvars(copyID);
 
     // callbacks in buffers
@@ -3987,9 +3987,9 @@
 {
     int		did_free = FALSE;
 
-    /* Let all "free" functions know that we are here.  This means no
-     * dictionaries, lists, channels or jobs are to be freed, because we will
-     * do that here. */
+    // Let all "free" functions know that we are here.  This means no
+    // dictionaries, lists, channels or jobs are to be freed, because we will
+    // do that here.
     in_free_unref_items = TRUE;
 
     /*
@@ -3997,19 +3997,19 @@
      * themselves yet, so that it is possible to decrement refcount counters
      */
 
-    /* Go through the list of dicts and free items without the copyID. */
+    // Go through the list of dicts and free items without the copyID.
     did_free |= dict_free_nonref(copyID);
 
-    /* Go through the list of lists and free items without the copyID. */
+    // Go through the list of lists and free items without the copyID.
     did_free |= list_free_nonref(copyID);
 
 #ifdef FEAT_JOB_CHANNEL
-    /* Go through the list of jobs and free items without the copyID. This
-     * must happen before doing channels, because jobs refer to channels, but
-     * the reference from the channel to the job isn't tracked. */
+    // Go through the list of jobs and free items without the copyID. This
+    // must happen before doing channels, because jobs refer to channels, but
+    // the reference from the channel to the job isn't tracked.
     did_free |= free_unused_jobs_contents(copyID, COPYID_MASK);
 
-    /* Go through the list of channels and free items without the copyID.  */
+    // Go through the list of channels and free items without the copyID.
     did_free |= free_unused_channels_contents(copyID, COPYID_MASK);
 #endif
 
@@ -4020,12 +4020,12 @@
     list_free_items(copyID);
 
 #ifdef FEAT_JOB_CHANNEL
-    /* Go through the list of jobs and free items without the copyID. This
-     * must happen before doing channels, because jobs refer to channels, but
-     * the reference from the channel to the job isn't tracked. */
+    // Go through the list of jobs and free items without the copyID. This
+    // must happen before doing channels, because jobs refer to channels, but
+    // the reference from the channel to the job isn't tracked.
     free_unused_jobs(copyID, COPYID_MASK);
 
-    /* Go through the list of channels and free items without the copyID.  */
+    // Go through the list of channels and free items without the copyID.
     free_unused_channels(copyID, COPYID_MASK);
 #endif
 
@@ -4055,9 +4055,9 @@
     {
 	if (!abort)
 	{
-	    /* Mark each item in the hashtab.  If the item contains a hashtab
-	     * it is added to ht_stack, if it contains a list it is added to
-	     * list_stack. */
+	    // Mark each item in the hashtab.  If the item contains a hashtab
+	    // it is added to ht_stack, if it contains a list it is added to
+	    // list_stack.
 	    todo = (int)cur_ht->ht_used;
 	    for (hi = cur_ht->ht_array; todo > 0; ++hi)
 		if (!HASHITEM_EMPTY(hi))
@@ -4071,7 +4071,7 @@
 	if (ht_stack == NULL)
 	    break;
 
-	/* take an item from the stack */
+	// take an item from the stack
 	cur_ht = ht_stack->ht;
 	tempitem = ht_stack;
 	ht_stack = ht_stack->prev;
@@ -4130,16 +4130,16 @@
     for (;;)
     {
 	if (!abort)
-	    /* Mark each item in the list.  If the item contains a hashtab
-	     * it is added to ht_stack, if it contains a list it is added to
-	     * list_stack. */
+	    // Mark each item in the list.  If the item contains a hashtab
+	    // it is added to ht_stack, if it contains a list it is added to
+	    // list_stack.
 	    for (li = cur_l->lv_first; !abort && li != NULL; li = li->li_next)
 		abort = abort || set_ref_in_item(&li->li_tv, copyID,
 						       ht_stack, &list_stack);
 	if (list_stack == NULL)
 	    break;
 
-	/* take an item from the stack */
+	// take an item from the stack
 	cur_l = list_stack->list;
 	tempitem = list_stack;
 	list_stack = list_stack->prev;
@@ -4171,7 +4171,7 @@
 
 	if (dd != NULL && dd->dv_copyID != copyID)
 	{
-	    /* Didn't see this dict yet. */
+	    // Didn't see this dict yet.
 	    dd->dv_copyID = copyID;
 	    if (ht_stack == NULL)
 	    {
@@ -4197,7 +4197,7 @@
 
 	if (ll != NULL && ll->lv_copyID != copyID)
 	{
-	    /* Didn't see this list yet. */
+	    // Didn't see this list yet.
 	    ll->lv_copyID = copyID;
 	    if (list_stack == NULL)
 	    {
@@ -4227,8 +4227,7 @@
 	partial_T	*pt = tv->vval.v_partial;
 	int		i;
 
-	/* A partial does not have a copyID, because it cannot contain itself.
-	 */
+	// A partial does not have a copyID, because it cannot contain itself.
 	if (pt != NULL)
 	{
 	    abort = set_ref_in_func(pt->pt_name, pt->pt_func, copyID);
@@ -4349,9 +4348,9 @@
     {
 	if (!did_echo_string_emsg)
 	{
-	    /* Only give this message once for a recursive call to avoid
-	     * flooding the user with errors.  And stop iterating over lists
-	     * and dicts. */
+	    // Only give this message once for a recursive call to avoid
+	    // flooding the user with errors.  And stop iterating over lists
+	    // and dicts.
 	    did_echo_string_emsg = TRUE;
 	    emsg(_("E724: variable nested too deep for displaying"));
 	}
@@ -4612,12 +4611,12 @@
     int
 string2float(
     char_u	*text,
-    float_T	*value)	    /* result stored here */
+    float_T	*value)	    // result stored here
 {
     char	*s = (char *)text;
     float_T	f;
 
-    /* MS-Windows does not deal with "inf" and "nan" properly. */
+    // MS-Windows does not deal with "inf" and "nan" properly.
     if (STRNICMP(text, "inf", 3) == 0)
     {
 	*value = INFINITY;
@@ -4660,11 +4659,11 @@
     if (evaluate)
     {
 	if (len == 0)
-	    return FAIL; /* invalid empty name */
+	    return FAIL; // invalid empty name
 
 	cc = name[len];
 	name[len] = NUL;
-	/* first try vim_getenv(), fast for normal environment vars */
+	// first try vim_getenv(), fast for normal environment vars
 	string = vim_getenv(name, &mustfree);
 	if (string != NULL && *string != NUL)
 	{
@@ -4676,7 +4675,7 @@
 	    if (mustfree)
 		vim_free(string);
 
-	    /* next try expanding things like $VIM and ${HOME} */
+	    // next try expanding things like $VIM and ${HOME}
 	    string = expand_env_save(name - 1);
 	    if (string != NULL && *string == '$')
 		VIM_CLEAR(string);
@@ -4697,14 +4696,14 @@
     pos_T *
 var2fpos(
     typval_T	*varp,
-    int		dollar_lnum,	/* TRUE when $ is last line */
-    int		*fnum)		/* set to fnum for '0, 'A, etc. */
+    int		dollar_lnum,	// TRUE when $ is last line
+    int		*fnum)		// set to fnum for '0, 'A, etc.
 {
     char_u		*name;
     static pos_T	pos;
     pos_T		*pp;
 
-    /* Argument can be [lnum, col, coladd]. */
+    // Argument can be [lnum, col, coladd].
     if (varp->v_type == VAR_LIST)
     {
 	list_T		*l;
@@ -4716,30 +4715,30 @@
 	if (l == NULL)
 	    return NULL;
 
-	/* Get the line number */
+	// Get the line number
 	pos.lnum = list_find_nr(l, 0L, &error);
 	if (error || pos.lnum <= 0 || pos.lnum > curbuf->b_ml.ml_line_count)
-	    return NULL;	/* invalid line number */
+	    return NULL;	// invalid line number
 
-	/* Get the column number */
+	// Get the column number
 	pos.col = list_find_nr(l, 1L, &error);
 	if (error)
 	    return NULL;
 	len = (long)STRLEN(ml_get(pos.lnum));
 
-	/* We accept "$" for the column number: last column. */
+	// We accept "$" for the column number: last column.
 	li = list_find(l, 1L);
 	if (li != NULL && li->li_tv.v_type == VAR_STRING
 		&& li->li_tv.vval.v_string != NULL
 		&& STRCMP(li->li_tv.vval.v_string, "$") == 0)
 	    pos.col = len + 1;
 
-	/* Accept a position up to the NUL after the line. */
+	// Accept a position up to the NUL after the line.
 	if (pos.col == 0 || (int)pos.col > len + 1)
-	    return NULL;	/* invalid column number */
+	    return NULL;	// invalid column number
 	--pos.col;
 
-	/* Get the virtual offset.  Defaults to zero. */
+	// Get the virtual offset.  Defaults to zero.
 	pos.coladd = list_find_nr(l, 2L, &error);
 	if (error)
 	    pos.coladd = 0;
@@ -4750,15 +4749,15 @@
     name = tv_get_string_chk(varp);
     if (name == NULL)
 	return NULL;
-    if (name[0] == '.')				/* cursor */
+    if (name[0] == '.')				// cursor
 	return &curwin->w_cursor;
-    if (name[0] == 'v' && name[1] == NUL)	/* Visual start */
+    if (name[0] == 'v' && name[1] == NUL)	// Visual start
     {
 	if (VIsual_active)
 	    return &VIsual;
 	return &curwin->w_cursor;
     }
-    if (name[0] == '\'')			/* mark */
+    if (name[0] == '\'')			// mark
     {
 	pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum);
 	if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0)
@@ -4771,23 +4770,23 @@
     if (name[0] == 'w' && dollar_lnum)
     {
 	pos.col = 0;
-	if (name[1] == '0')		/* "w0": first visible line */
+	if (name[1] == '0')		// "w0": first visible line
 	{
 	    update_topline();
-	    /* In silent Ex mode topline is zero, but that's not a valid line
-	     * number; use one instead. */
+	    // In silent Ex mode topline is zero, but that's not a valid line
+	    // number; use one instead.
 	    pos.lnum = curwin->w_topline > 0 ? curwin->w_topline : 1;
 	    return &pos;
 	}
-	else if (name[1] == '$')	/* "w$": last visible line */
+	else if (name[1] == '$')	// "w$": last visible line
 	{
 	    validate_botline();
-	    /* In silent Ex mode botline is zero, return zero then. */
+	    // In silent Ex mode botline is zero, return zero then.
 	    pos.lnum = curwin->w_botline > 0 ? curwin->w_botline - 1 : 0;
 	    return &pos;
 	}
     }
-    else if (name[0] == '$')		/* last column or line */
+    else if (name[0] == '$')		// last column or line
     {
 	if (dollar_lnum)
 	{
@@ -4823,8 +4822,8 @@
     long	i = 0;
     long	n;
 
-    /* List must be: [fnum, lnum, col, coladd, curswant], where "fnum" is only
-     * there when "fnump" isn't NULL; "coladd" and "curswant" are optional. */
+    // List must be: [fnum, lnum, col, coladd, curswant], where "fnum" is only
+    // there when "fnump" isn't NULL; "coladd" and "curswant" are optional.
     if (arg->v_type != VAR_LIST
 	    || l == NULL
 	    || l->lv_len < (fnump == NULL ? 2 : 3)
@@ -4833,32 +4832,32 @@
 
     if (fnump != NULL)
     {
-	n = list_find_nr(l, i++, NULL);	/* fnum */
+	n = list_find_nr(l, i++, NULL);	// fnum
 	if (n < 0)
 	    return FAIL;
 	if (n == 0)
-	    n = curbuf->b_fnum;		/* current buffer */
+	    n = curbuf->b_fnum;		// current buffer
 	*fnump = n;
     }
 
-    n = list_find_nr(l, i++, NULL);	/* lnum */
+    n = list_find_nr(l, i++, NULL);	// lnum
     if (n < 0)
 	return FAIL;
     posp->lnum = n;
 
-    n = list_find_nr(l, i++, NULL);	/* col */
+    n = list_find_nr(l, i++, NULL);	// col
     if (n < 0)
 	return FAIL;
     posp->col = n;
 
-    n = list_find_nr(l, i, NULL);	/* off */
+    n = list_find_nr(l, i, NULL);	// off
     if (n < 0)
 	posp->coladd = 0;
     else
 	posp->coladd = n;
 
     if (curswantp != NULL)
-	*curswantp = list_find_nr(l, i + 1, NULL);  /* curswant */
+	*curswantp = list_find_nr(l, i + 1, NULL);  // curswant
 
     return OK;
 }
@@ -4876,7 +4875,7 @@
 
     for (p = *arg; vim_isIDc(*p); ++p)
 	;
-    if (p == *arg)	    /* no name found */
+    if (p == *arg)	    // no name found
 	return 0;
 
     len = (int)(p - *arg);
@@ -4895,20 +4894,20 @@
     char_u	*p;
     int		len;
 
-    /* Find the end of the name. */
+    // Find the end of the name.
     for (p = *arg; eval_isnamec(*p); ++p)
     {
 	if (*p == ':')
 	{
-	    /* "s:" is start of "s:var", but "n:" is not and can be used in
-	     * slice "[n:]".  Also "xx:" is not a namespace. */
+	    // "s:" is start of "s:var", but "n:" is not and can be used in
+	    // slice "[n:]".  Also "xx:" is not a namespace.
 	    len = (int)(p - *arg);
 	    if ((len == 1 && vim_strchr(NAMESPACE_CHAR, **arg) == NULL)
 		    || len > 1)
 		break;
 	}
     }
-    if (p == *arg)	    /* no name found */
+    if (p == *arg)	    // no name found
 	return 0;
 
     len = (int)(p - *arg);
@@ -4938,19 +4937,19 @@
     char_u	*expr_start;
     char_u	*expr_end;
 
-    *alias = NULL;  /* default to no alias */
+    *alias = NULL;  // default to no alias
 
     if ((*arg)[0] == K_SPECIAL && (*arg)[1] == KS_EXTRA
 						  && (*arg)[2] == (int)KE_SNR)
     {
-	/* hard coded <SNR>, already translated */
+	// hard coded <SNR>, already translated
 	*arg += 3;
 	return get_id_len(arg) + 3;
     }
     len = eval_fname_script(*arg);
     if (len > 0)
     {
-	/* literal "<SID>", "s:" or "<SNR>" */
+	// literal "<SID>", "s:" or "<SNR>"
 	*arg += len;
     }
 
@@ -5017,7 +5016,7 @@
 	*expr_end = NULL;
     }
 
-    /* Quick check for valid starting character. */
+    // Quick check for valid starting character.
     if ((flags & FNE_CHECK_START) && !eval_isnamec1(*arg) && *arg != '{')
 	return arg;
 
@@ -5030,7 +5029,7 @@
     {
 	if (*p == '\'')
 	{
-	    /* skip over 'string' to avoid counting [ and ] inside it. */
+	    // skip over 'string' to avoid counting [ and ] inside it.
 	    for (p = p + 1; *p != NUL && *p != '\''; MB_PTR_ADV(p))
 		;
 	    if (*p == NUL)
@@ -5038,7 +5037,7 @@
 	}
 	else if (*p == '"')
 	{
-	    /* skip over "str\"ing" to avoid counting [ and ] inside it. */
+	    // skip over "str\"ing" to avoid counting [ and ] inside it.
 	    for (p = p + 1; *p != NUL && *p != '"'; MB_PTR_ADV(p))
 		if (*p == '\\' && p[1] != NUL)
 		    ++p;
@@ -5047,8 +5046,8 @@
 	}
 	else if (br_nest == 0 && mb_nest == 0 && *p == ':')
 	{
-	    /* "s:" is start of "s:var", but "n:" is not and can be used in
-	     * slice "[n:]".  Also "xx:" is not a namespace. But {ns}: is. */
+	    // "s:" is start of "s:var", but "n:" is not and can be used in
+	    // slice "[n:]".  Also "xx:" is not a namespace. But {ns}: is.
 	    len = (int)(p - arg);
 	    if ((len == 1 && vim_strchr(NAMESPACE_CHAR, *arg) == NULL)
 		    || (len > 1 && p[-1] != '}'))
@@ -5129,7 +5128,7 @@
     }
     vim_free(temp_result);
 
-    *in_end = c1;		/* put char back for error messages */
+    *in_end = c1;		// put char back for error messages
     *expr_start = '{';
     *expr_end = '}';
 
@@ -5138,7 +5137,7 @@
 	temp_result = find_name_end(retval, &expr_start, &expr_end, 0);
 	if (expr_start != NULL)
 	{
-	    /* Further expansion! */
+	    // Further expansion!
 	    temp_result = make_expanded_name(retval, expr_start,
 						       expr_end, temp_result);
 	    vim_free(retval);
@@ -5235,7 +5234,7 @@
 		    ret = eval_method(arg, rettv, evaluate, verbose);
 	    }
 	}
-	else /* **arg == '[' || **arg == '.' */
+	else // **arg == '[' || **arg == '.'
 	{
 	    dict_unref(selfdict);
 	    if (rettv->v_type == VAR_DICT)
@@ -5254,9 +5253,9 @@
 	}
     }
 
-    /* Turn "dict.Func" into a partial for "Func" bound to "dict".
-     * Don't do this when "Func" is already a partial that was bound
-     * explicitly (pt_auto is FALSE). */
+    // Turn "dict.Func" into a partial for "Func" bound to "dict".
+    // Don't do this when "Func" is already a partial that was bound
+    // explicitly (pt_auto is FALSE).
     if (selfdict != NULL
 	    && (rettv->v_type == VAR_FUNC
 		|| (rettv->v_type == VAR_PARTIAL
@@ -5311,7 +5310,7 @@
 	{
 	    case VAR_FUNC:
 		func_unref(varp->vval.v_string);
-		/* FALLTHROUGH */
+		// FALLTHROUGH
 	    case VAR_STRING:
 		vim_free(varp->vval.v_string);
 		break;
@@ -5359,7 +5358,7 @@
 	{
 	    case VAR_FUNC:
 		func_unref(varp->vval.v_string);
-		/* FALLTHROUGH */
+		// FALLTHROUGH
 	    case VAR_STRING:
 		VIM_CLEAR(varp->vval.v_string);
 		break;
@@ -5429,7 +5428,7 @@
 {
     int		error = FALSE;
 
-    return tv_get_number_chk(varp, &error);	/* return 0L on error */
+    return tv_get_number_chk(varp, &error);	// return 0L on error
 }
 
     varnumber_T
@@ -5481,7 +5480,7 @@
 	    internal_error("tv_get_number(UNKNOWN)");
 	    break;
     }
-    if (denote == NULL)		/* useful for values that must be unsigned */
+    if (denote == NULL)		// useful for values that must be unsigned
 	n = -1;
     else
 	*denote = TRUE;
@@ -5626,7 +5625,7 @@
 			    (long)job->jv_proc_info.dwProcessId,
 			    status);
 # else
-		/* fall-back */
+		// fall-back
 		vim_snprintf((char *)buf, NUMBUFLEN, "process ? %s", status);
 # endif
 		return buf;
@@ -5843,7 +5842,7 @@
 		to->vval.v_list = NULL;
 	    else if (copyID != 0 && from->vval.v_list->lv_copyID == copyID)
 	    {
-		/* use the copy made earlier */
+		// use the copy made earlier
 		to->vval.v_list = from->vval.v_list->lv_copylist;
 		++to->vval.v_list->lv_refcount;
 	    }
@@ -5862,7 +5861,7 @@
 		to->vval.v_dict = NULL;
 	    else if (copyID != 0 && from->vval.v_dict->dv_copyID == copyID)
 	    {
-		/* use the copy made earlier */
+		// use the copy made earlier
 		to->vval.v_dict = from->vval.v_dict->dv_copydict;
 		++to->vval.v_dict->dv_refcount;
 	    }
@@ -5901,8 +5900,8 @@
 	++emsg_skip;
     while (*arg != NUL && *arg != '|' && *arg != '\n' && !got_int)
     {
-	/* If eval1() causes an error message the text from the command may
-	 * still need to be cleared. E.g., "echo 22,44". */
+	// If eval1() causes an error message the text from the command may
+	// still need to be cleared. E.g., "echo 22,44".
 	need_clr_eos = needclr;
 
 	p = arg;
@@ -5926,13 +5925,13 @@
 	    if (atstart)
 	    {
 		atstart = FALSE;
-		/* Call msg_start() after eval1(), evaluating the expression
-		 * may cause a message to appear. */
+		// Call msg_start() after eval1(), evaluating the expression
+		// may cause a message to appear.
 		if (eap->cmdidx == CMD_echo)
 		{
-		    /* Mark the saved text as finishing the line, so that what
-		     * follows is displayed on a new line when scrolling back
-		     * at the more prompt. */
+		    // Mark the saved text as finishing the line, so that what
+		    // follows is displayed on a new line when scrolling back
+		    // at the more prompt.
 		    msg_sb_eol();
 		    msg_start();
 		}
@@ -5947,7 +5946,7 @@
 		    {
 			if (*p != TAB && needclr)
 			{
-			    /* remove any text still there from the command */
+			    // remove any text still there from the command
 			    msg_clr_eos();
 			    needclr = FALSE;
 			}
@@ -5977,7 +5976,7 @@
 	--emsg_skip;
     else
     {
-	/* remove text that may still be there from the command */
+	// remove text that may still be there from the command
 	if (needclr)
 	    msg_clr_eos();
 	if (eap->cmdidx == CMD_echo)
@@ -6060,9 +6059,9 @@
     {
 	if (eap->cmdidx == CMD_echomsg || eap->cmdidx == CMD_echoerr)
 	{
-	    /* Mark the already saved text as finishing the line, so that what
-	     * follows is displayed on a new line when scrolling back at the
-	     * more prompt. */
+	    // Mark the already saved text as finishing the line, so that what
+	    // follows is displayed on a new line when scrolling back at the
+	    // more prompt.
 	    msg_sb_eol();
 	}
 
@@ -6073,7 +6072,7 @@
 	}
 	else if (eap->cmdidx == CMD_echoerr)
 	{
-	    /* We don't want to abort following commands, restore did_emsg. */
+	    // We don't want to abort following commands, restore did_emsg.
 	    save_did_emsg = did_emsg;
 	    emsg(ga.ga_data);
 	    if (!force_abort)
@@ -6122,7 +6121,7 @@
     *arg = p;
 
     if (p[0] == 't' && p[1] == '_' && p[2] != NUL && p[3] != NUL)
-	p += 4;	    /* termcap option */
+	p += 4;	    // termcap option
     else
 	while (ASCII_ISALPHA(*p))
 	    ++p;
@@ -6162,11 +6161,11 @@
  */
     int
 typval_compare(
-    typval_T	*typ1,   /* first operand */
-    typval_T	*typ2,   /* second operand */
-    exptype_T	type,    /* operator */
-    int		type_is, /* TRUE for "is" and "isnot" */
-    int		ic)      /* ignore case */
+    typval_T	*typ1,   // first operand
+    typval_T	*typ2,   // second operand
+    exptype_T	type,    // operator
+    int		type_is, // TRUE for "is" and "isnot"
+    int		ic)      // ignore case
 {
     int		i;
     varnumber_T	n1, n2;
@@ -6175,8 +6174,8 @@
 
     if (type_is && typ1->v_type != typ2->v_type)
     {
-	/* For "is" a different type always means FALSE, for "notis"
-	    * it means TRUE. */
+	// For "is" a different type always means FALSE, for "notis"
+	// it means TRUE.
 	n1 = (type == TYPE_NEQUAL);
     }
     else if (typ1->v_type == VAR_BLOB || typ2->v_type == VAR_BLOB)
@@ -6227,7 +6226,7 @@
 	}
 	else
 	{
-	    /* Compare two Lists for being equal or unequal. */
+	    // Compare two Lists for being equal or unequal.
 	    n1 = list_equal(typ1->vval.v_list, typ2->vval.v_list,
 							    ic, FALSE);
 	    if (type == TYPE_NEQUAL)
@@ -6256,7 +6255,7 @@
 	}
 	else
 	{
-	    /* Compare two Dictionaries for being equal or unequal. */
+	    // Compare two Dictionaries for being equal or unequal.
 	    n1 = dict_equal(typ1->vval.v_dict, typ2->vval.v_dict,
 							    ic, FALSE);
 	    if (type == TYPE_NEQUAL)
@@ -6277,13 +6276,13 @@
 					&& typ1->vval.v_partial == NULL)
 		|| (typ2->v_type == VAR_PARTIAL
 					&& typ2->vval.v_partial == NULL))
-	    /* when a partial is NULL assume not equal */
+	    // when a partial is NULL assume not equal
 	    n1 = FALSE;
 	else if (type_is)
 	{
 	    if (typ1->v_type == VAR_FUNC && typ2->v_type == VAR_FUNC)
-		/* strings are considered the same if their value is
-		    * the same */
+		// strings are considered the same if their value is
+		// the same
 		n1 = tv_equal(typ1, typ2, ic, FALSE);
 	    else if (typ1->v_type == VAR_PARTIAL
 					&& typ2->v_type == VAR_PARTIAL)
@@ -6320,7 +6319,7 @@
 	    case TYPE_SEQUAL:   n1 = (f1 <= f2); break;
 	    case TYPE_UNKNOWN:
 	    case TYPE_MATCH:
-	    case TYPE_NOMATCH:  break;  /* avoid gcc warning */
+	    case TYPE_NOMATCH:  break;  // avoid gcc warning
 	}
     }
 #endif
@@ -6344,7 +6343,7 @@
 	    case TYPE_SEQUAL:   n1 = (n1 <= n2); break;
 	    case TYPE_UNKNOWN:
 	    case TYPE_MATCH:
-	    case TYPE_NOMATCH:  break;  /* avoid gcc warning */
+	    case TYPE_NOMATCH:  break;  // avoid gcc warning
 	}
     }
     else
@@ -6372,7 +6371,7 @@
 			n1 = !n1;
 		    break;
 
-	    case TYPE_UNKNOWN:  break;  /* avoid gcc warning */
+	    case TYPE_UNKNOWN:  break;  // avoid gcc warning
 	}
     }
     clear_tv(typ1);
@@ -6392,7 +6391,7 @@
     if (arg == NULL)
 	return vim_strsave((char_u *)"(does not exist)");
     ret = tv2string(arg, &tofree, numbuf, 0);
-    /* Make a copy if we have a value but it's not in allocated memory. */
+    // Make a copy if we have a value but it's not in allocated memory.
     if (ret != NULL && tofree == NULL)
 	ret = vim_strsave(ret);
     return ret;
@@ -6425,7 +6424,7 @@
     char_u	*save_cpo;
     char_u	*zero_width = NULL;
 
-    /* Make 'cpoptions' empty, so that the 'l' flag doesn't work here */
+    // Make 'cpoptions' empty, so that the 'l' flag doesn't work here
     save_cpo = p_cpo;
     p_cpo = empty_option;
 
@@ -6441,12 +6440,12 @@
 	end = str + STRLEN(str);
 	while (vim_regexec_nl(&regmatch, str, (colnr_T)(tail - str)))
 	{
-	    /* Skip empty match except for first match. */
+	    // Skip empty match except for first match.
 	    if (regmatch.startp[0] == regmatch.endp[0])
 	    {
 		if (zero_width == regmatch.startp[0])
 		{
-		    /* avoid getting stuck on a match with an empty string */
+		    // avoid getting stuck on a match with an empty string
 		    i = mb_ptr2len(tail);
 		    mch_memmove((char_u *)ga.ga_data + ga.ga_len, tail,
 								   (size_t)i);
@@ -6472,10 +6471,10 @@
 		break;
 	    }
 
-	    /* copy the text up to where the match is */
+	    // copy the text up to where the match is
 	    i = (int)(regmatch.startp[0] - tail);
 	    mch_memmove((char_u *)ga.ga_data + ga.ga_len, tail, (size_t)i);
-	    /* add the substituted text */
+	    // add the substituted text
 	    (void)vim_regsub(&regmatch, sub, expr, (char_u *)ga.ga_data
 					  + ga.ga_len + i, TRUE, TRUE, FALSE);
 	    ga.ga_len += i + sublen - 1;
@@ -6497,7 +6496,7 @@
     if (p_cpo == empty_option)
 	p_cpo = save_cpo;
     else
-	/* Darn, evaluating {sub} expression or {expr} changed the value. */
+	// Darn, evaluating {sub} expression or {expr} changed the value.
 	free_string_option(save_cpo);
 
     return ret;
