diff --git a/src/quickfix.c b/src/quickfix.c
index 30f9bde..1b491c2 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -27,20 +27,20 @@
 typedef struct qfline_S qfline_T;
 struct qfline_S
 {
-    qfline_T	*qf_next;	/* pointer to next error in the list */
-    qfline_T	*qf_prev;	/* pointer to previous error in the list */
-    linenr_T	qf_lnum;	/* line number where the error occurred */
-    int		qf_fnum;	/* file number for the line */
-    int		qf_col;		/* column where the error occurred */
-    int		qf_nr;		/* error number */
-    char_u	*qf_module;	/* module name for this error */
-    char_u	*qf_pattern;	/* search pattern for the error */
-    char_u	*qf_text;	/* description of the error */
-    char_u	qf_viscol;	/* set to TRUE if qf_col is screen column */
-    char_u	qf_cleared;	/* set to TRUE if line has been deleted */
-    char_u	qf_type;	/* type of the error (mostly 'E'); 1 for
-				   :helpgrep */
-    char_u	qf_valid;	/* valid error message detected */
+    qfline_T	*qf_next;	// pointer to next error in the list
+    qfline_T	*qf_prev;	// pointer to previous error in the list
+    linenr_T	qf_lnum;	// line number where the error occurred
+    int		qf_fnum;	// file number for the line
+    int		qf_col;		// column where the error occurred
+    int		qf_nr;		// error number
+    char_u	*qf_module;	// module name for this error
+    char_u	*qf_pattern;	// search pattern for the error
+    char_u	*qf_text;	// description of the error
+    char_u	qf_viscol;	// set to TRUE if qf_col is screen column
+    char_u	qf_cleared;	// set to TRUE if line has been deleted
+    char_u	qf_type;	// type of the error (mostly 'E'); 1 for
+				// :helpgrep
+    char_u	qf_valid;	// valid error message detected
 };
 
 /*
@@ -60,16 +60,16 @@
  */
 typedef struct qf_list_S
 {
-    int_u	qf_id;		/* Unique identifier for this list */
-    qfline_T	*qf_start;	/* pointer to the first error */
-    qfline_T	*qf_last;	/* pointer to the last error */
-    qfline_T	*qf_ptr;	/* pointer to the current error */
-    int		qf_count;	/* number of errors (0 means empty list) */
-    int		qf_index;	/* current index in the error list */
-    int		qf_nonevalid;	/* TRUE if not a single valid entry found */
-    char_u	*qf_title;	/* title derived from the command that created
-				 * the error list or set by setqflist */
-    typval_T	*qf_ctx;	/* context set by setqflist/setloclist */
+    int_u	qf_id;		// Unique identifier for this list
+    qfline_T	*qf_start;	// pointer to the first error
+    qfline_T	*qf_last;	// pointer to the last error
+    qfline_T	*qf_ptr;	// pointer to the current error
+    int		qf_count;	// number of errors (0 means empty list)
+    int		qf_index;	// current index in the error list
+    int		qf_nonevalid;	// TRUE if not a single valid entry found
+    char_u	*qf_title;	// title derived from the command that created
+				// the error list or set by setqflist
+    typval_T	*qf_ctx;	// context set by setqflist/setloclist
 
     struct dir_stack_T	*qf_dir_stack;
     char_u		*qf_directory;
@@ -87,22 +87,20 @@
  */
 struct qf_info_S
 {
-    /*
-     * Count of references to this list. Used only for location lists.
-     * When a location list window reference this list, qf_refcount
-     * will be 2. Otherwise, qf_refcount will be 1. When qf_refcount
-     * reaches 0, the list is freed.
-     */
+    // Count of references to this list. Used only for location lists.
+    // When a location list window reference this list, qf_refcount
+    // will be 2. Otherwise, qf_refcount will be 1. When qf_refcount
+    // reaches 0, the list is freed.
     int		qf_refcount;
-    int		qf_listcount;	    /* current number of lists */
-    int		qf_curlist;	    /* current error list */
+    int		qf_listcount;	    // current number of lists
+    int		qf_curlist;	    // current error list
     qf_list_T	qf_lists[LISTCOUNT];
 };
 
-static qf_info_T ql_info;	/* global quickfix list */
-static int_u last_qf_id = 0;	/* Last used quickfix list id */
+static qf_info_T ql_info;	// global quickfix list
+static int_u last_qf_id = 0;	// Last used quickfix list id
 
-#define FMT_PATTERNS 11		/* maximum number of % recognized */
+#define FMT_PATTERNS 11		// maximum number of % recognized
 
 /*
  * Structure used to hold the info of one part of 'errorformat'
@@ -110,29 +108,29 @@
 typedef struct efm_S efm_T;
 struct efm_S
 {
-    regprog_T	    *prog;	/* pre-formatted part of 'errorformat' */
-    efm_T	    *next;	/* pointer to next (NULL if last) */
-    char_u	    addr[FMT_PATTERNS]; /* indices of used % patterns */
-    char_u	    prefix;	/* prefix of this format line: */
-				/*   'D' enter directory */
-				/*   'X' leave directory */
-				/*   'A' start of multi-line message */
-				/*   'E' error message */
-				/*   'W' warning message */
-				/*   'I' informational message */
-				/*   'C' continuation line */
-				/*   'Z' end of multi-line message */
-				/*   'G' general, unspecific message */
-				/*   'P' push file (partial) message */
-				/*   'Q' pop/quit file (partial) message */
-				/*   'O' overread (partial) message */
-    char_u	    flags;	/* additional flags given in prefix */
-				/*   '-' do not include this line */
-				/*   '+' include whole line in message */
-    int		    conthere;	/* %> used */
+    regprog_T	    *prog;	// pre-formatted part of 'errorformat'
+    efm_T	    *next;	// pointer to next (NULL if last)
+    char_u	    addr[FMT_PATTERNS]; // indices of used % patterns
+    char_u	    prefix;	// prefix of this format line:
+				//   'D' enter directory
+				//   'X' leave directory
+				//   'A' start of multi-line message
+				//   'E' error message
+				//   'W' warning message
+				//   'I' informational message
+				//   'C' continuation line
+				//   'Z' end of multi-line message
+				//   'G' general, unspecific message
+				//   'P' push file (partial) message
+				//   'Q' pop/quit file (partial) message
+				//   'O' overread (partial) message
+    char_u	    flags;	// additional flags given in prefix
+				//   '-' do not include this line
+				//   '+' include whole line in message
+    int		    conthere;	// %> used
 };
 
-static efm_T	*fmt_start = NULL; /* cached across qf_parse_line() calls */
+static efm_T	*fmt_start = NULL; // cached across qf_parse_line() calls
 
 static void	qf_new_list(qf_info_T *qi, char_u *qf_title);
 static int	qf_add_entry(qf_info_T *qi, int qf_idx, char_u *dir, char_u *fname, char_u *module, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid);
@@ -153,9 +151,9 @@
 static void	unload_dummy_buffer(buf_T *buf, char_u *dirname_start);
 static qf_info_T *ll_get_or_alloc_list(win_T *);
 
-/* Quickfix window check helper macro */
+// Quickfix window check helper macro
 #define IS_QF_WINDOW(wp) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref == NULL)
-/* Location list window check helper macro */
+// Location list window check helper macro
 #define IS_LL_WINDOW(wp) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref != NULL)
 
 // Quickfix and location list stack check helper macros
@@ -189,7 +187,7 @@
     char	*pattern;
 } fmt_pat[FMT_PATTERNS] =
     {
-	{'f', ".\\+"},	    /* only used when at end */
+	{'f', ".\\+"},	    // only used when at end
 	{'n', "\\d\\+"},
 	{'l', "\\d\\+"},
 	{'c', "\\d\\+"},
@@ -221,7 +219,7 @@
 
     if (efminfo->addr[idx])
     {
-	/* Each errorformat pattern can occur only once */
+	// Each errorformat pattern can occur only once
 	sprintf((char *)errmsg,
 		_("E372: Too many %%%c in format string"), *efmpat);
 	EMSG(errmsg);
@@ -243,9 +241,9 @@
 #ifdef BACKSLASH_IN_FILENAME
     if (*efmpat == 'f')
     {
-	/* Also match "c:" in the file name, even when
-	 * checking for a colon next: "%f:".
-	 * "\%(\a:\)\=" */
+	// Also match "c:" in the file name, even when
+	// checking for a colon next: "%f:".
+	// "\%(\a:\)\="
 	STRCPY(regpat, "\\%(\\a:\\)\\=");
 	regpat += 10;
     }
@@ -254,18 +252,18 @@
     {
 	if (efmpat[1] != '\\' && efmpat[1] != '%')
 	{
-	    /* A file name may contain spaces, but this isn't
-	     * in "\f".  For "%f:%l:%m" there may be a ":" in
-	     * the file name.  Use ".\{-1,}x" instead (x is
-	     * the next character), the requirement that :999:
-	     * follows should work. */
+	    // A file name may contain spaces, but this isn't
+	    // in "\f".  For "%f:%l:%m" there may be a ":" in
+	    // the file name.  Use ".\{-1,}x" instead (x is
+	    // the next character), the requirement that :999:
+	    // follows should work.
 	    STRCPY(regpat, ".\\{-1,}");
 	    regpat += 7;
 	}
 	else
 	{
-	    /* File name followed by '\\' or '%': include as
-	     * many file name chars as possible. */
+	    // File name followed by '\\' or '%': include as
+	    // many file name chars as possible.
 	    STRCPY(regpat, "\\f\\+");
 	    regpat += 4;
 	}
@@ -298,16 +296,16 @@
 
     if (*efmp == '[' || *efmp == '\\')
     {
-	if ((*regpat++ = *efmp) == '[')	/* %*[^a-z0-9] etc. */
+	if ((*regpat++ = *efmp) == '[')	// %*[^a-z0-9] etc.
 	{
 	    if (efmp[1] == '^')
 		*regpat++ = *++efmp;
 	    if (efmp < efm + len)
 	    {
-		*regpat++ = *++efmp;	    /* could be ']' */
+		*regpat++ = *++efmp;	    // could be ']'
 		while (efmp < efm + len
 			&& (*regpat++ = *++efmp) != ']')
-		    /* skip */;
+		    // skip ;
 		if (efmp == efm + len)
 		{
 		    EMSG(_("E374: Missing ] in format string"));
@@ -315,14 +313,14 @@
 		}
 	    }
 	}
-	else if (efmp < efm + len)	/* %*\D, %*\s etc. */
+	else if (efmp < efm + len)	// %*\D, %*\s etc.
 	    *regpat++ = *++efmp;
 	*regpat++ = '\\';
 	*regpat++ = '+';
     }
     else
     {
-	/* TODO: scanf()-like: %*ud, %*3c, %*f, ... ? */
+	// TODO: scanf()-like: %*ud, %*3c, %*f, ... ?
 	sprintf((char *)errmsg,
 		_("E375: Unsupported %%%c in format string"), *efmp);
 	EMSG(errmsg);
@@ -374,9 +372,7 @@
     int		round;
     int		idx = 0;
 
-    /*
-     * Build a regexp pattern for a 'errorformat' option part
-     */
+    // Build a regexp pattern for a 'errorformat' option part
     ptr = regpat;
     *ptr++ = '^';
     round = 0;
@@ -404,17 +400,15 @@
 		    return FAIL;
 	    }
 	    else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL)
-		*ptr++ = *efmp;		/* regexp magic characters */
+		*ptr++ = *efmp;		// regexp magic characters
 	    else if (*efmp == '#')
 		*ptr++ = '*';
 	    else if (*efmp == '>')
 		fmt_ptr->conthere = TRUE;
-	    else if (efmp == efm + 1)		/* analyse prefix */
+	    else if (efmp == efm + 1)		// analyse prefix
 	    {
-		/*
-		 * prefix is allowed only at the beginning of the errorformat
-		 * option part
-		 */
+		// prefix is allowed only at the beginning of the errorformat
+		// option part
 		efmp = efm_analyze_prefix(efmp, fmt_ptr, errmsg);
 		if (efmp == NULL)
 		    return FAIL;
@@ -427,12 +421,12 @@
 		return FAIL;
 	    }
 	}
-	else			/* copy normal character */
+	else			// copy normal character
 	{
 	    if (*efmp == '\\' && efmp + 1 < efm + len)
 		++efmp;
 	    else if (vim_strchr((char_u *)".*^$~[", *efmp) != NULL)
-		*ptr++ = '\\';	/* escape regexp atoms */
+		*ptr++ = '\\';	// escape regexp atoms
 	    if (*efmp)
 		*ptr++ = *efmp;
 	}
@@ -474,9 +468,9 @@
     for (i = FMT_PATTERNS; i > 0; )
 	sz += (int)STRLEN(fmt_pat[--i].pattern);
 #ifdef BACKSLASH_IN_FILENAME
-    sz += 12; /* "%f" can become twelve chars longer (see efm_to_regpat) */
+    sz += 12; // "%f" can become twelve chars longer (see efm_to_regpat)
 #else
-    sz += 2; /* "%f" can become two chars longer */
+    sz += 2; // "%f" can become two chars longer
 #endif
 
     return sz;
@@ -519,48 +513,38 @@
     if (errmsg == NULL)
 	goto parse_efm_end;
 
-    /*
-     * Each part of the format string is copied and modified from errorformat
-     * to regex prog.  Only a few % characters are allowed.
-     */
+    // Each part of the format string is copied and modified from errorformat
+    // to regex prog.  Only a few % characters are allowed.
 
-    /*
-     * Get some space to modify the format string into.
-     */
+    // Get some space to modify the format string into.
     sz = efm_regpat_bufsz(efm);
     if ((fmtstr = alloc(sz)) == NULL)
 	goto parse_efm_error;
 
     while (efm[0] != NUL)
     {
-	/*
-	 * Allocate a new eformat structure and put it at the end of the list
-	 */
+	// Allocate a new eformat structure and put it at the end of the list
 	fmt_ptr = (efm_T *)alloc_clear((unsigned)sizeof(efm_T));
 	if (fmt_ptr == NULL)
 	    goto parse_efm_error;
-	if (fmt_first == NULL)	    /* first one */
+	if (fmt_first == NULL)	    // first one
 	    fmt_first = fmt_ptr;
 	else
 	    fmt_last->next = fmt_ptr;
 	fmt_last = fmt_ptr;
 
-	/*
-	 * Isolate one part in the 'errorformat' option
-	 */
+	// Isolate one part in the 'errorformat' option
 	len = efm_option_part_len(efm);
 
 	if (efm_to_regpat(efm, len, fmt_ptr, fmtstr, errmsg) == FAIL)
 	    goto parse_efm_error;
 	if ((fmt_ptr->prog = vim_regcomp(fmtstr, RE_MAGIC + RE_STRING)) == NULL)
 	    goto parse_efm_error;
-	/*
-	 * Advance to next part
-	 */
-	efm = skip_to_option_part(efm + len);	/* skip comma and spaces */
+	// Advance to next part
+	efm = skip_to_option_part(efm + len);	// skip comma and spaces
     }
 
-    if (fmt_first == NULL)	/* nothing found */
+    if (fmt_first == NULL)	// nothing found
 	EMSG(_("E378: 'errorformat' contains no pattern"));
 
     goto parse_efm_end;
@@ -611,10 +595,8 @@
 {
     char_u	*p;
 
-    /*
-     * If the line exceeds LINE_MAXLEN exclude the last
-     * byte since it's not a NL character.
-     */
+    // If the line exceeds LINE_MAXLEN exclude the last
+    // byte since it's not a NL character.
     state->linelen = newsz > LINE_MAXLEN ? LINE_MAXLEN - 1 : newsz;
     if (state->growbuf == NULL)
     {
@@ -639,12 +621,12 @@
     static int
 qf_get_next_str_line(qfstate_T *state)
 {
-    /* Get the next line from the supplied string */
+    // Get the next line from the supplied string
     char_u	*p_str = state->p_str;
     char_u	*p;
     int		len;
 
-    if (*p_str == NUL) /* Reached the end of the string */
+    if (*p_str == NUL) // Reached the end of the string
 	return QF_END_OF_INPUT;
 
     p = vim_strchr(p_str, '\n');
@@ -666,10 +648,8 @@
     }
     vim_strncpy(state->linebuf, p_str, state->linelen);
 
-    /*
-     * Increment using len in order to discard the rest of the
-     * line if it exceeds LINE_MAXLEN.
-     */
+    // Increment using len in order to discard the rest of the
+    // line if it exceeds LINE_MAXLEN.
     p_str += len;
     state->p_str = p_str;
 
@@ -688,9 +668,9 @@
     while (p_li != NULL
 	    && (p_li->li_tv.v_type != VAR_STRING
 		|| p_li->li_tv.vval.v_string == NULL))
-	p_li = p_li->li_next;	/* Skip non-string items */
+	p_li = p_li->li_next;	// Skip non-string items
 
-    if (p_li == NULL)		/* End of the list */
+    if (p_li == NULL)		// End of the list
     {
 	state->p_li = NULL;
 	return QF_END_OF_INPUT;
@@ -711,7 +691,7 @@
 
     vim_strncpy(state->linebuf, p_li->li_tv.vval.v_string, state->linelen);
 
-    state->p_li = p_li->li_next;	/* next item */
+    state->p_li = p_li->li_next;	// next item
     return QF_OK;
 }
 
@@ -724,7 +704,7 @@
     char_u	*p_buf = NULL;
     int		len;
 
-    /* Get the next line from the supplied buffer */
+    // Get the next line from the supplied buffer
     if (state->buflnum > state->lnumlast)
 	return QF_END_OF_INPUT;
 
@@ -764,10 +744,8 @@
     state->linelen = (int)STRLEN(IObuff);
     if (state->linelen == IOSIZE - 1 && !(IObuff[state->linelen - 1] == '\n'))
     {
-	/*
-	 * The current line exceeds IObuff, continue reading using
-	 * growbuf until EOL or LINE_MAXLEN bytes is read.
-	 */
+	// The current line exceeds IObuff, continue reading using
+	// growbuf until EOL or LINE_MAXLEN bytes is read.
 	if (state->growbuf == NULL)
 	{
 	    state->growbufsiz = 2 * (IOSIZE - 1);
@@ -776,7 +754,7 @@
 		return QF_NOMEM;
 	}
 
-	/* Copy the read part of the line, excluding null-terminator */
+	// Copy the read part of the line, excluding null-terminator
 	memcpy(state->growbuf, IObuff, IOSIZE - 1);
 	growbuflen = state->linelen;
 
@@ -806,11 +784,9 @@
 
 	while (discard)
 	{
-	    /*
-	     * The current line is longer than LINE_MAXLEN, continue
-	     * reading but discard everything until EOL or EOF is
-	     * reached.
-	     */
+	    // The current line is longer than LINE_MAXLEN, continue
+	    // reading but discard everything until EOL or EOF is
+	    // reached.
 	    if (fgets((char *)IObuff, IOSIZE, state->fd) == NULL
 		    || (int)STRLEN(IObuff) < IOSIZE - 1
 		    || IObuff[IOSIZE - 1] == '\n')
@@ -824,7 +800,7 @@
 	state->linebuf = IObuff;
 
 #ifdef FEAT_MBYTE
-    /* Convert a line if it contains a non-ASCII character. */
+    // Convert a line if it contains a non-ASCII character.
     if (state->vc.vc_type != CONV_NONE && has_non_ascii(state->linebuf))
     {
 	char_u	*line;
@@ -864,24 +840,24 @@
 	if (state->tv != NULL)
 	{
 	    if (state->tv->v_type == VAR_STRING)
-		/* Get the next line from the supplied string */
+		// Get the next line from the supplied string
 		status = qf_get_next_str_line(state);
 	    else if (state->tv->v_type == VAR_LIST)
-		/* Get the next line from the supplied list */
+		// Get the next line from the supplied list
 		status = qf_get_next_list_line(state);
 	}
 	else
-	    /* Get the next line from the supplied buffer */
+	    // Get the next line from the supplied buffer
 	    status = qf_get_next_buf_line(state);
     }
     else
-	/* Get the next line from the supplied file */
+	// Get the next line from the supplied file
 	status = qf_get_next_file_line(state);
 
     if (status != QF_OK)
 	return status;
 
-    /* remove newline/CR from the line */
+    // remove newline/CR from the line
     if (state->linelen > 0 && state->linebuf[state->linelen - 1] == '\n')
     {
 	state->linebuf[state->linelen - 1] = NUL;
@@ -924,16 +900,14 @@
     if (rmp->startp[midx] == NULL || rmp->endp[midx] == NULL)
 	return QF_FAIL;
 
-    /* Expand ~/file and $HOME/file to full path. */
+    // Expand ~/file and $HOME/file to full path.
     c = *rmp->endp[midx];
     *rmp->endp[midx] = NUL;
     expand_env(rmp->startp[midx], fields->namebuf, CMDBUFFSIZE);
     *rmp->endp[midx] = c;
 
-    /*
-     * For separate filename patterns (%O, %P and %Q), the specified file
-     * should exist.
-     */
+    // For separate filename patterns (%O, %P and %Q), the specified file
+    // should exist.
     if (vim_strchr((char_u *)"OPQ", prefix) != NULL
 	    && mch_getperm(fields->namebuf) == -1)
 	return QF_FAIL;
@@ -1004,7 +978,7 @@
 
     if (linelen >= fields->errmsglen)
     {
-	/* linelen + null terminator */
+	// linelen + null terminator
 	if ((p = vim_realloc(fields->errmsg, linelen + 1)) == NULL)
 	    return QF_NOMEM;
 	fields->errmsg = p;
@@ -1029,7 +1003,7 @@
     len = (int)(rmp->endp[midx] - rmp->startp[midx]);
     if (len >= fields->errmsglen)
     {
-	/* len + null terminator */
+	// len + null terminator
 	if ((p = vim_realloc(fields->errmsg, len + 1)) == NULL)
 	    return QF_NOMEM;
 	fields->errmsg = p;
@@ -1181,27 +1155,26 @@
 	fields->type = idx;
     else
 	fields->type = 0;
-    /*
-     * Extract error message data from matched line.
-     * We check for an actual submatch, because "\[" and "\]" in
-     * the 'errorformat' may cause the wrong submatch to be used.
-     */
+
+    // Extract error message data from matched line.
+    // We check for an actual submatch, because "\[" and "\]" in
+    // the 'errorformat' may cause the wrong submatch to be used.
     for (i = 0; i < FMT_PATTERNS; i++)
     {
 	status = QF_OK;
 	midx = (int)fmt_ptr->addr[i];
-	if (i == 0 && midx > 0)				/* %f */
+	if (i == 0 && midx > 0)				// %f
 	    status = qf_parse_fmt_f(regmatch, midx, fields, idx);
 	else if (i == 5)
 	{
-	    if (fmt_ptr->flags == '+' && !qf_multiscan)	/* %+ */
+	    if (fmt_ptr->flags == '+' && !qf_multiscan)	// %+
 		status = qf_parse_fmt_plus(linebuf, linelen, fields);
-	    else if (midx > 0)				/* %m */
+	    else if (midx > 0)				// %m
 		status = qf_parse_fmt_m(regmatch, midx, fields);
 	}
-	else if (i == 6 && midx > 0)			/* %r */
+	else if (i == 6 && midx > 0)			// %r
 	    status = qf_parse_fmt_r(regmatch, midx, tail);
-	else if (midx > 0)				/* others */
+	else if (midx > 0)				// others
 	    status = (qf_parse_fmt[i])(regmatch, midx, fields);
 
 	if (status != QF_OK)
@@ -1247,7 +1220,7 @@
     fields->type = 0;
     *tail = NULL;
 
-    /* Always ignore case when looking for a matching error. */
+    // Always ignore case when looking for a matching error.
     regmatch.rm_ic = TRUE;
     regmatch.regprog = fmt_ptr->prog;
     r = vim_regexec(&regmatch, linebuf, (colnr_T)0);
@@ -1267,7 +1240,7 @@
     static int
 qf_parse_dir_pfx(int idx, qffields_T *fields, qf_list_T *qfl)
 {
-    if (idx == 'D')				/* enter directory */
+    if (idx == 'D')				// enter directory
     {
 	if (*fields->namebuf == NUL)
 	{
@@ -1279,7 +1252,7 @@
 	if (qfl->qf_directory == NULL)
 	    return QF_FAIL;
     }
-    else if (idx == 'X')			/* leave directory */
+    else if (idx == 'X')			// leave directory
 	qfl->qf_directory = qf_pop_dir(&qfl->qf_dir_stack);
 
     return QF_OK;
@@ -1324,18 +1297,18 @@
 {
     char_u	*p;
 
-    fields->namebuf[0] = NUL;	/* no match found, remove file name */
-    fields->lnum = 0;			/* don't jump to this line */
+    fields->namebuf[0] = NUL;	// no match found, remove file name
+    fields->lnum = 0;		// don't jump to this line
     fields->valid = FALSE;
     if (linelen >= fields->errmsglen)
     {
-	/* linelen + null terminator */
+	// linelen + null terminator
 	if ((p = vim_realloc(fields->errmsg, linelen + 1)) == NULL)
 	    return QF_NOMEM;
 	fields->errmsg = p;
 	fields->errmsglen = linelen + 1;
     }
-    /* copy whole line to error message */
+    // copy whole line to error message
     vim_strncpy(fields->errmsg, linebuf, linelen);
 
     return QF_OK;
@@ -1376,7 +1349,7 @@
 	if (qfprev->qf_nr == -1)
 	    qfprev->qf_nr = fields->enr;
 	if (vim_isprintc(fields->type) && !qfprev->qf_type)
-	    /* only printable chars allowed */
+	    // only printable chars allowed
 	    qfprev->qf_type = fields->type;
 
 	if (!qfprev->qf_lnum)
@@ -1419,20 +1392,18 @@
     int			status;
 
 restofline:
-    /* If there was no %> item start at the first pattern */
+    // If there was no %> item start at the first pattern
     if (fmt_start == NULL)
 	fmt_ptr = fmt_first;
     else
     {
-	/* Otherwise start from the last used pattern */
+	// Otherwise start from the last used pattern
 	fmt_ptr = fmt_start;
 	fmt_start = NULL;
     }
 
-    /*
-     * Try to match each part of 'errorformat' until we find a complete
-     * match or no match.
-     */
+    // Try to match each part of 'errorformat' until we find a complete
+    // match or no match.
     fields->valid = TRUE;
     for ( ; fmt_ptr != NULL; fmt_ptr = fmt_ptr->next)
     {
@@ -1450,7 +1421,7 @@
     {
 	if (fmt_ptr != NULL)
 	{
-	    /* 'D' and 'X' directory specifiers */
+	    // 'D' and 'X' directory specifiers
 	    status = qf_parse_dir_pfx(idx, fields, qfl);
 	    if (status != QF_OK)
 		return status;
@@ -1465,31 +1436,31 @@
     }
     else if (fmt_ptr != NULL)
     {
-	/* honor %> item */
+	// honor %> item
 	if (fmt_ptr->conthere)
 	    fmt_start = fmt_ptr;
 
 	if (vim_strchr((char_u *)"AEWI", idx) != NULL)
 	{
-	    qfl->qf_multiline = TRUE;	/* start of a multi-line message */
-	    qfl->qf_multiignore = FALSE;/* reset continuation */
+	    qfl->qf_multiline = TRUE;	// start of a multi-line message
+	    qfl->qf_multiignore = FALSE;// reset continuation
 	}
 	else if (vim_strchr((char_u *)"CZ", idx) != NULL)
-	{				/* continuation of multi-line msg */
+	{				// continuation of multi-line msg
 	    status = qf_parse_multiline_pfx(qi, qf_idx, idx, qfl, fields);
 	    if (status != QF_OK)
 		return status;
 	}
 	else if (vim_strchr((char_u *)"OPQ", idx) != NULL)
-	{				/* global file names */
+	{				// global file names
 	    status = qf_parse_file_pfx(idx, fields, qfl, tail);
 	    if (status == QF_MULTISCAN)
 		goto restofline;
 	}
-	if (fmt_ptr->flags == '-')	/* generally exclude this line */
+	if (fmt_ptr->flags == '-')	// generally exclude this line
 	{
 	    if (qfl->qf_multiline)
-		/* also exclude continuation lines */
+		// also exclude continuation lines
 		qfl->qf_multiignore = TRUE;
 	    return QF_IGNORE_LINE;
 	}
@@ -1624,9 +1595,9 @@
     buf_T	    *buf,
     typval_T	    *tv,
     char_u	    *errorformat,
-    int		    newlist,		/* TRUE: start a new error list */
-    linenr_T	    lnumfirst,		/* first line number to use */
-    linenr_T	    lnumlast,		/* last line number to use */
+    int		    newlist,		// TRUE: start a new error list
+    linenr_T	    lnumfirst,		// first line number to use
+    linenr_T	    lnumlast,		// last line number to use
     char_u	    *qf_title,
     char_u	    *enc)
 {
@@ -1638,10 +1609,10 @@
     static efm_T    *fmt_first = NULL;
     char_u	    *efm;
     static char_u   *last_efm = NULL;
-    int		    retval = -1;	/* default: return error flag */
+    int		    retval = -1;	// default: return error flag
     int		    status;
 
-    /* Do not used the cached buffer, it may have been wiped out. */
+    // Do not used the cached buffer, it may have been wiped out.
     VIM_CLEAR(qf_last_bufname);
 
     vim_memset(&state, 0, sizeof(state));
@@ -1653,13 +1624,13 @@
 
     if (newlist || qf_idx == qi->qf_listcount)
     {
-	/* make place for a new list */
+	// make place for a new list
 	qf_new_list(qi, qf_title);
 	qf_idx = qi->qf_curlist;
     }
     else
     {
-	/* Adding to existing list, use last entry. */
+	// Adding to existing list, use last entry.
 	adding = TRUE;
 	if (!qf_list_empty(qi, qf_idx))
 	    old_last = qi->qf_lists[qf_idx].qf_last;
@@ -1667,48 +1638,42 @@
 
     qfl = &qi->qf_lists[qf_idx];
 
-    /* Use the local value of 'errorformat' if it's set. */
+    // Use the local value of 'errorformat' if it's set.
     if (errorformat == p_efm && tv == NULL && *buf->b_p_efm != NUL)
 	efm = buf->b_p_efm;
     else
 	efm = errorformat;
 
-    /*
-     * If the errorformat didn't change between calls, then reuse the
-     * previously parsed values.
-     */
+    // If the errorformat didn't change between calls, then reuse the
+    // previously parsed values.
     if (last_efm == NULL || (STRCMP(last_efm, efm) != 0))
     {
-	/* free the previously parsed data */
+	// free the previously parsed data
 	VIM_CLEAR(last_efm);
 	free_efm_list(&fmt_first);
 
-	/* parse the current 'efm' */
+	// parse the current 'efm'
 	fmt_first = parse_efm_option(efm);
 	if (fmt_first != NULL)
 	    last_efm = vim_strsave(efm);
     }
 
-    if (fmt_first == NULL)	/* nothing found */
+    if (fmt_first == NULL)	// nothing found
 	goto error2;
 
-    /*
-     * got_int is reset here, because it was probably set when killing the
-     * ":make" command, but we still want to read the errorfile then.
-     */
+    // got_int is reset here, because it was probably set when killing the
+    // ":make" command, but we still want to read the errorfile then.
     got_int = FALSE;
 
-    /*
-     * Read the lines in the error file one by one.
-     * Try to recognize one of the error formats in each line.
-     */
+    // Read the lines in the error file one by one.
+    // Try to recognize one of the error formats in each line.
     while (!got_int)
     {
-	/* Get the next line from a file/buffer/list/string */
+	// Get the next line from a file/buffer/list/string
 	status = qf_get_nextline(&state);
-	if (status == QF_NOMEM)		/* memory alloc failure */
+	if (status == QF_NOMEM)		// memory alloc failure
 	    goto qf_init_end;
-	if (status == QF_END_OF_INPUT)	/* end of input */
+	if (status == QF_END_OF_INPUT)	// end of input
 	    break;
 
 	status = qf_parse_line(qi, qf_idx, state.linebuf, state.linelen,
@@ -1744,7 +1709,7 @@
     {
 	if (qfl->qf_index == 0)
 	{
-	    /* no valid entry found */
+	    // no valid entry found
 	    qfl->qf_ptr = qfl->qf_start;
 	    qfl->qf_index = 1;
 	    qfl->qf_nonevalid = TRUE;
@@ -1755,7 +1720,7 @@
 	    if (qfl->qf_ptr == NULL)
 		qfl->qf_ptr = qfl->qf_start;
 	}
-	/* return number of matches */
+	// return number of matches
 	retval = qfl->qf_count;
 	goto qf_init_end;
     }
@@ -1763,7 +1728,7 @@
 error2:
     if (!adding)
     {
-	/* Error when creating a new list. Free the new list */
+	// Error when creating a new list. Free the new list
 	qf_free(&qi->qf_lists[qi->qf_curlist]);
 	qi->qf_listcount--;
 	if (qi->qf_curlist > 0)
@@ -1787,7 +1752,7 @@
 qf_init(win_T	    *wp,
 	char_u	    *efile,
 	char_u	    *errorformat,
-	int	    newlist,		/* TRUE: start a new error list */
+	int	    newlist,		// TRUE: start a new error list
 	char_u	    *qf_title,
 	char_u	    *enc)
 {
@@ -1848,18 +1813,14 @@
 {
     int		i;
 
-    /*
-     * If the current entry is not the last entry, delete entries beyond
-     * the current entry.  This makes it possible to browse in a tree-like
-     * way with ":grep'.
-     */
+    // If the current entry is not the last entry, delete entries beyond
+    // the current entry.  This makes it possible to browse in a tree-like
+    // way with ":grep'.
     while (qi->qf_listcount > qi->qf_curlist + 1)
 	qf_free(&qi->qf_lists[--qi->qf_listcount]);
 
-    /*
-     * When the stack is full, remove to oldest entry
-     * Otherwise, add a new entry.
-     */
+    // When the stack is full, remove to oldest entry
+    // Otherwise, add a new entry.
     if (qi->qf_listcount == LISTCOUNT)
     {
 	qf_free(&qi->qf_lists[0]);
@@ -1886,12 +1847,12 @@
     qi = *pqi;
     if (qi == NULL)
 	return;
-    *pqi = NULL;	/* Remove reference to this list */
+    *pqi = NULL;	// Remove reference to this list
 
     qi->qf_refcount--;
     if (qi->qf_refcount < 1)
     {
-	/* No references to this location list */
+	// No references to this location list
 	for (i = 0; i < qi->qf_listcount; ++i)
 	    qf_free(&qi->qf_lists[i]);
 	vim_free(qi);
@@ -1909,12 +1870,12 @@
 
     if (wp != NULL)
     {
-	/* location list */
+	// location list
 	ll_free_all(&wp->w_llist);
 	ll_free_all(&wp->w_llist_ref);
     }
     else
-	/* quickfix list */
+	// quickfix list
 	for (i = 0; i < qi->qf_listcount; ++i)
 	    qf_free(&qi->qf_lists[i]);
 }
@@ -1925,24 +1886,24 @@
  */
     static int
 qf_add_entry(
-    qf_info_T	*qi,		/* quickfix list */
-    int		qf_idx,		/* list index */
-    char_u	*dir,		/* optional directory name */
-    char_u	*fname,		/* file name or NULL */
-    char_u	*module,	/* module name or NULL */
-    int		bufnum,		/* buffer number or zero */
-    char_u	*mesg,		/* message */
-    long	lnum,		/* line number */
-    int		col,		/* column */
-    int		vis_col,	/* using visual column */
-    char_u	*pattern,	/* search pattern */
-    int		nr,		/* error number */
-    int		type,		/* type character */
-    int		valid)		/* valid entry */
+    qf_info_T	*qi,		// quickfix list
+    int		qf_idx,		// list index
+    char_u	*dir,		// optional directory name
+    char_u	*fname,		// file name or NULL
+    char_u	*module,	// module name or NULL
+    int		bufnum,		// buffer number or zero
+    char_u	*mesg,		// message
+    long	lnum,		// line number
+    int		col,		// column
+    int		vis_col,	// using visual column
+    char_u	*pattern,	// search pattern
+    int		nr,		// error number
+    int		type,		// type character
+    int		valid)		// valid entry
 {
     qf_list_T	*qfl = &qi->qf_lists[qf_idx];
     qfline_T	*qfp;
-    qfline_T	**lastp;	/* pointer to qf_last or NULL */
+    qfline_T	**lastp;	// pointer to qf_last or NULL
 
     if ((qfp = (qfline_T *)alloc((unsigned)sizeof(qfline_T))) == NULL)
 	return FAIL;
@@ -1983,13 +1944,13 @@
 	return FAIL;
     }
     qfp->qf_nr = nr;
-    if (type != 1 && !vim_isprintc(type)) /* only printable chars allowed */
+    if (type != 1 && !vim_isprintc(type)) // only printable chars allowed
 	type = 0;
     qfp->qf_type = type;
     qfp->qf_valid = valid;
 
     lastp = &qfl->qf_last;
-    if (qf_list_empty(qi, qf_idx))	/* first element in the list */
+    if (qf_list_empty(qi, qf_idx))	// first element in the list
     {
 	qfl->qf_start = qfp;
 	qfl->qf_ptr = qfp;
@@ -2005,8 +1966,7 @@
     qfp->qf_cleared = FALSE;
     *lastp = qfp;
     ++qfl->qf_count;
-    if (qfl->qf_index == 0 && qfp->qf_valid)
-				/* first valid entry */
+    if (qfl->qf_index == 0 && qfp->qf_valid)	// first valid entry
     {
 	qfl->qf_index = qfl->qf_count;
 	qfl->qf_ptr = qfp;
@@ -2037,17 +1997,15 @@
 ll_get_or_alloc_list(win_T *wp)
 {
     if (IS_LL_WINDOW(wp))
-	/* For a location list window, use the referenced location list */
+	// For a location list window, use the referenced location list
 	return wp->w_llist_ref;
 
-    /*
-     * For a non-location list window, w_llist_ref should not point to a
-     * location list.
-     */
+    // For a non-location list window, w_llist_ref should not point to a
+    // location list.
     ll_free_all(&wp->w_llist_ref);
 
     if (wp->w_llist == NULL)
-	wp->w_llist = ll_new_list();	    /* new location list */
+	wp->w_llist = ll_new_list();	    // new location list
     return wp->w_llist;
 }
 
@@ -2195,7 +2153,7 @@
     buf_T	*buf;
     char_u	*bufname;
 
-    if (fname == NULL || *fname == NUL)		/* no file name */
+    if (fname == NULL || *fname == NUL)		// no file name
 	return 0;
 
 #ifdef VMS
@@ -2209,12 +2167,10 @@
     if (directory != NULL && !vim_isAbsName(fname)
 	    && (ptr = concat_fnames(directory, fname, TRUE)) != NULL)
     {
-	/*
-	 * Here we check if the file really exists.
-	 * This should normally be true, but if make works without
-	 * "leaving directory"-messages we might have missed a
-	 * directory change.
-	 */
+	// Here we check if the file really exists.
+	// This should normally be true, but if make works without
+	// "leaving directory"-messages we might have missed a
+	// directory change.
 	if (mch_getperm(ptr) < 0)
 	{
 	    vim_free(ptr);
@@ -2224,7 +2180,7 @@
 	    else
 		ptr = vim_strsave(fname);
 	}
-	/* Use concatenated directory name and file name */
+	// Use concatenated directory name and file name
 	bufname = ptr;
     }
     else
@@ -2264,7 +2220,7 @@
     struct dir_stack_T  *ds_new;
     struct dir_stack_T  *ds_ptr;
 
-    /* allocate new stack element and hook it in */
+    // allocate new stack element and hook it in
     ds_new = (struct dir_stack_T *)alloc((unsigned)sizeof(struct dir_stack_T));
     if (ds_new == NULL)
 	return NULL;
@@ -2272,17 +2228,16 @@
     ds_new->next = *stackptr;
     *stackptr = ds_new;
 
-    /* store directory on the stack */
+    // store directory on the stack
     if (vim_isAbsName(dirbuf)
 	    || (*stackptr)->next == NULL
 	    || (*stackptr && is_file_stack))
 	(*stackptr)->dirname = vim_strsave(dirbuf);
     else
     {
-	/* Okay we don't have an absolute path.
-	 * dirbuf must be a subdir of one of the directories on the stack.
-	 * Let's search...
-	 */
+	// Okay we don't have an absolute path.
+	// dirbuf must be a subdir of one of the directories on the stack.
+	// Let's search...
 	ds_new = (*stackptr)->next;
 	(*stackptr)->dirname = NULL;
 	while (ds_new)
@@ -2296,7 +2251,7 @@
 	    ds_new = ds_new->next;
 	}
 
-	/* clean up all dirs we already left */
+	// clean up all dirs we already left
 	while ((*stackptr)->next != ds_new)
 	{
 	    ds_ptr = (*stackptr)->next;
@@ -2305,7 +2260,7 @@
 	    vim_free(ds_ptr);
 	}
 
-	/* Nothing found -> it must be on top level */
+	// Nothing found -> it must be on top level
 	if (ds_new == NULL)
 	{
 	    vim_free((*stackptr)->dirname);
@@ -2333,10 +2288,10 @@
 {
     struct dir_stack_T  *ds_ptr;
 
-    /* TODO: Should we check if dirbuf is the directory on top of the stack?
-     * What to do if it isn't? */
+    // TODO: Should we check if dirbuf is the directory on top of the stack?
+    // What to do if it isn't?
 
-    /* pop top element and free it */
+    // pop top element and free it
     if (*stackptr != NULL)
     {
 	ds_ptr = *stackptr;
@@ -2345,7 +2300,7 @@
 	vim_free(ds_ptr);
     }
 
-    /* return NEW top element as current dir or NULL if stack is empty*/
+    // return NEW top element as current dir or NULL if stack is empty
     return *stackptr ? (*stackptr)->dirname : NULL;
 }
 
@@ -2392,7 +2347,7 @@
     struct dir_stack_T     *ds_tmp;
     char_u		   *fullname;
 
-    /* no dirs on the stack - there's nothing we can do */
+    // no dirs on the stack - there's nothing we can do
     if (qfl->qf_dir_stack == NULL)
 	return NULL;
 
@@ -2403,9 +2358,8 @@
 	vim_free(fullname);
 	fullname = concat_fnames(ds_ptr->dirname, filename, TRUE);
 
-	/* If concat_fnames failed, just go on. The worst thing that can happen
-	 * is that we delete the entire stack.
-	 */
+	// If concat_fnames failed, just go on. The worst thing that can happen
+	// is that we delete the entire stack.
 	if ((fullname != NULL) && (mch_getperm(fullname) >= 0))
 	    break;
 
@@ -2414,7 +2368,7 @@
 
     vim_free(fullname);
 
-    /* clean up all dirs we already left */
+    // clean up all dirs we already left
     while (qfl->qf_dir_stack->next != ds_ptr)
     {
 	ds_tmp = qfl->qf_dir_stack->next;
@@ -2437,7 +2391,7 @@
 
     if (wp != NULL)
     {
-	qi = GET_LOC_LIST(wp);	    /* Location list */
+	qi = GET_LOC_LIST(wp);	    // Location list
 	if (qi == NULL)
 	    return FALSE;
     }
@@ -2461,13 +2415,13 @@
     qfline_T	*qfp;
     int		i;
 
-    /* Search for the entry in the current list */
+    // Search for the entry in the current list
     for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count;
 	    ++i, qfp = qfp->qf_next)
 	if (qfp == NULL || qfp == qf_ptr)
 	    break;
 
-    if (i == qfl->qf_count) /* Entry is not found */
+    if (i == qfl->qf_count) // Entry is not found
 	return FALSE;
 
     return TRUE;
@@ -2667,16 +2621,14 @@
 	win_enter(wp, TRUE);
     else
     {
-	/*
-	 * Split off help window; put it at far top if no position
-	 * specified, the current window is vertically split and narrow.
-	 */
+	// Split off help window; put it at far top if no position
+	// specified, the current window is vertically split and narrow.
 	flags = WSP_HELP;
 	if (cmdmod.split == 0 && curwin->w_width != Columns
 		&& curwin->w_width < 80)
 	    flags |= WSP_TOP;
 	if (IS_LL_STACK(qi))
-	    flags |= WSP_NEWLOC;  /* don't copy the location list */
+	    flags |= WSP_NEWLOC;  // don't copy the location list
 
 	if (win_split(0, flags) == FAIL)
 	    return FAIL;
@@ -2688,14 +2640,14 @@
 
 	if (IS_LL_STACK(qi))		// not a quickfix list
 	{
-	    /* The new window should use the supplied location list */
+	    // The new window should use the supplied location list
 	    curwin->w_llist = qi;
 	    qi->qf_refcount++;
 	}
     }
 
     if (!p_im)
-	restart_edit = 0;	    /* don't want insert mode in help file */
+	restart_edit = 0;	    // don't want insert mode in help file
 
     return OK;
 }
@@ -2764,14 +2716,14 @@
     if (ll_ref != NULL)
 	flags |= WSP_NEWLOC;
     if (win_split(0, flags) == FAIL)
-	return FAIL;		/* not enough room for window */
-    p_swb = empty_option;	/* don't split again */
+	return FAIL;		// not enough room for window
+    p_swb = empty_option;	// don't split again
     swb_flags = 0;
     RESET_BINDING(curwin);
     if (ll_ref != NULL)
     {
-	/* The new window should use the location list from the
-	 * location list window */
+	// The new window should use the location list from the
+	// location list window
 	curwin->w_llist = ll_ref;
 	ll_ref->qf_refcount++;
     }
@@ -2791,29 +2743,29 @@
 
     if (win == NULL)
     {
-	/* Find the window showing the selected file */
+	// Find the window showing the selected file
 	FOR_ALL_WINDOWS(win)
 	    if (win->w_buffer->b_fnum == qf_fnum)
 		break;
 	if (win == NULL)
 	{
-	    /* Find a previous usable window */
+	    // Find a previous usable window
 	    win = curwin;
 	    do
 	    {
 		if (bt_normal(win->w_buffer))
 		    break;
 		if (win->w_prev == NULL)
-		    win = lastwin;	/* wrap around the top */
+		    win = lastwin;	// wrap around the top
 		else
-		    win = win->w_prev; /* go to previous window */
+		    win = win->w_prev; // go to previous window
 	    } while (win != curwin);
 	}
     }
     win_goto(win);
 
-    /* If the location list for the window is not set, then set it
-     * to the location list from the location window */
+    // If the location list for the window is not set, then set it
+    // to the location list from the location window
     if (win->w_llist == NULL)
     {
 	win->w_llist = ll_ref;
@@ -2841,14 +2793,14 @@
 	if (win->w_buffer->b_fnum == qf_fnum)
 	    break;
 	if (win->w_prev == NULL)
-	    win = lastwin;	/* wrap around the top */
+	    win = lastwin;	// wrap around the top
 	else
-	    win = win->w_prev;	/* go to previous window */
+	    win = win->w_prev;	// go to previous window
 
 	if (IS_QF_WINDOW(win))
 	{
-	    /* Didn't find it, go to the window before the quickfix
-	     * window. */
+	    // Didn't find it, go to the window before the quickfix
+	    // window.
 	    if (altwin != NULL)
 		win = altwin;
 	    else if (curwin->w_prev != NULL)
@@ -2858,7 +2810,7 @@
 	    break;
 	}
 
-	/* Remember a usable window. */
+	// Remember a usable window.
 	if (altwin == NULL && !win->w_p_pvw && bt_normal(win->w_buffer))
 	    altwin = win;
     }
@@ -2885,7 +2837,7 @@
     ll_ref = curwin->w_llist_ref;
     if (ll_ref != NULL)
     {
-	/* Find a non-quickfix window with this location list */
+	// Find a non-quickfix window with this location list
 	usable_win_ptr = qf_find_win_with_loclist(ll_ref);
 	if (usable_win_ptr != NULL)
 	    usable_win = 1;
@@ -2893,34 +2845,30 @@
 
     if (!usable_win)
     {
-	/* Locate a window showing a normal buffer */
+	// Locate a window showing a normal buffer
 	win = qf_find_win_with_normal_buf();
 	if (win != NULL)
 	    usable_win = 1;
     }
 
-    /*
-     * If no usable window is found and 'switchbuf' contains "usetab"
-     * then search in other tabs.
-     */
+    // If no usable window is found and 'switchbuf' contains "usetab"
+    // then search in other tabs.
     if (!usable_win && (swb_flags & SWB_USETAB))
 	usable_win = qf_goto_tabwin_with_file(qf_fnum);
 
-    /*
-     * If there is only one window and it is the quickfix window, create a
-     * new one above the quickfix window.
-     */
+    // If there is only one window and it is the quickfix window, create a
+    // new one above the quickfix window.
     if ((ONE_WINDOW && bt_quickfix(curbuf)) || !usable_win)
     {
 	if (qf_open_new_file_win(ll_ref) != OK)
 	    return FAIL;
-	*opened_window = TRUE;	/* close it when fail */
+	*opened_window = TRUE;	// close it when fail
     }
     else
     {
-	if (curwin->w_llist_ref != NULL)	/* In a location window */
+	if (curwin->w_llist_ref != NULL)	// In a location window
 	    qf_goto_win_with_ll_file(usable_win_ptr, qf_fnum, ll_ref);
-	else					/* In a quickfix window */
+	else					// In a quickfix window
 	    qf_goto_win_with_qfl_file(qf_fnum);
     }
 
@@ -2946,8 +2894,8 @@
 
     if (qf_ptr->qf_type == 1)
     {
-	/* Open help file (do_ecmd() will set b_help flag, readfile() will
-	 * set b_p_ro flag). */
+	// Open help file (do_ecmd() will set b_help flag, readfile() will
+	// set b_p_ro flag).
 	if (!can_abandon(curbuf, forceit))
 	{
 	    no_write_message();
@@ -2968,10 +2916,8 @@
 
 	if (IS_LL_STACK(qi))
 	{
-	    /*
-	     * Location list. Check whether the associated window is still
-	     * present and the list is still valid.
-	     */
+	    // Location list. Check whether the associated window is still
+	    // present and the list is still valid.
 	    if (!win_valid_any_tab(oldwin))
 	    {
 		EMSG(_("E924: Current window was closed"));
@@ -3016,9 +2962,7 @@
 
     if (qf_pattern == NULL)
     {
-	/*
-	 * Go to line with error, unless qf_lnum is 0.
-	 */
+	// Go to line with error, unless qf_lnum is 0.
 	i = qf_lnum;
 	if (i > 0)
 	{
@@ -3034,12 +2978,10 @@
 #endif
 	    if (qf_viscol == TRUE)
 	    {
-		/*
-		 * Check each character from the beginning of the error
-		 * line up to the error column.  For each tab character
-		 * found, reduce the error column value by the length of
-		 * a tab character.
-		 */
+		// Check each character from the beginning of the error
+		// line up to the error column.  For each tab character
+		// found, reduce the error column value by the length of
+		// a tab character.
 		line = ml_get_curline();
 		screen_col = 0;
 		for (char_col = 0; char_col < curwin->w_cursor.col; ++char_col)
@@ -3065,7 +3007,7 @@
     {
 	pos_T save_cursor;
 
-	/* Move the cursor to the first line in the buffer */
+	// Move the cursor to the first line in the buffer
 	save_cursor = curwin->w_cursor;
 	curwin->w_cursor.lnum = 0;
 	if (!do_search(NULL, '/', qf_pattern, (long)1,
@@ -3088,21 +3030,21 @@
     linenr_T		i;
     int			len;
 
-    /* Update the screen before showing the message, unless the screen
-     * scrolled up. */
+    // Update the screen before showing the message, unless the screen
+    // scrolled up.
     if (!msg_scrolled)
 	update_topline_redraw();
     sprintf((char *)IObuff, _("(%d of %d)%s%s: "), qf_index,
 	    qi->qf_lists[qi->qf_curlist].qf_count,
 	    qf_ptr->qf_cleared ? _(" (line deleted)") : "",
 	    (char *)qf_types(qf_ptr->qf_type, qf_ptr->qf_nr));
-    /* Add the message, skipping leading whitespace and newlines. */
+    // Add the message, skipping leading whitespace and newlines.
     len = (int)STRLEN(IObuff);
     qf_fmt_text(skipwhite(qf_ptr->qf_text), IObuff + len, IOSIZE - len);
 
-    /* Output the message.  Overwrite to avoid scrolling when the 'O'
-     * flag is present in 'shortmess'; But when not jumping, print the
-     * whole message. */
+    // Output the message.  Overwrite to avoid scrolling when the 'O'
+    // flag is present in 'shortmess'; But when not jumping, print the
+    // whole message.
     i = msg_scroll;
     if (curbuf == old_curbuf && curwin->w_cursor.lnum == old_lnum)
 	msg_scroll = TRUE;
@@ -3304,9 +3246,7 @@
     }
 }
 
-/*
- * Highlight attributes used for displaying entries from the quickfix list.
- */
+// Highlight attributes used for displaying entries from the quickfix list.
 static int	qfFileAttr;
 static int	qfSepAttr;
 static int	qfLineAttr;
@@ -3333,7 +3273,7 @@
 		&& (buf = buflist_findnr(qfp->qf_fnum)) != NULL)
 	{
 	    fname = buf->b_fname;
-	    if (qfp->qf_type == 1)	/* :helpgrep */
+	    if (qfp->qf_type == 1)	// :helpgrep
 		fname = gettail(fname);
 	}
 	if (fname == NULL)
@@ -3382,14 +3322,14 @@
     }
     msg_puts((char_u *)" ");
 
-    /* Remove newlines and leading whitespace from the text.  For an
-     * unrecognized line keep the indent, the compiler may mark a word
-     * with ^^^^. */
+    // Remove newlines and leading whitespace from the text.  For an
+    // unrecognized line keep the indent, the compiler may mark a word
+    // with ^^^^.
     qf_fmt_text((fname != NULL || qfp->qf_lnum != 0)
 				? skipwhite(qfp->qf_text) : qfp->qf_text,
 				IObuff, IOSIZE);
     msg_prt_line(IObuff, FALSE);
-    out_flush();		/* show one line at a time */
+    out_flush();		// show one line at a time
 }
 
 /*
@@ -3406,8 +3346,8 @@
     int		idx2 = -1;
     char_u	*arg = eap->arg;
     int		plus = FALSE;
-    int		all = eap->forceit;	/* if not :cl!, only show
-						   recognised errors */
+    int		all = eap->forceit;	// if not :cl!, only show
+					// recognised errors
     qf_info_T	*qi = &ql_info;
 
     if (is_loclist_cmd(eap->cmdidx))
@@ -3451,13 +3391,11 @@
 	    idx2 = (-idx2 > i) ? 0 : idx2 + i + 1;
     }
 
-    /* Shorten all the file names, so that it is easy to read */
+    // Shorten all the file names, so that it is easy to read
     shorten_fnames(FALSE);
 
-    /*
-     * Get the attributes for the different quickfix highlight items.  Note
-     * that this depends on syntax items defined in the qf.vim syntax file
-     */
+    // Get the attributes for the different quickfix highlight items.  Note
+    // that this depends on syntax items defined in the qf.vim syntax file
     qfFileAttr = syn_name2attr((char_u *)"qfFileName");
     if (qfFileAttr == 0)
 	qfFileAttr = HL_ATTR(HLF_D);
@@ -3638,9 +3576,9 @@
 	    stop = (qfp == qfpnext);
 	    vim_free(qfp);
 	    if (stop)
-		/* Somehow qf_count may have an incorrect value, set it to 1
-		 * to avoid crashing when it's wrong.
-		 * TODO: Avoid qf_count being incorrect. */
+		// Somehow qf_count may have an incorrect value, set it to 1
+		// to avoid crashing when it's wrong.
+		// TODO: Avoid qf_count being incorrect.
 		qfl->qf_count = 1;
 	}
 	qfl->qf_start = qfpnext;
@@ -3828,14 +3766,12 @@
 	    return;
     }
 
-    /* Look for an existing quickfix window.  */
+    // Look for an existing quickfix window.
     win = qf_find_win(qi);
 
-    /*
-     * If a quickfix window is open but we have no errors to display,
-     * close the window.  If a quickfix window is not open, then open
-     * it if we have errors; otherwise, leave it closed.
-     */
+    // If a quickfix window is open but we have no errors to display,
+    // close the window.  If a quickfix window is not open, then open
+    // it if we have errors; otherwise, leave it closed.
     if (qf_stack_empty(qi)
 	    || qi->qf_lists[qi->qf_curlist].qf_nonevalid
 	    || qf_list_empty(qi, qi->qf_curlist))
@@ -3864,7 +3800,7 @@
 	    return;
     }
 
-    /* Find existing quickfix window and close it. */
+    // Find existing quickfix window and close it.
     win = qf_find_win(qi);
     if (win != NULL)
 	win_close(win, FALSE);
@@ -4052,9 +3988,9 @@
     curwin->w_cursor.coladd = 0;
 #endif
     curwin->w_curswant = 0;
-    update_topline();		/* scroll to show the line */
+    update_topline();		// scroll to show the line
     redraw_later(VALID);
-    curwin->w_redr_status = TRUE;	/* update ruler */
+    curwin->w_redr_status = TRUE;	// update ruler
     curwin = old_curwin;
     curbuf = curwin->w_buffer;
 }
@@ -4093,7 +4029,7 @@
     qf_info_T	*qi = &ql_info;
 
     if (IS_LL_WINDOW(wp))
-	/* In the location list window, use the referenced location list */
+	// In the location list window, use the referenced location list
 	qi = wp->w_llist_ref;
 
     return qi->qf_lists[qi->qf_curlist].qf_index;
@@ -4106,15 +4042,13 @@
     static int
 qf_win_pos_update(
     qf_info_T	*qi,
-    int		old_qf_index)	/* previous qf_index or zero */
+    int		old_qf_index)	// previous qf_index or zero
 {
     win_T	*win;
     int		qf_index = qi->qf_lists[qi->qf_curlist].qf_index;
 
-    /*
-     * Put the cursor on the current error in the quickfix window, so that
-     * it's viewable.
-     */
+    // Put the cursor on the current error in the quickfix window, so that
+    // it's viewable.
     win = qf_find_win(qi);
     if (win != NULL
 	    && qf_index <= win->w_buffer->b_ml.ml_line_count
@@ -4142,12 +4076,10 @@
     static int
 is_qf_win(win_T *win, qf_info_T *qi)
 {
-    /*
-     * A window displaying the quickfix buffer will have the w_llist_ref field
-     * set to NULL.
-     * A window displaying a location list buffer will have the w_llist_ref
-     * pointing to the location list.
-     */
+    // A window displaying the quickfix buffer will have the w_llist_ref field
+    // set to NULL.
+    // A window displaying a location list buffer will have the w_llist_ref
+    // pointing to the location list.
     if (bt_quickfix(win->w_buffer))
 	if ((IS_QF_STACK(qi) && win->w_llist_ref == NULL)
 		|| (IS_LL_STACK(qi) && win->w_llist_ref == qi))
@@ -4216,14 +4148,14 @@
     win_T	*win;
     aco_save_T	aco;
 
-    /* Check if a buffer for the quickfix list exists.  Update it. */
+    // Check if a buffer for the quickfix list exists.  Update it.
     buf = qf_find_buf(qi);
     if (buf != NULL)
     {
 	linenr_T	old_line_count = buf->b_ml.ml_line_count;
 
 	if (old_last == NULL)
-	    /* set curwin/curbuf to buf and save a few things */
+	    // set curwin/curbuf to buf and save a few things
 	    aucmd_prepbuf(&aco, buf);
 
 	qf_update_win_titlevar(qi);
@@ -4235,12 +4167,12 @@
 	{
 	    (void)qf_win_pos_update(qi, 0);
 
-	    /* restore curwin/curbuf and a few other things */
+	    // restore curwin/curbuf and a few other things
 	    aucmd_restbuf(&aco);
 	}
 
-	/* Only redraw when added lines are visible.  This avoids flickering
-	 * when the added lines are not visible. */
+	// Only redraw when added lines are visible.  This avoids flickering
+	// when the added lines are not visible.
 	if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline)
 	    redraw_buf_later(buf, NOT_VALID);
     }
@@ -4264,11 +4196,11 @@
 	    && (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL
 	    && errbuf->b_fname != NULL)
     {
-	if (qfp->qf_type == 1)	/* :helpgrep */
+	if (qfp->qf_type == 1)	// :helpgrep
 	    STRCPY(IObuff, gettail(errbuf->b_fname));
 	else
 	{
-	    /* shorten the file name if not done already */
+	    // shorten the file name if not done already
 	    if (errbuf->b_sfname == NULL
 		    || mch_isFullName(errbuf->b_sfname))
 	    {
@@ -4307,9 +4239,9 @@
     IObuff[len++] = '|';
     IObuff[len++] = ' ';
 
-    /* Remove newlines and leading whitespace from the text.
-     * For an unrecognized line keep the indent, the compiler may
-     * mark a word with ^^^^. */
+    // Remove newlines and leading whitespace from the text.
+    // For an unrecognized line keep the indent, the compiler may
+    // mark a word with ^^^^.
     qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text,
 	    IObuff + len, IOSIZE - len);
 
@@ -4342,19 +4274,19 @@
 	    return;
 	}
 
-	/* delete all existing lines */
+	// delete all existing lines
 	while ((curbuf->b_ml.ml_flags & ML_EMPTY) == 0)
 	    (void)ml_delete((linenr_T)1, FALSE);
     }
 
-    /* Check if there is anything to display */
+    // Check if there is anything to display
     if (!qf_stack_empty(qi))
     {
 	char_u	dirname[MAXPATHL];
 
 	*dirname = NUL;
 
-	/* Add one line for each error */
+	// Add one line for each error
 	if (old_last == NULL)
 	{
 	    qfp = qi->qf_lists[qi->qf_curlist].qf_start;
@@ -4377,23 +4309,23 @@
 	}
 
 	if (old_last == NULL)
-	    /* Delete the empty line which is now at the end */
+	    // Delete the empty line which is now at the end
 	    (void)ml_delete(lnum + 1, FALSE);
     }
 
-    /* correct cursor position */
+    // correct cursor position
     check_lnums(TRUE);
 
     if (old_last == NULL)
     {
-	/* Set the 'filetype' to "qf" each time after filling the buffer.
-	 * This resembles reading a file into a buffer, it's more logical when
-	 * using autocommands. */
+	// Set the 'filetype' to "qf" each time after filling the buffer.
+	// This resembles reading a file into a buffer, it's more logical when
+	// using autocommands.
 	++curbuf_lock;
 	set_option_value((char_u *)"ft", 0L, (char_u *)"qf", OPT_LOCAL);
 	curbuf->b_p_ma = FALSE;
 
-	keep_filetype = TRUE;		/* don't detect 'filetype' */
+	keep_filetype = TRUE;		// don't detect 'filetype'
 	apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL,
 							       FALSE, curbuf);
 	apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL,
@@ -4401,11 +4333,11 @@
 	keep_filetype = FALSE;
 	--curbuf_lock;
 
-	/* make sure it will be redrawn */
+	// make sure it will be redrawn
 	redraw_curbuf_later(NOT_VALID);
     }
 
-    /* Restore KeyTyped, setting 'filetype' may reset it. */
+    // Restore KeyTyped, setting 'filetype' may reset it.
     KeyTyped = old_KeyTyped;
 }
 
@@ -4694,7 +4626,7 @@
 
     if (is_loclist_cmd(eap->cmdidx))
     {
-	/* Location list */
+	// Location list
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
 	    return 0;
@@ -4707,10 +4639,10 @@
 	if (qfp->qf_valid)
 	{
 	    if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo)
-		sz++;	/* Count all valid entries */
+		sz++;	// Count all valid entries
 	    else if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum)
 	    {
-		/* Count the number of files */
+		// Count the number of files
 		sz++;
 		prev_fnum = qfp->qf_fnum;
 	    }
@@ -4731,7 +4663,7 @@
 
     if (is_loclist_cmd(eap->cmdidx))
     {
-	/* Location list */
+	// Location list
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
 	    return 0;
@@ -4755,7 +4687,7 @@
 
     if (is_loclist_cmd(eap->cmdidx))
     {
-	/* Location list */
+	// Location list
 	qi = GET_LOC_LIST(curwin);
 	if (qi == NULL)
 	    return 1;
@@ -4764,7 +4696,7 @@
     qfl = &qi->qf_lists[qi->qf_curlist];
     qfp = qfl->qf_start;
 
-    /* check if the list has valid errors */
+    // check if the list has valid errors
     if (qfl->qf_count <= 0 || qfl->qf_nonevalid)
 	return 1;
 
@@ -4776,7 +4708,7 @@
 	    {
 		if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum)
 		{
-		    /* Count the number of files */
+		    // Count the number of files
 		    eidx++;
 		    prev_fnum = qfp->qf_fnum;
 		}
@@ -4802,7 +4734,7 @@
     int		i, eidx;
     int		prev_fnum = 0;
 
-    /* check if the list has valid errors */
+    // check if the list has valid errors
     if (qfl->qf_count <= 0 || qfl->qf_nonevalid)
 	return 1;
 
@@ -4815,7 +4747,7 @@
 	    {
 		if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum)
 		{
-		    /* Count the number of files */
+		    // Count the number of files
 		    eidx++;
 		    prev_fnum = qfp->qf_fnum;
 		}
@@ -4873,9 +4805,8 @@
 	}
     }
 
-    /* For cdo and ldo commands, jump to the nth valid error.
-     * For cfdo and lfdo commands, jump to the nth valid file entry.
-     */
+    // For cdo and ldo commands, jump to the nth valid error.
+    // For cfdo and lfdo commands, jump to the nth valid file entry.
     if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo
 	    || eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo)
 	errornr = qf_get_nth_valid_entry(&qi->qf_lists[qi->qf_curlist],
@@ -4949,7 +4880,7 @@
     win_T	*wp = NULL;
     qf_info_T	*qi = &ql_info;
     char_u	*au_name = NULL;
-    int_u	save_qfid = 0;		/* init for gcc */
+    int_u	save_qfid = 0;		// init for gcc
     int		res;
 
     switch (eap->cmdidx)
@@ -4986,16 +4917,14 @@
     if (is_loclist_cmd(eap->cmdidx))
 	wp = curwin;
 
-    /*
-     * This function is used by the :cfile, :cgetfile and :caddfile
-     * commands.
-     * :cfile always creates a new quickfix list and jumps to the
-     * first error.
-     * :cgetfile creates a new quickfix list but doesn't jump to the
-     * first error.
-     * :caddfile adds to an existing quickfix list. If there is no
-     * quickfix list then a new list is created.
-     */
+    // This function is used by the :cfile, :cgetfile and :caddfile
+    // commands.
+    // :cfile always creates a new quickfix list and jumps to the
+    // first error.
+    // :cgetfile creates a new quickfix list but doesn't jump to the
+    // first error.
+    // :caddfile adds to an existing quickfix list. If there is no
+    // quickfix list then a new list is created.
     res = qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile
 			&& eap->cmdidx != CMD_laddfile),
 			qf_cmdtitle(*eap->cmdlinep), enc);
@@ -5045,12 +4974,12 @@
     static void
 vgr_init_regmatch(regmmatch_T *regmatch, char_u *s)
 {
-    /* Get the search pattern: either white-separated or enclosed in // */
+    // Get the search pattern: either white-separated or enclosed in //
     regmatch->regprog = NULL;
 
     if (s == NULL || *s == NUL)
     {
-	/* Pattern is empty, use last search pattern. */
+	// Pattern is empty, use last search pattern.
 	if (last_search_pat() == NULL)
 	{
 	    EMSG(_(e_noprevre));
@@ -5083,8 +5012,8 @@
 	vim_free(p);
     }
     msg_clr_eos();
-    msg_didout = FALSE;	    /* overwrite this message */
-    msg_nowait = TRUE;	    /* don't wait for this message */
+    msg_didout = FALSE;	    // overwrite this message
+    msg_nowait = TRUE;	    // don't wait for this message
     msg_col = 0;
     out_flush();
 }
@@ -5105,16 +5034,16 @@
     buf_T	*buf;
 
 #if defined(FEAT_SYN_HL)
-    /* Don't do Filetype autocommands to avoid loading syntax and
-     * indent scripts, a great speed improvement. */
+    // Don't do Filetype autocommands to avoid loading syntax and
+    // indent scripts, a great speed improvement.
     save_ei = au_event_disable(",Filetype");
 #endif
-    /* Don't use modelines here, it's useless. */
+    // Don't use modelines here, it's useless.
     save_mls = p_mls;
     p_mls = 0;
 
-    /* Load file into a buffer, so that 'fileencoding' is detected,
-     * autocommands applied, etc. */
+    // Load file into a buffer, so that 'fileencoding' is detected,
+    // autocommands applied, etc.
     buf = load_dummy_buffer(fname, dirname_start, dirname_now);
 
     p_mls = save_mls;
@@ -5137,18 +5066,18 @@
 	int_u	    qfid,
 	char_u	    *title)
 {
-    /* Verify that the quickfix/location list was not freed by an autocmd */
+    // Verify that the quickfix/location list was not freed by an autocmd
     if (!qflist_valid(wp, qfid))
     {
 	if (wp != NULL)
 	{
-	    /* An autocmd has freed the location list. */
+	    // An autocmd has freed the location list.
 	    EMSG(_(e_loc_list_changed));
 	    return FALSE;
 	}
 	else
 	{
-	    /* Quickfix list is not found, create a new one. */
+	    // Quickfix list is not found, create a new one.
 	    qf_new_list(qi, title);
 	    return TRUE;
 	}
@@ -5184,12 +5113,12 @@
 	while (vim_regexec_multi(regmatch, curwin, buf, lnum,
 		    col, NULL, NULL) > 0)
 	{
-	    /* Pass the buffer number so that it gets used even for a
-	     * dummy buffer, unless duplicate_name is set, then the
-	     * buffer will be wiped out below. */
+	    // Pass the buffer number so that it gets used even for a
+	    // dummy buffer, unless duplicate_name is set, then the
+	    // buffer will be wiped out below.
 	    if (qf_add_entry(qi,
 			qi->qf_curlist,
-			NULL,       /* dir */
+			NULL,       // dir
 			fname,
 			NULL,
 			duplicate_name ? 0 : buf->b_fnum,
@@ -5197,11 +5126,11 @@
 			    regmatch->startpos[0].lnum + lnum, FALSE),
 			regmatch->startpos[0].lnum + lnum,
 			regmatch->startpos[0].col + 1,
-			FALSE,      /* vis_col */
-			NULL,	    /* search pattern */
-			0,	    /* nr */
-			0,	    /* type */
-			TRUE	    /* valid */
+			FALSE,      // vis_col
+			NULL,	    // search pattern
+			0,	    // nr
+			0,	    // type
+			TRUE	    // valid
 			) == FAIL)
 	    {
 		got_int = TRUE;
@@ -5242,11 +5171,11 @@
     buf = curbuf;
     qf_jump(qi, 0, 0, forceit);
     if (buf != curbuf)
-	/* If we jumped to another buffer redrawing will already be
-	 * taken care of. */
+	// If we jumped to another buffer redrawing will already be
+	// taken care of.
 	*redraw_for_dummy = FALSE;
 
-    /* Jump to the directory used after loading the buffer. */
+    // Jump to the directory used after loading the buffer.
     if (curbuf == first_match_buf && target_dir != NULL)
     {
 	exarg_T ea;
@@ -5315,7 +5244,7 @@
     else
 	tomatch = MAXLNUM;
 
-    /* Get the search pattern: either white-separated or enclosed in // */
+    // Get the search pattern: either white-separated or enclosed in //
     regmatch.regprog = NULL;
     title = vim_strsave(qf_cmdtitle(*eap->cmdlinep));
     p = skip_vimgrep_pat(eap->arg, &s, &flags);
@@ -5340,10 +5269,10 @@
 		&& eap->cmdidx != CMD_vimgrepadd
 		&& eap->cmdidx != CMD_lvimgrepadd)
 					|| qf_stack_empty(qi))
-	/* make place for a new list */
+	// make place for a new list
 	qf_new_list(qi, title != NULL ? title : qf_cmdtitle(*eap->cmdlinep));
 
-    /* parse the list of arguments */
+    // parse the list of arguments
     if (get_arglist_exp(p, &fcount, &fnames, TRUE) == FAIL)
 	goto theend;
     if (fcount == 0)
@@ -5360,12 +5289,12 @@
 	goto theend;
     }
 
-    /* Remember the current directory, because a BufRead autocommand that does
-     * ":lcd %:p:h" changes the meaning of short path names. */
+    // Remember the current directory, because a BufRead autocommand that does
+    // ":lcd %:p:h" changes the meaning of short path names.
     mch_dirname(dirname_start, MAXPATHL);
 
-     /* Remember the current quickfix list identifier, so that we can check for
-      * autocommands changing the current quickfix list. */
+    // Remember the current quickfix list identifier, so that we can check for
+    // autocommands changing the current quickfix list.
     save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
 
     seconds = (time_t)0;
@@ -5374,8 +5303,8 @@
 	fname = shorten_fname1(fnames[fi]);
 	if (time(NULL) > seconds)
 	{
-	    /* Display the file name every second or so, show the user we are
-	     * working on it. */
+	    // Display the file name every second or so, show the user we are
+	    // working on it.
 	    seconds = time(NULL);
 	    vgr_display_fname(fname);
 	}
@@ -5383,7 +5312,7 @@
 	buf = buflist_findname_exp(fnames[fi]);
 	if (buf == NULL || buf->b_ml.ml_mfp == NULL)
 	{
-	    /* Remember that a buffer with this name already exists. */
+	    // Remember that a buffer with this name already exists.
 	    duplicate_name = (buf != NULL);
 	    using_dummy = TRUE;
 	    redraw_for_dummy = TRUE;
@@ -5391,11 +5320,11 @@
 	    buf = vgr_load_dummy_buf(fname, dirname_start, dirname_now);
 	}
 	else
-	    /* Use existing, loaded buffer. */
+	    // Use existing, loaded buffer.
 	    using_dummy = FALSE;
 
-	/* Check whether the quickfix list is still valid. When loading a
-	 * buffer above, autocommands might have changed the quickfix list. */
+	// Check whether the quickfix list is still valid. When loading a
+	// buffer above, autocommands might have changed the quickfix list.
 	if (!vgr_qflist_valid(wp, qi, save_qfid, qf_cmdtitle(*eap->cmdlinep)))
 	{
 	    FreeWild(fcount, fnames);
@@ -5410,8 +5339,8 @@
 	}
 	else
 	{
-	    /* Try for a match in all lines of the buffer.
-	     * For ":1vimgrep" look for first match only. */
+	    // Try for a match in all lines of the buffer.
+	    // For ":1vimgrep" look for first match only.
 	    found_match = vgr_match_buflines(qi, fname, buf, &regmatch,
 		    tomatch, duplicate_name, flags);
 
@@ -5421,22 +5350,22 @@
 		    first_match_buf = buf;
 		if (duplicate_name)
 		{
-		    /* Never keep a dummy buffer if there is another buffer
-		     * with the same name. */
+		    // Never keep a dummy buffer if there is another buffer
+		    // with the same name.
 		    wipe_dummy_buffer(buf, dirname_start);
 		    buf = NULL;
 		}
 		else if (!cmdmod.hide
-			    || buf->b_p_bh[0] == 'u'	/* "unload" */
-			    || buf->b_p_bh[0] == 'w'	/* "wipe" */
-			    || buf->b_p_bh[0] == 'd')	/* "delete" */
+			    || buf->b_p_bh[0] == 'u'	// "unload"
+			    || buf->b_p_bh[0] == 'w'	// "wipe"
+			    || buf->b_p_bh[0] == 'd')	// "delete"
 		{
-		    /* When no match was found we don't need to remember the
-		     * buffer, wipe it out.  If there was a match and it
-		     * wasn't the first one or we won't jump there: only
-		     * unload the buffer.
-		     * Ignore 'hidden' here, because it may lead to having too
-		     * many swap files. */
+		    // When no match was found we don't need to remember the
+		    // buffer, wipe it out.  If there was a match and it
+		    // wasn't the first one or we won't jump there: only
+		    // unload the buffer.
+		    // Ignore 'hidden' here, because it may lead to having too
+		    // many swap files.
 		    if (!found_match)
 		    {
 			wipe_dummy_buffer(buf, dirname_start);
@@ -5445,7 +5374,7 @@
 		    else if (buf != first_match_buf || (flags & VGR_NOJUMP))
 		    {
 			unload_dummy_buffer(buf, dirname_start);
-			/* Keeping the buffer, remove the dummy flag. */
+			// Keeping the buffer, remove the dummy flag.
 			buf->b_flags &= ~BF_DUMMY;
 			buf = NULL;
 		    }
@@ -5453,20 +5382,20 @@
 
 		if (buf != NULL)
 		{
-		    /* Keeping the buffer, remove the dummy flag. */
+		    // Keeping the buffer, remove the dummy flag.
 		    buf->b_flags &= ~BF_DUMMY;
 
-		    /* If the buffer is still loaded we need to use the
-		     * directory we jumped to below. */
+		    // If the buffer is still loaded we need to use the
+		    // directory we jumped to below.
 		    if (buf == first_match_buf
 			    && target_dir == NULL
 			    && STRCMP(dirname_start, dirname_now) != 0)
 			target_dir = vim_strsave(dirname_now);
 
-		    /* The buffer is still loaded, the Filetype autocommands
-		     * need to be done now, in that buffer.  And the modelines
-		     * need to be done (again).  But not the window-local
-		     * options! */
+		    // The buffer is still loaded, the Filetype autocommands
+		    // need to be done now, in that buffer.  And the modelines
+		    // need to be done (again).  But not the window-local
+		    // options!
 		    aucmd_prepbuf(&aco, buf);
 #if defined(FEAT_SYN_HL)
 		    apply_autocmds(EVENT_FILETYPE, buf->b_p_ft,
@@ -5491,10 +5420,8 @@
     if (au_name != NULL)
 	apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
 					       curbuf->b_fname, TRUE, curbuf);
-    /*
-     * The QuickFixCmdPost autocmd may free the quickfix list. Check the list
-     * is still valid.
-     */
+    // The QuickFixCmdPost autocmd may free the quickfix list. Check the list
+    // is still valid.
     if (!qflist_valid(wp, save_qfid))
 	goto theend;
 
@@ -5511,8 +5438,8 @@
     else
 	EMSG2(_(e_nomatch2), s);
 
-    /* If we loaded a dummy buffer into the current window, the autocommands
-     * may have messed up things, need to redraw and recompute folds. */
+    // If we loaded a dummy buffer into the current window, the autocommands
+    // may have messed up things, need to redraw and recompute folds.
     if (redraw_for_dummy)
     {
 #ifdef FEAT_FOLDING
@@ -5544,8 +5471,8 @@
 	mch_dirname(dirname_now, MAXPATHL);
 	if (STRCMP(dirname_start, dirname_now) != 0)
 	{
-	    /* If the directory has changed, change it back by building up an
-	     * appropriate ex command and executing it. */
+	    // If the directory has changed, change it back by building up an
+	    // appropriate ex command and executing it.
 	    exarg_T ea;
 
 	    ea.arg = dirname_start;
@@ -5571,8 +5498,8 @@
     static buf_T *
 load_dummy_buffer(
     char_u	*fname,
-    char_u	*dirname_start,  /* in: old directory */
-    char_u	*resulting_dir)  /* out: new directory */
+    char_u	*dirname_start,  // in: old directory
+    char_u	*resulting_dir)  // out: new directory
 {
     buf_T	*newbuf;
     bufref_T	newbufref;
@@ -5581,32 +5508,32 @@
     aco_save_T	aco;
     int		readfile_result;
 
-    /* Allocate a buffer without putting it in the buffer list. */
+    // Allocate a buffer without putting it in the buffer list.
     newbuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
     if (newbuf == NULL)
 	return NULL;
     set_bufref(&newbufref, newbuf);
 
-    /* Init the options. */
+    // Init the options.
     buf_copy_options(newbuf, BCO_ENTER | BCO_NOHELP);
 
-    /* need to open the memfile before putting the buffer in a window */
+    // need to open the memfile before putting the buffer in a window
     if (ml_open(newbuf) == OK)
     {
-	/* Make sure this buffer isn't wiped out by autocommands. */
+	// Make sure this buffer isn't wiped out by autocommands.
 	++newbuf->b_locked;
 
-	/* set curwin/curbuf to buf and save a few things */
+	// set curwin/curbuf to buf and save a few things
 	aucmd_prepbuf(&aco, newbuf);
 
-	/* Need to set the filename for autocommands. */
+	// Need to set the filename for autocommands.
 	(void)setfname(curbuf, fname, NULL, FALSE);
 
-	/* Create swap file now to avoid the ATTENTION message. */
+	// Create swap file now to avoid the ATTENTION message.
 	check_need_swap(TRUE);
 
-	/* Remove the "dummy" flag, otherwise autocommands may not
-	 * work. */
+	// Remove the "dummy" flag, otherwise autocommands may not
+	// work.
 	curbuf->b_flags &= ~BF_DUMMY;
 
 	newbuf_to_wipe.br_buf = NULL;
@@ -5621,30 +5548,28 @@
 	    failed = FALSE;
 	    if (curbuf != newbuf)
 	    {
-		/* Bloody autocommands changed the buffer!  Can happen when
-		 * using netrw and editing a remote file.  Use the current
-		 * buffer instead, delete the dummy one after restoring the
-		 * window stuff. */
+		// Bloody autocommands changed the buffer!  Can happen when
+		// using netrw and editing a remote file.  Use the current
+		// buffer instead, delete the dummy one after restoring the
+		// window stuff.
 		set_bufref(&newbuf_to_wipe, newbuf);
 		newbuf = curbuf;
 	    }
 	}
 
-	/* restore curwin/curbuf and a few other things */
+	// restore curwin/curbuf and a few other things
 	aucmd_restbuf(&aco);
 	if (newbuf_to_wipe.br_buf != NULL && bufref_valid(&newbuf_to_wipe))
 	    wipe_buffer(newbuf_to_wipe.br_buf, FALSE);
 
-	/* Add back the "dummy" flag, otherwise buflist_findname_stat() won't
-	 * skip it. */
+	// Add back the "dummy" flag, otherwise buflist_findname_stat() won't
+	// skip it.
 	newbuf->b_flags |= BF_DUMMY;
     }
 
-    /*
-     * When autocommands/'autochdir' option changed directory: go back.
-     * Let the caller know what the resulting dir was first, in case it is
-     * important.
-     */
+    // When autocommands/'autochdir' option changed directory: go back.
+    // Let the caller know what the resulting dir was first, in case it is
+    // important.
     mch_dirname(resulting_dir, MAXPATHL);
     restore_start_dir(dirname_start);
 
@@ -5666,25 +5591,25 @@
     static void
 wipe_dummy_buffer(buf_T *buf, char_u *dirname_start)
 {
-    if (curbuf != buf)		/* safety check */
+    if (curbuf != buf)		// safety check
     {
 #if defined(FEAT_EVAL)
 	cleanup_T   cs;
 
-	/* Reset the error/interrupt/exception state here so that aborting()
-	 * returns FALSE when wiping out the buffer.  Otherwise it doesn't
-	 * work when got_int is set. */
+	// Reset the error/interrupt/exception state here so that aborting()
+	// returns FALSE when wiping out the buffer.  Otherwise it doesn't
+	// work when got_int is set.
 	enter_cleanup(&cs);
 #endif
 
 	wipe_buffer(buf, FALSE);
 
 #if defined(FEAT_EVAL)
-	/* Restore the error/interrupt/exception state if not discarded by a
-	 * new aborting error, interrupt, or uncaught exception. */
+	// Restore the error/interrupt/exception state if not discarded by a
+	// new aborting error, interrupt, or uncaught exception.
 	leave_cleanup(&cs);
 #endif
-	/* When autocommands/'autochdir' option changed directory: go back. */
+	// When autocommands/'autochdir' option changed directory: go back.
 	restore_start_dir(dirname_start);
     }
 }
@@ -5697,11 +5622,11 @@
     static void
 unload_dummy_buffer(buf_T *buf, char_u *dirname_start)
 {
-    if (curbuf != buf)		/* safety check */
+    if (curbuf != buf)		// safety check
     {
 	close_buffer(NULL, buf, DOBUF_UNLOAD, FALSE);
 
-	/* When autocommands/'autochdir' option changed directory: go back. */
+	// When autocommands/'autochdir' option changed directory: go back.
 	restore_start_dir(dirname_start);
     }
 }
@@ -5741,7 +5666,7 @@
     qfp = qi->qf_lists[qf_idx].qf_start;
     for (i = 1; !got_int && i <= qi->qf_lists[qf_idx].qf_count; ++i)
     {
-	/* Handle entries with a non-existing buffer number. */
+	// Handle entries with a non-existing buffer number.
 	bufnum = qfp->qf_fnum;
 	if (bufnum != 0 && (buflist_findnr(bufnum) == NULL))
 	    bufnum = 0;
@@ -5772,9 +5697,7 @@
     return OK;
 }
 
-/*
- * Flags used by getqflist()/getloclist() to determine which fields to return.
- */
+// Flags used by getqflist()/getloclist() to determine which fields to return.
 enum {
     QF_GETLIST_NONE	= 0x0,
     QF_GETLIST_TITLE	= 0x1,
@@ -5803,12 +5726,11 @@
     dictitem_T	*efm_di;
     list_T	*l;
 
-    /* Only a List value is supported */
+    // Only a List value is supported
     if (di->di_tv.v_type == VAR_LIST && di->di_tv.vval.v_list != NULL)
     {
-	/* If errorformat is supplied then use it, otherwise use the 'efm'
-	 * option setting
-	 */
+	// If errorformat is supplied then use it, otherwise use the 'efm'
+	// option setting
 	if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL)
 	{
 	    if (efm_di->di_tv.v_type != VAR_STRING ||
@@ -5847,8 +5769,8 @@
 {
     win_T	*win;
 
-    /* The quickfix window can be opened even if the quickfix list is not set
-     * using ":copen". This is not true for location lists.  */
+    // The quickfix window can be opened even if the quickfix list is not set
+    // using ":copen". This is not true for location lists.
     if (qi == NULL)
 	return 0;
     win = qf_find_win(qi);
@@ -5922,13 +5844,13 @@
     int		qf_idx;
     dictitem_T	*di;
 
-    qf_idx = qi->qf_curlist;	/* default is the current list */
+    qf_idx = qi->qf_curlist;	// default is the current list
     if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
     {
-	/* Use the specified quickfix/location list */
+	// Use the specified quickfix/location list
 	if (di->di_tv.v_type == VAR_NUMBER)
 	{
-	    /* for zero use the current list */
+	    // for zero use the current list
 	    if (di->di_tv.vval.v_number != 0)
 	    {
 		qf_idx = di->di_tv.vval.v_number - 1;
@@ -5939,7 +5861,7 @@
 	else if (di->di_tv.v_type == VAR_STRING
 		&& di->di_tv.vval.v_string != NULL
 		&& STRCMP(di->di_tv.vval.v_string, "$") == 0)
-	    /* Get the last quickfix list number */
+	    // Get the last quickfix list number
 	    qf_idx = qi->qf_listcount - 1;
 	else
 	    qf_idx = INVALID_QFIDX;
@@ -5947,12 +5869,10 @@
 
     if ((di = dict_find(what, (char_u *)"id", -1)) != NULL)
     {
-	/* Look for a list with the specified id */
+	// Look for a list with the specified id
 	if (di->di_tv.v_type == VAR_NUMBER)
 	{
-	    /*
-	     * For zero, use the current list or the list specified by 'nr'
-	     */
+	    // For zero, use the current list or the list specified by 'nr'
 	    if (di->di_tv.vval.v_number != 0)
 		qf_idx = qf_id2nr(qi, di->di_tv.vval.v_number);
 	}
@@ -6085,7 +6005,7 @@
 {
     int idx = qi->qf_lists[qf_idx].qf_index;
     if (qf_list_empty(qi, qf_idx))
-	/* For empty lists, qf_index is set to 1 */
+	// For empty lists, qf_index is set to 1
 	idx = 0;
     return dict_add_number(retdict, "idx", idx);
 }
@@ -6116,7 +6036,7 @@
     if (!qf_stack_empty(qi))
 	qf_idx = qf_getprop_qfidx(qi, what);
 
-    /* List is not present or is empty */
+    // List is not present or is empty
     if (qf_stack_empty(qi) || qf_idx == INVALID_QFIDX)
 	return qf_getprop_defaults(qi, flags, retdict);
 
@@ -6243,13 +6163,13 @@
 
     if (action == ' ' || qf_idx == qi->qf_listcount)
     {
-	/* make place for a new list */
+	// make place for a new list
 	qf_new_list(qi, title);
 	qf_idx = qi->qf_curlist;
 	qfl = &qi->qf_lists[qf_idx];
     }
     else if (action == 'a' && !qf_list_empty(qi, qf_idx))
-	/* Adding to existing list, use last entry. */
+	// Adding to existing list, use last entry.
 	old_last = qfl->qf_last;
     else if (action == 'r')
     {
@@ -6260,7 +6180,7 @@
     for (li = list->lv_first; li != NULL; li = li->li_next)
     {
 	if (li->li_tv.v_type != VAR_DICT)
-	    continue; /* Skip non-dict items */
+	    continue; // Skip non-dict items
 
 	d = li->li_tv.vval.v_dict;
 	if (d == NULL)
@@ -6272,7 +6192,7 @@
     }
 
     if (qfl->qf_index == 0)
-	/* no valid entry */
+	// no valid entry
 	qfl->qf_nonevalid = TRUE;
     else
 	qfl->qf_nonevalid = FALSE;
@@ -6283,7 +6203,7 @@
 	    qfl->qf_index = 1;
     }
 
-    /* Don't update the cursor in quickfix window when appending entries */
+    // Don't update the cursor in quickfix window when appending entries
     qf_update_buffer(qi, old_last);
 
     return retval;
@@ -6300,31 +6220,29 @@
 	int		*newlist)
 {
     dictitem_T	*di;
-    int		qf_idx = qi->qf_curlist;    /* default is the current list */
+    int		qf_idx = qi->qf_curlist;    // default is the current list
 
     if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
     {
-	/* Use the specified quickfix/location list */
+	// Use the specified quickfix/location list
 	if (di->di_tv.v_type == VAR_NUMBER)
 	{
-	    /* for zero use the current list */
+	    // for zero use the current list
 	    if (di->di_tv.vval.v_number != 0)
 		qf_idx = di->di_tv.vval.v_number - 1;
 
 	    if ((action == ' ' || action == 'a') && qf_idx == qi->qf_listcount)
 	    {
-		/*
-		 * When creating a new list, accept qf_idx pointing to the next
-		 * non-available list and add the new list at the end of the
-		 * stack.
-		 */
+		// When creating a new list, accept qf_idx pointing to the next
+		// non-available list and add the new list at the end of the
+		// stack.
 		*newlist = TRUE;
 		qf_idx = qf_stack_empty(qi) ? 0 : qi->qf_listcount - 1;
 	    }
 	    else if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
 		return INVALID_QFIDX;
 	    else if (action != ' ')
-		*newlist = FALSE;	/* use the specified list */
+		*newlist = FALSE;	// use the specified list
 	}
 	else if (di->di_tv.v_type == VAR_STRING
 		&& di->di_tv.vval.v_string != NULL
@@ -6343,7 +6261,7 @@
 
     if (!*newlist && (di = dict_find(what, (char_u *)"id", -1)) != NULL)
     {
-	/* Use the quickfix/location list with the specified id */
+	// Use the quickfix/location list with the specified id
 	if (di->di_tv.v_type != VAR_NUMBER)
 	    return INVALID_QFIDX;
 
@@ -6406,7 +6324,7 @@
     dictitem_T	*efm_di;
     int		retval = FAIL;
 
-    /* Use the user supplied errorformat settings (if present) */
+    // Use the user supplied errorformat settings (if present)
     if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL)
     {
 	if (efm_di->di_tv.v_type != VAR_STRING ||
@@ -6415,7 +6333,7 @@
 	errorformat = efm_di->di_tv.vval.v_string;
     }
 
-    /* Only a List value is supported */
+    // Only a List value is supported
     if (di->di_tv.v_type != VAR_LIST || di->di_tv.vval.v_list == NULL)
 	return FAIL;
 
@@ -6462,7 +6380,7 @@
 	newlist = TRUE;
 
     qf_idx = qf_setprop_get_qfidx(qi, what, action, &newlist);
-    if (qf_idx == INVALID_QFIDX)	/* List not found */
+    if (qf_idx == INVALID_QFIDX)	// List not found
 	return FAIL;
 
     if (newlist)
@@ -6516,7 +6434,7 @@
 
     if (qfwin != NULL)
     {
-	/* If the quickfix/location list window is open, then clear it */
+	// If the quickfix/location list window is open, then clear it
 	if (qi->qf_curlist < qi->qf_listcount)
 	    qf_free(&qi->qf_lists[qi->qf_curlist]);
 	qf_update_buffer(qi, NULL);
@@ -6524,9 +6442,8 @@
 
     if (wp != NULL && IS_LL_WINDOW(wp))
     {
-	/* If in the location list window, then use the non-location list
-	 * window with this location list (if present)
-	 */
+	// If in the location list window, then use the non-location list
+	// window with this location list (if present)
 	llwin = find_win_with_ll(qi);
 	if (llwin != NULL)
 	    wp = llwin;
@@ -6535,17 +6452,17 @@
     qf_free_all(wp);
     if (wp == NULL)
     {
-	/* quickfix list */
+	// quickfix list
 	qi->qf_curlist = 0;
 	qi->qf_listcount = 0;
     }
     else if (IS_LL_WINDOW(orig_wp))
     {
-	/* If the location list window is open, then create a new empty
-	 * location list */
+	// If the location list window is open, then create a new empty
+	// location list
 	qf_info_T *new_ll = ll_new_list();
 
-	/* first free the list reference in the location list window */
+	// first free the list reference in the location list window
 	ll_free_all(&orig_wp->w_llist_ref);
 
 	orig_wp->w_llist_ref = new_ll;
@@ -6582,7 +6499,7 @@
 
     if (action == 'f')
     {
-	/* Free the entire quickfix or location list stack */
+	// Free the entire quickfix or location list stack
 	qf_free_stack(wp, qi);
     }
     else if (what != NULL)
@@ -6643,10 +6560,9 @@
 	}
 	if (IS_LL_WINDOW(win) && (win->w_llist_ref->qf_refcount == 1))
 	{
-	    /* In a location list window and none of the other windows is
-	     * referring to this location list. Mark the location list
-	     * context as still in use.
-	     */
+	    // In a location list window and none of the other windows is
+	    // referring to this location list. Mark the location list
+	    // context as still in use.
 	    abort = mark_quickfix_ctx(win->w_llist_ref, copyID);
 	    if (abort)
 		return abort;
@@ -6694,7 +6610,7 @@
 #endif
     }
 
-    /* Must come after autocommands. */
+    // Must come after autocommands.
     if (is_loclist_cmd(eap->cmdidx))
     {
 	qi = ll_get_or_alloc_list(curwin);
@@ -6807,8 +6723,8 @@
 	wp = curwin;
     }
 
-    /* Evaluate the expression.  When the result is a string or a list we can
-     * use it to fill the errorlist. */
+    // Evaluate the expression.  When the result is a string or a list we can
+    // use it to fill the errorlist.
     tv = eval_expr(eap->arg, NULL);
     if (tv != NULL)
     {
@@ -6854,21 +6770,21 @@
     win_T	*wp;
     qf_info_T	*qi;
 
-    /* If the current window is a help window, then use it */
+    // If the current window is a help window, then use it
     if (bt_help(curwin->w_buffer))
 	wp = curwin;
     else
-	/* Find an existing help window */
+	// Find an existing help window
 	wp = qf_find_help_win();
 
-    if (wp == NULL)	    /* Help window not found */
+    if (wp == NULL)	    // Help window not found
 	qi = NULL;
     else
 	qi = wp->w_llist;
 
     if (qi == NULL)
     {
-	/* Allocate a new location list for help text matches */
+	// Allocate a new location list for help text matches
 	if ((qi = ll_new_list()) == NULL)
 	    return NULL;
 	*new_ll = TRUE;
@@ -6901,8 +6817,8 @@
     {
 	char_u    *line = IObuff;
 #ifdef FEAT_MBYTE
-	/* Convert a line if 'encoding' is not utf-8 and
-	 * the line contains a non-ASCII character. */
+	// Convert a line if 'encoding' is not utf-8 and
+	// the line contains a non-ASCII character.
 	if (p_vc->vc_type != CONV_NONE
 		&& has_non_ascii(IObuff))
 	{
@@ -6916,25 +6832,25 @@
 	{
 	    int	l = (int)STRLEN(line);
 
-	    /* remove trailing CR, LF, spaces, etc. */
+	    // remove trailing CR, LF, spaces, etc.
 	    while (l > 0 && line[l - 1] <= ' ')
 		line[--l] = NUL;
 
 	    if (qf_add_entry(qi,
 			qi->qf_curlist,
-			NULL,	/* dir */
+			NULL,	// dir
 			fname,
 			NULL,
 			0,
 			line,
 			lnum,
 			(int)(p_regmatch->startp[0] - line)
-			+ 1, /* col */
-			FALSE,	/* vis_col */
-			NULL,	/* search pattern */
-			0,		/* nr */
-			1,		/* type */
-			TRUE	/* valid */
+			+ 1,	// col
+			FALSE,	// vis_col
+			NULL,	// search pattern
+			0,	// nr
+			1,	// type
+			TRUE	// valid
 			) == FAIL)
 	    {
 		got_int = TRUE;
@@ -6976,7 +6892,7 @@
     char_u	**fnames;
     int		fi;
 
-    /* Find all "*.txt" and "*.??x" files in the "doc" directory. */
+    // Find all "*.txt" and "*.??x" files in the "doc" directory.
     add_pathsep(dirname);
     STRCAT(dirname, "doc/*.\\(txt\\|??x\\)");
     if (gen_expand_wildcards(1, &dirname, &fcount,
@@ -6986,7 +6902,7 @@
 	for (fi = 0; fi < fcount && !got_int; ++fi)
 	{
 #ifdef FEAT_MULTI_LANG
-	    /* Skip files for a different language. */
+	    // Skip files for a different language.
 	    if (lang != NULL
 		    && STRNICMP(lang, fnames[fi]
 				    + STRLEN(fnames[fi]) - 3, 2) != 0
@@ -7020,15 +6936,15 @@
 #ifdef FEAT_MBYTE
     vimconv_T	vc;
 
-    /* Help files are in utf-8 or latin1, convert lines when 'encoding'
-     * differs. */
+    // Help files are in utf-8 or latin1, convert lines when 'encoding'
+    // differs.
     vc.vc_type = CONV_NONE;
     if (!enc_utf8)
 	convert_setup(&vc, (char_u *)"utf-8", p_enc);
 #endif
 
 
-    /* Go through all the directories in 'runtimepath' */
+    // Go through all the directories in 'runtimepath'
     p = p_rtp;
     while (*p != NUL && !got_int)
     {
@@ -7124,11 +7040,11 @@
 	apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
 					       curbuf->b_fname, TRUE, curbuf);
 	if (!new_qi && IS_LL_STACK(qi) && qf_find_buf(qi) == NULL)
-	    /* autocommands made "qi" invalid */
+	    // autocommands made "qi" invalid
 	    return;
     }
 
-    /* Jump to first match. */
+    // Jump to first match.
     if (!qf_list_empty(qi, qi->qf_curlist))
 	qf_jump(qi, 0, 0, FALSE);
     else
