diff --git a/src/message.c b/src/message.c
index 0b690bb..522f7d6 100644
--- a/src/message.c
+++ b/src/message.c
@@ -11,7 +11,7 @@
  * message.c: functions for displaying messages on the command line
  */
 
-#define MESSAGE_FILE		/* don't include prototype for smsg() */
+#define MESSAGE_FILE		// don't include prototype for smsg()
 #define USING_FLOAT_STUFF
 
 #include "vim.h"
@@ -33,9 +33,9 @@
 static void redir_write(char_u *s, int maxlen);
 #ifdef FEAT_CON_DIALOG
 static char_u *msg_show_console_dialog(char_u *message, char_u *buttons, int dfltbutton);
-static int	confirm_msg_used = FALSE;	/* displaying confirm_msg */
-static char_u	*confirm_msg = NULL;		/* ":confirm" message */
-static char_u	*confirm_msg_tail;		/* tail of confirm_msg */
+static int	confirm_msg_used = FALSE;	// displaying confirm_msg
+static char_u	*confirm_msg = NULL;		// ":confirm" message
+static char_u	*confirm_msg_tail;		// tail of confirm_msg
 static void display_confirm_msg(void);
 #endif
 #ifdef FEAT_JOB_CHANNEL
@@ -128,14 +128,14 @@
 msg_attr_keep(
     char	*s,
     int		attr,
-    int		keep)	    /* TRUE: set keep_msg if it doesn't scroll */
+    int		keep)	    // TRUE: set keep_msg if it doesn't scroll
 {
     static int	entered = 0;
     int		retval;
     char_u	*buf = NULL;
 
-    /* Skip messages not matching ":filter pattern".
-     * Don't filter when there is an error. */
+    // Skip messages not matching ":filter pattern".
+    // Don't filter when there is an error.
     if (!emsg_on_display && message_filtered((char_u *)s))
 	return TRUE;
 
@@ -153,8 +153,8 @@
 	return TRUE;
     ++entered;
 
-    /* Add message to history (unless it's a repeated kept message or a
-     * truncated message) */
+    // Add message to history (unless it's a repeated kept message or a
+    // truncated message)
     if ((char_u *)s != keep_msg
 	    || (*s != '<'
 		&& last_msg_hist != NULL
@@ -164,11 +164,11 @@
 
 #ifdef FEAT_JOB_CHANNEL
     if (emsg_to_channel_log)
-	/* Write message in the channel log. */
+	// Write message in the channel log.
 	ch_log(NULL, "ERROR: %s", (char *)s);
 #endif
 
-    /* Truncate the message if needed. */
+    // Truncate the message if needed.
     msg_start();
     buf = msg_strtrunc((char_u *)s, FALSE);
     if (buf != NULL)
@@ -194,31 +194,31 @@
     char_u *
 msg_strtrunc(
     char_u	*s,
-    int		force)	    /* always truncate */
+    int		force)	    // always truncate
 {
     char_u	*buf = NULL;
     int		len;
     int		room;
 
-    /* May truncate message to avoid a hit-return prompt */
+    // May truncate message to avoid a hit-return prompt
     if ((!msg_scroll && !need_wait_return && shortmess(SHM_TRUNCALL)
 			       && !exmode_active && msg_silent == 0) || force)
     {
 	len = vim_strsize(s);
 	if (msg_scrolled != 0)
-	    /* Use all the columns. */
+	    // Use all the columns.
 	    room = (int)(Rows - msg_row) * Columns - 1;
 	else
-	    /* Use up to 'showcmd' column. */
+	    // Use up to 'showcmd' column.
 	    room = (int)(Rows - msg_row - 1) * Columns + sc_col - 1;
 	if (len > room && room > 0)
 	{
 	    if (enc_utf8)
-		/* may have up to 18 bytes per cell (6 per char, up to two
-		 * composing chars) */
+		// may have up to 18 bytes per cell (6 per char, up to two
+		// composing chars)
 		len = (room + 2) * 18;
 	    else if (enc_dbcs == DBCS_JPNU)
-		/* may have up to 2 bytes per cell for euc-jp */
+		// may have up to 2 bytes per cell for euc-jp
 		len = (room + 2) * 2;
 	    else
 		len = room + 2;
@@ -241,7 +241,7 @@
     int		room_in,
     int		buflen)
 {
-    size_t	room = room_in - 3; /* "..." takes 3 chars */
+    size_t	room = room_in - 3; // "..." takes 3 chars
     size_t	half;
     size_t	len = 0;
     int		e;
@@ -252,12 +252,12 @@
 	room = 0;
     half = room / 2;
 
-    /* First part: Start of the string. */
+    // First part: Start of the string.
     for (e = 0; len < half && e < buflen; ++e)
     {
 	if (s[e] == NUL)
 	{
-	    /* text fits without truncating! */
+	    // text fits without truncating!
 	    buf[e] = NUL;
 	    return;
 	}
@@ -275,13 +275,13 @@
 	    }
     }
 
-    /* Last part: End of the string. */
+    // Last part: End of the string.
     i = e;
     if (enc_dbcs != 0)
     {
-	/* For DBCS going backwards in a string is slow, but
-	 * computing the cell width isn't too slow: go forward
-	 * until the rest fits. */
+	// For DBCS going backwards in a string is slow, but
+	// computing the cell width isn't too slow: go forward
+	// until the rest fits.
 	n = vim_strsize(s + i);
 	while (len + n > room)
 	{
@@ -291,7 +291,7 @@
     }
     else if (enc_utf8)
     {
-	/* For UTF-8 we can go backwards easily. */
+	// For UTF-8 we can go backwards easily.
 	half = i = (int)STRLEN(s);
 	for (;;)
 	{
@@ -314,7 +314,7 @@
 
     if (i <= e + 3)
     {
-	/* text fits without truncating */
+	// text fits without truncating
 	if (s != buf)
 	{
 	    len = STRLEN(s);
@@ -329,7 +329,7 @@
     }
     else if (e + 3 < buflen)
     {
-	/* set the middle and copy the last part */
+	// set the middle and copy the last part
 	mch_memmove(buf + e, "...", (size_t)3);
 	len = STRLEN(s + i) + 1;
 	if (len >= (size_t)buflen - e - 3)
@@ -339,7 +339,7 @@
     }
     else
     {
-	/* can't fit in the "...", just truncate it */
+	// can't fit in the "...", just truncate it
 	buf[e - 1] = NUL;
     }
 }
@@ -479,8 +479,8 @@
 {
     char_u	*Buf, *p;
 
-    /* lnum is 0 when executing a command from the command line
-     * argument, we don't want a line number then */
+    // lnum is 0 when executing a command from the command line
+    // argument, we don't want a line number then
     if (sourcing_name != NULL
 	    && (other_sourcing_name() || sourcing_lnum != last_sourcing_lnum)
 	    && sourcing_lnum != 0)
@@ -516,10 +516,10 @@
     {
 	msg_attr((char *)p, HL_ATTR(HLF_N));
 	vim_free(p);
-	last_sourcing_lnum = sourcing_lnum;  /* only once for each line */
+	last_sourcing_lnum = sourcing_lnum;  // only once for each line
     }
 
-    /* remember the last sourcing name printed, also when it's empty */
+    // remember the last sourcing name printed, also when it's empty
     if (sourcing_name == NULL || other_sourcing_name())
     {
 	vim_free(last_sourcing_name);
@@ -614,17 +614,17 @@
 #endif
 
 #ifdef FEAT_EVAL
-    /* When testing some errors are turned into a normal message. */
+    // When testing some errors are turned into a normal message.
     if (ignore_error(s))
-	/* don't call msg() if it results in a dialog */
+	// don't call msg() if it results in a dialog
 	return msg_use_printf() ? FALSE : msg((char *)s);
 #endif
 
     called_emsg = TRUE;
 
 #ifdef FEAT_EVAL
-    /* If "emsg_severe" is TRUE: When an error exception is to be thrown,
-     * prefer this message over previous messages for the same command. */
+    // If "emsg_severe" is TRUE: When an error exception is to be thrown,
+    // prefer this message over previous messages for the same command.
     severe = emsg_severe;
     emsg_severe = FALSE;
 #endif
@@ -646,7 +646,7 @@
 	    return TRUE;
 	}
 
-	/* set "v:errmsg", also when using ":silent! cmd" */
+	// set "v:errmsg", also when using ":silent! cmd"
 	set_vim_var_string(VV_ERRMSG, s, -1);
 #endif
 
@@ -683,16 +683,15 @@
 
 	ex_exitval = 1;
 
-	/* Reset msg_silent, an error causes messages to be switched back on.
-	 */
+	// Reset msg_silent, an error causes messages to be switched back on.
 	msg_silent = 0;
 	cmd_silent = FALSE;
 
-	if (global_busy)		/* break :global command */
+	if (global_busy)		// break :global command
 	    ++global_busy;
 
 	if (p_eb)
-	    beep_flush();		/* also includes flush_buffers() */
+	    beep_flush();		// also includes flush_buffers()
 	else
 	    flush_buffers(FLUSH_MINIMAL);  // flush internal buffers
 	++did_emsg;			   // flag for DoOneCmd()
@@ -701,14 +700,14 @@
 #endif
     }
 
-    emsg_on_display = TRUE;	/* remember there is an error message */
-    ++msg_scroll;		/* don't overwrite a previous message */
-    attr = HL_ATTR(HLF_E);	/* set highlight mode for error messages */
+    emsg_on_display = TRUE;	// remember there is an error message
+    ++msg_scroll;		// don't overwrite a previous message
+    attr = HL_ATTR(HLF_E);	// set highlight mode for error messages
     if (msg_scrolled != 0)
-	need_wait_return = TRUE;    /* needed in case emsg() is called after
-				     * wait_return has reset need_wait_return
-				     * and a redraw is expected because
-				     * msg_scrolled is non-zero */
+	need_wait_return = TRUE;    // needed in case emsg() is called after
+				    // wait_return has reset need_wait_return
+				    // and a redraw is expected because
+				    // msg_scrolled is non-zero
 
 #ifdef FEAT_JOB_CHANNEL
     emsg_to_channel_log = TRUE;
@@ -721,7 +720,7 @@
     /*
      * Display the error message itself.
      */
-    msg_nowait = FALSE;			/* wait for this msg */
+    msg_nowait = FALSE;			// wait for this msg
     r = msg_attr((char *)s, attr);
 
 #ifdef FEAT_JOB_CHANNEL
@@ -736,10 +735,10 @@
     int
 emsg(char *s)
 {
-    /* Skip this if not giving error messages at the moment. */
+    // Skip this if not giving error messages at the moment.
     if (!emsg_not_now())
 	return emsg_core((char_u *)s);
-    return TRUE;		/* no error messages at the moment */
+    return TRUE;		// no error messages at the moment
 }
 
 #ifndef PROTO  // manual proto with __attribute__
@@ -831,7 +830,7 @@
     siemsg(_(e_intern2), where);
 }
 
-/* emsg3() and emsgn() are in misc2.c to avoid warnings for the prototypes. */
+// emsg3() and emsgn() are in misc2.c to avoid warnings for the prototypes.
 
     void
 emsg_invreg(int name)
@@ -851,7 +850,7 @@
     int		n;
     char	*ts;
 
-    /* Add message to history before truncating */
+    // Add message to history before truncating
     add_msg_hist((char_u *)s, -1, attr);
 
     ts = (char *)msg_may_trunc(force, (char_u *)s);
@@ -884,7 +883,7 @@
 	{
 	    int	size = vim_strsize(s);
 
-	    /* There may be room anyway when there are multibyte chars. */
+	    // There may be room anyway when there are multibyte chars.
 	    if (size <= room)
 		return s;
 
@@ -904,7 +903,7 @@
     static void
 add_msg_hist(
     char_u	*s,
-    int		len,		/* -1 for undetermined length */
+    int		len,		// -1 for undetermined length
     int		attr)
 {
     struct msg_hist *p;
@@ -912,17 +911,17 @@
     if (msg_hist_off || msg_silent != 0)
 	return;
 
-    /* Don't let the message history get too big */
+    // Don't let the message history get too big
     while (msg_hist_len > MAX_MSG_HIST_LEN)
 	(void)delete_first_msg();
 
-    /* allocate an entry and add the message at the end of the history */
+    // allocate an entry and add the message at the end of the history
     p = ALLOC_ONE(struct msg_hist);
     if (p != NULL)
     {
 	if (len < 0)
 	    len = (int)STRLEN(s);
-	/* remove leading and trailing newlines */
+	// remove leading and trailing newlines
 	while (len > 0 && *s == '\n')
 	{
 	    ++s;
@@ -956,7 +955,7 @@
     p = first_msg_hist;
     first_msg_hist = p->next;
     if (first_msg_hist == NULL)
-	last_msg_hist = NULL;  /* history is empty */
+	last_msg_hist = NULL;  // history is empty
     vim_free(p->msg);
     vim_free(p);
     --msg_hist_len;
@@ -993,13 +992,13 @@
     p = first_msg_hist;
     if (eap->addr_count != 0)
     {
-	/* Count total messages */
+	// Count total messages
 	for (; p != NULL && !got_int; p = p->next)
 	    c++;
 
 	c -= eap->line2;
 
-	/* Skip without number of messages specified */
+	// Skip without number of messages specified
 	for (p = first_msg_hist; p != NULL && !got_int && c > 0;
 						    p = p->next, c--);
     }
@@ -1017,7 +1016,7 @@
 		    HL_ATTR(HLF_T));
     }
 
-    /* Display what was not skipped. */
+    // Display what was not skipped.
     for (; p != NULL && !got_int; p = p->next)
 	if (p->msg != NULL)
 	    msg_attr((char *)p->msg, p->attr);
@@ -1061,8 +1060,8 @@
     if (redraw == TRUE)
 	must_redraw = CLEAR;
 
-    /* If using ":silent cmd", don't wait for a return.  Also don't set
-     * need_wait_return to do it later. */
+    // If using ":silent cmd", don't wait for a return.  Also don't set
+    // need_wait_return to do it later.
     if (msg_silent != 0)
 	return;
 
@@ -1082,36 +1081,36 @@
 	return;
     }
 
-    redir_off = TRUE;		/* don't redirect this message */
+    redir_off = TRUE;		// don't redirect this message
     oldState = State;
     if (quit_more)
     {
-	c = CAR;		/* just pretend CR was hit */
+	c = CAR;		// just pretend CR was hit
 	quit_more = FALSE;
 	got_int = FALSE;
     }
     else if (exmode_active)
     {
-	msg_puts(" ");		/* make sure the cursor is on the right line */
-	c = CAR;		/* no need for a return in ex mode */
+	msg_puts(" ");		// make sure the cursor is on the right line
+	c = CAR;		// no need for a return in ex mode
 	got_int = FALSE;
     }
     else
     {
-	/* Make sure the hit-return prompt is on screen when 'guioptions' was
-	 * just changed. */
+	// Make sure the hit-return prompt is on screen when 'guioptions' was
+	// just changed.
 	screenalloc(FALSE);
 
 	State = HITRETURN;
 	setmouse();
 #ifdef USE_ON_FLY_SCROLL
-	dont_scroll = TRUE;		/* disallow scrolling here */
+	dont_scroll = TRUE;		// disallow scrolling here
 #endif
 	cmdline_row = msg_row;
 
-	/* Avoid the sequence that the user types ":" at the hit-return prompt
-	 * to start an Ex command, but the file-changed dialog gets in the
-	 * way. */
+	// Avoid the sequence that the user types ":" at the hit-return prompt
+	// to start an Ex command, but the file-changed dialog gets in the
+	// way.
 	if (need_check_timestamps)
 	    check_timestamps(FALSE);
 
@@ -1119,18 +1118,18 @@
 
 	do
 	{
-	    /* Remember "got_int", if it is set vgetc() probably returns a
-	     * CTRL-C, but we need to loop then. */
+	    // Remember "got_int", if it is set vgetc() probably returns a
+	    // CTRL-C, but we need to loop then.
 	    had_got_int = got_int;
 
-	    /* Don't do mappings here, we put the character back in the
-	     * typeahead buffer. */
+	    // Don't do mappings here, we put the character back in the
+	    // typeahead buffer.
 	    ++no_mapping;
 	    ++allow_keys;
 
-	    /* Temporarily disable Recording. If Recording is active, the
-	     * character will be recorded later, since it will be added to the
-	     * typebuf after the loop */
+	    // Temporarily disable Recording. If Recording is active, the
+	    // character will be recorded later, since it will be added to the
+	    // typebuf after the loop
 	    save_reg_recording = reg_recording;
 	    save_scriptout = scriptout;
 	    reg_recording = 0;
@@ -1144,9 +1143,9 @@
 	    scriptout = save_scriptout;
 
 #ifdef FEAT_CLIPBOARD
-	    /* Strange way to allow copying (yanking) a modeless selection at
-	     * the hit-enter prompt.  Use CTRL-Y, because the same is used in
-	     * Cmdline-mode and it's harmless when there is no selection. */
+	    // Strange way to allow copying (yanking) a modeless selection at
+	    // the hit-enter prompt.  Use CTRL-Y, because the same is used in
+	    // Cmdline-mode and it's harmless when there is no selection.
 	    if (c == Ctrl_Y && clip_star.state == SELECT_DONE)
 	    {
 		clip_copy_modeless_selection(TRUE);
@@ -1166,7 +1165,7 @@
 						|| c == K_UP || c == K_PAGEUP)
 		{
 		    if (msg_scrolled > Rows)
-			/* scroll back to show older messages */
+			// scroll back to show older messages
 			do_more_prompt(c);
 		    else
 		    {
@@ -1180,7 +1179,7 @@
 		    }
 		    if (quit_more)
 		    {
-			c = CAR;		/* just pretend CR was hit */
+			c = CAR;		// just pretend CR was hit
 			quit_more = FALSE;
 			got_int = FALSE;
 		    }
@@ -1223,11 +1222,11 @@
 	    (void)jump_to_mouse(MOUSE_SETPOS, NULL, 0);
 	else if (vim_strchr((char_u *)"\r\n ", c) == NULL && c != Ctrl_C)
 	{
-	    /* Put the character back in the typeahead buffer.  Don't use the
-	     * stuff buffer, because lmaps wouldn't work. */
+	    // Put the character back in the typeahead buffer.  Don't use the
+	    // stuff buffer, because lmaps wouldn't work.
 	    ins_char_typebuf(c);
-	    do_redraw = TRUE;	    /* need a redraw even though there is
-				       typeahead */
+	    do_redraw = TRUE;	    // need a redraw even though there is
+				    // typeahead
 	}
     }
     redir_off = FALSE;
@@ -1240,7 +1239,7 @@
     {
 	if (!exmode_active)
 	    cmdline_row = msg_row;
-	skip_redraw = TRUE;	    /* skip redraw once */
+	skip_redraw = TRUE;	    // skip redraw once
 	do_redraw = FALSE;
 #ifdef FEAT_TERMINAL
 	skip_term_loop = TRUE;
@@ -1253,7 +1252,7 @@
      * typed.
      */
     tmpState = State;
-    State = oldState;		    /* restore State before set_shellsize */
+    State = oldState;		    // restore State before set_shellsize
     setmouse();
     msg_check();
 
@@ -1267,22 +1266,22 @@
 
     need_wait_return = FALSE;
     did_wait_return = TRUE;
-    emsg_on_display = FALSE;	/* can delete error message now */
-    lines_left = -1;		/* reset lines_left at next msg_start() */
+    emsg_on_display = FALSE;	// can delete error message now
+    lines_left = -1;		// reset lines_left at next msg_start()
     reset_last_sourcing();
     if (keep_msg != NULL && vim_strsize(keep_msg) >=
 				  (Rows - cmdline_row - 1) * Columns + sc_col)
-	VIM_CLEAR(keep_msg);	    /* don't redisplay message, it's too long */
+	VIM_CLEAR(keep_msg);	    // don't redisplay message, it's too long
 
-    if (tmpState == SETWSIZE)	    /* got resize event while in vgetc() */
+    if (tmpState == SETWSIZE)	    // got resize event while in vgetc()
     {
-	starttermcap();		    /* start termcap before redrawing */
+	starttermcap();		    // start termcap before redrawing
 	shell_resized();
     }
     else if (!skip_redraw
 	    && (redraw == TRUE || (msg_scrolled != 0 && redraw != -1)))
     {
-	starttermcap();		    /* start termcap before redrawing */
+	starttermcap();		    // start termcap before redrawing
 	redraw_later(VALID);
     }
 }
@@ -1295,8 +1294,8 @@
 {
     int		save_p_more = p_more;
 
-    p_more = FALSE;	/* don't want see this message when scrolling back */
-    if (msg_didout)	/* start on a new line */
+    p_more = FALSE;	// don't want see this message when scrolling back
+    if (msg_didout)	// start on a new line
 	msg_putchar('\n');
     if (got_int)
 	msg_puts(_("Interrupt: "));
@@ -1350,14 +1349,14 @@
 #ifdef FEAT_EVAL
     if (need_clr_eos)
     {
-	/* Halfway an ":echo" command and getting an (error) message: clear
-	 * any text from the command. */
+	// Halfway an ":echo" command and getting an (error) message: clear
+	// any text from the command.
 	need_clr_eos = FALSE;
 	msg_clr_eos();
     }
 #endif
 
-    if (!msg_scroll && full_screen)	/* overwrite last message */
+    if (!msg_scroll && full_screen)	// overwrite last message
     {
 	msg_row = cmdline_row;
 	msg_col =
@@ -1366,7 +1365,7 @@
 #endif
 	    0;
     }
-    else if (msg_didout)		    /* start message on next line */
+    else if (msg_didout)		    // start message on next line
     {
 	msg_putchar('\n');
 	did_return = TRUE;
@@ -1377,11 +1376,11 @@
 	msg_starthere();
     if (msg_silent == 0)
     {
-	msg_didout = FALSE;		    /* no output on current line yet */
+	msg_didout = FALSE;		    // no output on current line yet
 	cursor_off();
     }
 
-    /* when redirecting, may need to start a new line. */
+    // when redirecting, may need to start a new line.
     if (!did_return)
 	redir_write((char_u *)"\n", -1);
 }
@@ -1505,15 +1504,15 @@
     int		mb_l;
     int		c;
 
-    /* if MSG_HIST flag set, add message to history */
+    // if MSG_HIST flag set, add message to history
     if (attr & MSG_HIST)
     {
 	add_msg_hist(str, len, attr);
 	attr &= ~MSG_HIST;
     }
 
-    /* If the string starts with a composing character first draw a space on
-     * which the composing char can be drawn. */
+    // If the string starts with a composing character first draw a space on
+    // which the composing char can be drawn.
     if (enc_utf8 && utf_iscomposing(utf_ptr2char(msgstr)))
 	msg_puts_attr(" ", attr);
 
@@ -1524,7 +1523,7 @@
     while (--len >= 0)
     {
 	if (enc_utf8)
-	    /* Don't include composing chars after the end. */
+	    // Don't include composing chars after the end.
 	    mb_l = utfc_ptr2len_len(str, len + 1);
 	else if (has_mbyte)
 	    mb_l = (*mb_ptr2len)(str);
@@ -1534,12 +1533,12 @@
 	{
 	    c = (*mb_ptr2char)(str);
 	    if (vim_isprintc(c))
-		/* printable multi-byte char: count the cells. */
+		// printable multi-byte char: count the cells.
 		retval += (*mb_ptr2cells)(str);
 	    else
 	    {
-		/* unprintable multi-byte char: print the printable chars so
-		 * far and the translation of the unprintable char. */
+		// unprintable multi-byte char: print the printable chars so
+		// far and the translation of the unprintable char.
 		if (str > plain_start)
 		    msg_puts_attr_len((char *)plain_start,
 					       (int)(str - plain_start), attr);
@@ -1556,8 +1555,8 @@
 	    s = transchar_byte(*str);
 	    if (s[1] != NUL)
 	    {
-		/* unprintable char: print the printable chars so far and the
-		 * translation of the unprintable char. */
+		// unprintable char: print the printable chars so far and the
+		// translation of the unprintable char.
 		if (str > plain_start)
 		    msg_puts_attr_len((char *)plain_start,
 					       (int)(str - plain_start), attr);
@@ -1572,7 +1571,7 @@
     }
 
     if (str > plain_start)
-	/* print the printable chars at the end */
+	// print the printable chars at the end
 	msg_puts_attr_len((char *)plain_start, (int)(str - plain_start), attr);
 
     return retval;
@@ -1627,7 +1626,7 @@
     attr = HL_ATTR(HLF_8);
     while (*str != NUL)
     {
-	/* Leading and trailing spaces need to be displayed in <> form. */
+	// Leading and trailing spaces need to be displayed in <> form.
 	if ((str == strstart || str[1] == NUL) && *str == ' ')
 	{
 	    text = "<Space>";
@@ -1638,7 +1637,7 @@
 	len = vim_strsize((char_u *)text);
 	if (maxlen > 0 && retval + len >= maxlen)
 	    break;
-	/* Highlight special keys */
+	// Highlight special keys
 	msg_puts_attr(text, len > 1
 		&& (*mb_ptr2len)((char_u *)text) <= 1 ? attr : 0);
 	retval += len;
@@ -1654,7 +1653,7 @@
     char_u *
 str2special_save(
     char_u  *str,
-    int	    is_lhs)  /* TRUE for lhs, FALSE for rhs */
+    int	    is_lhs)  // TRUE for lhs, FALSE for rhs
 {
     garray_T	ga;
     char_u	*p = str;
@@ -1675,7 +1674,7 @@
     char_u *
 str2special(
     char_u	**sp,
-    int		from)	/* TRUE for lhs of mapping */
+    int		from)	// TRUE for lhs of mapping
 {
     int			c;
     static char_u	buf[7];
@@ -1687,8 +1686,8 @@
     {
 	char_u	*p;
 
-	/* Try to un-escape a multi-byte character.  Return the un-escaped
-	 * string if it is a multi-byte character. */
+	// Try to un-escape a multi-byte character.  Return the un-escaped
+	// string if it is a multi-byte character.
 	p = mb_unescape(sp);
 	if (p != NULL)
 	    return p;
@@ -1708,7 +1707,7 @@
 	    c = TO_SPECIAL(str[1], str[2]);
 	    str += 2;
 	}
-	if (IS_SPECIAL(c) || modifiers)	/* special key */
+	if (IS_SPECIAL(c) || modifiers)	// special key
 	    special = TRUE;
     }
 
@@ -1716,23 +1715,23 @@
     {
 	int len = (*mb_ptr2len)(str);
 
-	/* For multi-byte characters check for an illegal byte. */
+	// For multi-byte characters check for an illegal byte.
 	if (has_mbyte && MB_BYTE2LEN(*str) > len)
 	{
 	    transchar_nonprint(buf, c);
 	    *sp = str + 1;
 	    return buf;
 	}
-	/* Since 'special' is TRUE the multi-byte character 'c' will be
-	 * processed by get_special_key_name() */
+	// Since 'special' is TRUE the multi-byte character 'c' will be
+	// processed by get_special_key_name()
 	c = (*mb_ptr2char)(str);
 	*sp = str + len;
     }
     else
 	*sp = str + 1;
 
-    /* Make unprintable characters in <> form, also <M-Space> and <Tab>.
-     * Use <Space> only for lhs of a mapping. */
+    // Make unprintable characters in <> form, also <M-Space> and <Tab>.
+    // Use <Space> only for lhs of a mapping.
     if (special || char2cells(c) > 1 || (from && c == ' '))
 	return get_special_key_name(c, modifiers);
     buf[0] = c;
@@ -1768,7 +1767,7 @@
     int		n_extra = 0;
     int		c_extra = 0;
     int		c_final = 0;
-    char_u	*p_extra = NULL;	    /* init to make SASC shut up */
+    char_u	*p_extra = NULL;	    // init to make SASC shut up
     int		n;
     int		attr = 0;
     char_u	*trail = NULL;
@@ -1778,7 +1777,7 @@
     if (curwin->w_p_list)
 	list = TRUE;
 
-    /* find start of trailing whitespace */
+    // find start of trailing whitespace
     if (list && lcs_trail)
     {
 	trail = s + STRLEN(s);
@@ -1786,8 +1785,8 @@
 	    --trail;
     }
 
-    /* output a space for an empty line, otherwise the line will be
-     * overwritten */
+    // output a space for an empty line, otherwise the line will be
+    // overwritten
     if (*s == NUL && !(list && lcs_eol != NUL))
 	msg_putchar(' ');
 
@@ -1828,7 +1827,7 @@
 	    c = *s++;
 	    if (c == TAB && (!list || lcs_tab1))
 	    {
-		/* tab amount depends on current column */
+		// tab amount depends on current column
 #ifdef FEAT_VARTABS
 		n_extra = tabstop_padding(col, curbuf->b_p_ts,
 						    curbuf->b_p_vts_array) - 1;
@@ -1871,8 +1870,8 @@
 		c_extra = NUL;
 		c_final = NUL;
 		c = *p_extra++;
-		/* Use special coloring to be able to distinguish <hex> from
-		 * the same in plain text. */
+		// Use special coloring to be able to distinguish <hex> from
+		// the same in plain text.
 		attr = HL_ATTR(HLF_8);
 	    }
 	    else if (c == ' ' && trail != NULL && s > trail)
@@ -1905,7 +1904,7 @@
 {
     int		cw;
 
-    msg_didout = TRUE;		/* remember that line is not empty */
+    msg_didout = TRUE;		// remember that line is not empty
     cw = (*mb_ptr2cells)(s);
     if (cw > 1 && (
 #ifdef FEAT_RIGHTLEFT
@@ -1913,7 +1912,7 @@
 #endif
 		msg_col == Columns - 1))
     {
-	/* Doesn't fit, print a highlighted '>' to fill it up. */
+	// Doesn't fit, print a highlighted '>' to fill it up.
 	msg_screen_putchar('>', HL_ATTR(HLF_AT));
 	return s;
     }
@@ -2013,7 +2012,7 @@
     if (msg_silent != 0)
 	return;
 
-    /* if MSG_HIST flag set, add message to history */
+    // if MSG_HIST flag set, add message to history
     if ((attr & MSG_HIST) && maxlen < 0)
     {
 	add_msg_hist((char_u *)str, -1, attr);
@@ -2054,8 +2053,8 @@
     int		recurse)
 {
     char_u	*s = str;
-    char_u	*t_s = str;	/* string from "t_s" to "s" is still todo */
-    int		t_col = 0;	/* screen cells todo, 0 when "t_s" not used */
+    char_u	*t_s = str;	// string from "t_s" to "s" is still todo
+    int		t_col = 0;	// screen cells todo, 0 when "t_s" not used
     int		l;
     int		cw;
     char_u	*sb_str = str;
@@ -2091,21 +2090,21 @@
 	     * ourselves).
 	     */
 	    if (t_col > 0)
-		/* output postponed text */
+		// output postponed text
 		t_puts(&t_col, t_s, s, attr);
 
-	    /* When no more prompt and no more room, truncate here */
+	    // When no more prompt and no more room, truncate here
 	    if (msg_no_more && lines_left == 0)
 		break;
 
-	    /* Scroll the screen up one line. */
+	    // Scroll the screen up one line.
 	    msg_scroll_up();
 
 	    msg_row = Rows - 2;
-	    if (msg_col >= Columns)	/* can happen after screen resize */
+	    if (msg_col >= Columns)	// can happen after screen resize
 		msg_col = Columns - 1;
 
-	    /* Display char in last column before showing more-prompt. */
+	    // Display char in last column before showing more-prompt.
 	    if (*s >= ' '
 #ifdef FEAT_RIGHTLEFT
 		    && !cmdmsg_rl
@@ -2115,7 +2114,7 @@
 		if (has_mbyte)
 		{
 		    if (enc_utf8 && maxlen >= 0)
-			/* avoid including composing chars after the end */
+			// avoid including composing chars after the end
 			l = utfc_ptr2len_len(s, (int)((str + maxlen) - s));
 		    else
 			l = (*mb_ptr2len)(s);
@@ -2129,11 +2128,11 @@
 		did_last_char = FALSE;
 
 	    if (p_more)
-		/* store text for scrolling back */
+		// store text for scrolling back
 		store_sb_text(&sb_str, s, attr, &sb_col, TRUE);
 
 	    inc_msg_scrolled();
-	    need_wait_return = TRUE; /* may need wait_return in main() */
+	    need_wait_return = TRUE; // may need wait_return in main()
 	    redraw_cmdline = TRUE;
 	    if (cmdline_row > 0 && !exmode_active)
 		--cmdline_row;
@@ -2157,8 +2156,8 @@
 		    return;
 	    }
 
-	    /* When we displayed a char in last column need to check if there
-	     * is still more. */
+	    // When we displayed a char in last column need to check if there
+	    // is still more.
 	    if (did_last_char)
 		continue;
 	}
@@ -2169,41 +2168,41 @@
 					    && msg_col + t_col >= Columns - 1);
 	if (t_col > 0 && (wrap || *s == '\r' || *s == '\b'
 						 || *s == '\t' || *s == BELL))
-	    /* output any postponed text */
+	    // output any postponed text
 	    t_puts(&t_col, t_s, s, attr);
 
 	if (wrap && p_more && !recurse)
-	    /* store text for scrolling back */
+	    // store text for scrolling back
 	    store_sb_text(&sb_str, s, attr, &sb_col, TRUE);
 
-	if (*s == '\n')		    /* go to next line */
+	if (*s == '\n')		    // go to next line
 	{
-	    msg_didout = FALSE;	    /* remember that line is empty */
+	    msg_didout = FALSE;	    // remember that line is empty
 #ifdef FEAT_RIGHTLEFT
 	    if (cmdmsg_rl)
 		msg_col = Columns - 1;
 	    else
 #endif
 		msg_col = 0;
-	    if (++msg_row >= Rows)  /* safety check */
+	    if (++msg_row >= Rows)  // safety check
 		msg_row = Rows - 1;
 	}
-	else if (*s == '\r')	    /* go to column 0 */
+	else if (*s == '\r')	    // go to column 0
 	{
 	    msg_col = 0;
 	}
-	else if (*s == '\b')	    /* go to previous char */
+	else if (*s == '\b')	    // go to previous char
 	{
 	    if (msg_col)
 		--msg_col;
 	}
-	else if (*s == TAB)	    /* translate Tab into spaces */
+	else if (*s == TAB)	    // translate Tab into spaces
 	{
 	    do
 		msg_screen_putchar(' ', attr);
 	    while (msg_col & 7);
 	}
-	else if (*s == BELL)		/* beep (from ":sh") */
+	else if (*s == BELL)		// beep (from ":sh")
 	    vim_beep(BO_SH);
 	else
 	{
@@ -2211,7 +2210,7 @@
 	    {
 		cw = (*mb_ptr2cells)(s);
 		if (enc_utf8 && maxlen >= 0)
-		    /* avoid including composing chars after the end */
+		    // avoid including composing chars after the end
 		    l = utfc_ptr2len_len(s, (int)((str + maxlen) - s));
 		else
 		    l = (*mb_ptr2len)(s);
@@ -2222,9 +2221,9 @@
 		l = 1;
 	    }
 
-	    /* When drawing from right to left or when a double-wide character
-	     * doesn't fit, draw a single character here.  Otherwise collect
-	     * characters and draw them all at once later. */
+	    // When drawing from right to left or when a double-wide character
+	    // doesn't fit, draw a single character here.  Otherwise collect
+	    // characters and draw them all at once later.
 	    if (
 # ifdef FEAT_RIGHTLEFT
 		    cmdmsg_rl ||
@@ -2238,7 +2237,7 @@
 	    }
 	    else
 	    {
-		/* postpone this character until later */
+		// postpone this character until later
 		if (t_col == 0)
 		    t_s = s;
 		t_col += cw;
@@ -2248,7 +2247,7 @@
 	++s;
     }
 
-    /* output any postponed text */
+    // output any postponed text
     if (t_col > 0)
 	t_puts(&t_col, t_s, s, attr);
     if (p_more && !recurse)
@@ -2279,25 +2278,25 @@
 msg_scroll_up(void)
 {
 #ifdef FEAT_GUI
-    /* Remove the cursor before scrolling, ScreenLines[] is going
-     * to become invalid. */
+    // Remove the cursor before scrolling, ScreenLines[] is going
+    // to become invalid.
     if (gui.in_use)
 	gui_undraw_cursor();
 #endif
-    /* scrolling up always works */
+    // scrolling up always works
     mch_disable_flush();
     screen_del_lines(0, 0, 1, (int)Rows, TRUE, 0, NULL);
     mch_enable_flush();
 
     if (!can_clear((char_u *)" "))
     {
-	/* Scrolling up doesn't result in the right background.  Set the
-	 * background here.  It's not efficient, but avoids that we have to do
-	 * it all over the code. */
+	// Scrolling up doesn't result in the right background.  Set the
+	// background here.  It's not efficient, but avoids that we have to do
+	// it all over the code.
 	screen_fill((int)Rows - 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0);
 
-	/* Also clear the last char of the last but one line if it was not
-	 * cleared before to avoid a scroll-up. */
+	// Also clear the last char of the last but one line if it was not
+	// cleared before to avoid a scroll-up.
 	if (ScreenAttrs[LineOffset[Rows - 2] + Columns - 1] == (sattr_T)-1)
 	    screen_fill((int)Rows - 2, (int)Rows - 1,
 				 (int)Columns - 1, (int)Columns, ' ', ' ', 0);
@@ -2317,8 +2316,8 @@
 	char_u	    *tofree = NULL;
 	int	    len;
 
-	/* v:scrollstart is empty, set it to the script/function name and line
-	 * number */
+	// v:scrollstart is empty, set it to the script/function name and line
+	// number
 	if (p == NULL)
 	    p = (char_u *)_("Unknown");
 	else
@@ -2350,13 +2349,13 @@
 {
     msgchunk_T	*sb_next;
     msgchunk_T	*sb_prev;
-    char	sb_eol;		/* TRUE when line ends after this text */
-    int		sb_msg_col;	/* column in which text starts */
-    int		sb_attr;	/* text attributes */
-    char_u	sb_text[1];	/* text to be displayed, actually longer */
+    char	sb_eol;		// TRUE when line ends after this text
+    int		sb_msg_col;	// column in which text starts
+    int		sb_attr;	// text attributes
+    char_u	sb_text[1];	// text to be displayed, actually longer
 };
 
-static msgchunk_T *last_msgchunk = NULL; /* last displayed text */
+static msgchunk_T *last_msgchunk = NULL; // last displayed text
 
 static msgchunk_T *msg_sb_start(msgchunk_T *mps);
 
@@ -2367,7 +2366,7 @@
     SB_CLEAR_CMDLINE_DONE
 } sb_clear_T;
 
-/* When to clear text on next msg. */
+// When to clear text on next msg.
 static sb_clear_T do_clear_sb_text = SB_CLEAR_NONE;
 
 /*
@@ -2375,11 +2374,11 @@
  */
     static void
 store_sb_text(
-    char_u	**sb_str,	/* start of string */
-    char_u	*s,		/* just after string */
+    char_u	**sb_str,	// start of string
+    char_u	*s,		// just after string
     int		attr,
     int		*sb_col,
-    int		finish)		/* line ends */
+    int		finish)		// line ends
 {
     msgchunk_T	*mp;
 
@@ -2485,8 +2484,8 @@
 {
     msgchunk_T	*mp;
 
-    /* Only show something if there is more than one line, otherwise it looks
-     * weird, typing a command without output results in one line. */
+    // Only show something if there is more than one line, otherwise it looks
+    // weird, typing a command without output results in one line.
     mp = msg_sb_start(last_msgchunk);
     if (mp == NULL || mp->sb_prev == NULL)
 	vim_beep(BO_MESS);
@@ -2535,7 +2534,7 @@
 	msg_row = row;
 	msg_col = mp->sb_msg_col;
 	p = mp->sb_text;
-	if (*p == '\n')	    /* don't display the line break */
+	if (*p == '\n')	    // don't display the line break
 	    ++p;
 	msg_puts_display(p, -1, mp->sb_attr, TRUE);
 	if (mp->sb_eol || mp->sb_next == NULL)
@@ -2555,13 +2554,13 @@
     char_u	*s,
     int		attr)
 {
-    /* output postponed text */
-    msg_didout = TRUE;		/* remember that line is not empty */
+    // output postponed text
+    msg_didout = TRUE;		// remember that line is not empty
     screen_puts_len(t_s, (int)(s - t_s), msg_row, msg_col, attr);
     msg_col += *t_col;
     *t_col = 0;
-    /* If the string starts with a composing character don't increment the
-     * column position for it. */
+    // If the string starts with a composing character don't increment the
+    // column position for it.
     if (enc_utf8 && utf_iscomposing(utf_ptr2char(t_s)))
 	--msg_col;
     if (msg_col >= Columns)
@@ -2606,7 +2605,7 @@
 
 #ifdef MSWIN
     if (!(silent_mode && p_verbose == 0))
-	mch_settmode(TMODE_COOK);	/* handle CR and NL correctly */
+	mch_settmode(TMODE_COOK);	// handle CR and NL correctly
 #endif
     while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL)
     {
@@ -2702,16 +2701,16 @@
     msgchunk_T	*mp;
     int		i;
 
-    /* We get called recursively when a timer callback outputs a message. In
-     * that case don't show another prompt. Also when at the hit-Enter prompt
-     * and nothing was typed. */
+    // We get called recursively when a timer callback outputs a message. In
+    // that case don't show another prompt. Also when at the hit-Enter prompt
+    // and nothing was typed.
     if (entered || (State == HITRETURN && typed_char == 0))
 	return FALSE;
     entered = TRUE;
 
     if (typed_char == 'G')
     {
-	/* "g<": Find first line on the last page. */
+	// "g<": Find first line on the last page.
 	mp_last = msg_sb_start(last_msgchunk);
 	for (i = 0; i < Rows - 2 && mp_last != NULL
 					     && mp_last->sb_prev != NULL; ++i)
@@ -2729,7 +2728,7 @@
 	 */
 	if (used_typed_char != NUL)
 	{
-	    c = used_typed_char;	/* was typed at hit-enter prompt */
+	    c = used_typed_char;	// was typed at hit-enter prompt
 	    used_typed_char = NUL;
 	}
 	else
@@ -2740,9 +2739,9 @@
 	{
 	    int idx = get_menu_index(current_menu, ASKMORE);
 
-	    /* Used a menu.  If it starts with CTRL-Y, it must
-	     * be a "Copy" for the clipboard.  Otherwise
-	     * assume that we end */
+	    // Used a menu.  If it starts with CTRL-Y, it must
+	    // be a "Copy" for the clipboard.  Otherwise
+	    // assume that we end
 	    if (idx == MENU_INDEX_INVALID)
 		continue;
 	    c = *current_menu->strings[idx];
@@ -2756,72 +2755,72 @@
 	toscroll = 0;
 	switch (c)
 	{
-	case BS:		/* scroll one line back */
+	case BS:		// scroll one line back
 	case K_BS:
 	case 'k':
 	case K_UP:
 	    toscroll = -1;
 	    break;
 
-	case CAR:		/* one extra line */
+	case CAR:		// one extra line
 	case NL:
 	case 'j':
 	case K_DOWN:
 	    toscroll = 1;
 	    break;
 
-	case 'u':		/* Up half a page */
+	case 'u':		// Up half a page
 	    toscroll = -(Rows / 2);
 	    break;
 
-	case 'd':		/* Down half a page */
+	case 'd':		// Down half a page
 	    toscroll = Rows / 2;
 	    break;
 
-	case 'b':		/* one page back */
+	case 'b':		// one page back
 	case K_PAGEUP:
 	    toscroll = -(Rows - 1);
 	    break;
 
-	case ' ':		/* one extra page */
+	case ' ':		// one extra page
 	case 'f':
 	case K_PAGEDOWN:
 	case K_LEFTMOUSE:
 	    toscroll = Rows - 1;
 	    break;
 
-	case 'g':		/* all the way back to the start */
+	case 'g':		// all the way back to the start
 	    toscroll = -999999;
 	    break;
 
-	case 'G':		/* all the way to the end */
+	case 'G':		// all the way to the end
 	    toscroll = 999999;
 	    lines_left = 999999;
 	    break;
 
-	case ':':		/* start new command line */
+	case ':':		// start new command line
 #ifdef FEAT_CON_DIALOG
 	    if (!confirm_msg_used)
 #endif
 	    {
-		/* Since got_int is set all typeahead will be flushed, but we
-		 * want to keep this ':', remember that in a special way. */
+		// Since got_int is set all typeahead will be flushed, but we
+		// want to keep this ':', remember that in a special way.
 		typeahead_noflush(':');
 #ifdef FEAT_TERMINAL
 		skip_term_loop = TRUE;
 #endif
-		cmdline_row = Rows - 1;		/* put ':' on this line */
-		skip_redraw = TRUE;		/* skip redraw once */
-		need_wait_return = FALSE;	/* don't wait in main() */
+		cmdline_row = Rows - 1;		// put ':' on this line
+		skip_redraw = TRUE;		// skip redraw once
+		need_wait_return = FALSE;	// don't wait in main()
 	    }
-	    /* FALLTHROUGH */
-	case 'q':		/* quit */
+	    // FALLTHROUGH
+	case 'q':		// quit
 	case Ctrl_C:
 	case ESC:
 #ifdef FEAT_CON_DIALOG
 	    if (confirm_msg_used)
 	    {
-		/* Jump to the choices of the dialog. */
+		// Jump to the choices of the dialog.
 		retval = TRUE;
 	    }
 	    else
@@ -2830,23 +2829,23 @@
 		got_int = TRUE;
 		quit_more = TRUE;
 	    }
-	    /* When there is some more output (wrapping line) display that
-	     * without another prompt. */
+	    // When there is some more output (wrapping line) display that
+	    // without another prompt.
 	    lines_left = Rows - 1;
 	    break;
 
 #ifdef FEAT_CLIPBOARD
 	case Ctrl_Y:
-	    /* Strange way to allow copying (yanking) a modeless
-	     * selection at the more prompt.  Use CTRL-Y,
-	     * because the same is used in Cmdline-mode and at the
-	     * hit-enter prompt.  However, scrolling one line up
-	     * might be expected... */
+	    // Strange way to allow copying (yanking) a modeless
+	    // selection at the more prompt.  Use CTRL-Y,
+	    // because the same is used in Cmdline-mode and at the
+	    // hit-enter prompt.  However, scrolling one line up
+	    // might be expected...
 	    if (clip_star.state == SELECT_DONE)
 		clip_copy_modeless_selection(TRUE);
 	    continue;
 #endif
-	default:		/* no valid response */
+	default:		// no valid response
 	    msg_moremsg(TRUE);
 	    continue;
 	}
@@ -2855,7 +2854,7 @@
 	{
 	    if (toscroll < 0)
 	    {
-		/* go to start of last line */
+		// go to start of last line
 		if (mp_last == NULL)
 		    mp = msg_sb_start(last_msgchunk);
 		else if (mp_last->sb_prev != NULL)
@@ -2863,14 +2862,14 @@
 		else
 		    mp = NULL;
 
-		/* go to start of line at top of the screen */
+		// go to start of line at top of the screen
 		for (i = 0; i < Rows - 2 && mp != NULL && mp->sb_prev != NULL;
 									  ++i)
 		    mp = msg_sb_start(mp->sb_prev);
 
 		if (mp != NULL && mp->sb_prev != NULL)
 		{
-		    /* Find line to be displayed at top. */
+		    // Find line to be displayed at top.
 		    for (i = 0; i > toscroll; --i)
 		    {
 			if (mp == NULL || mp->sb_prev == NULL)
@@ -2885,12 +2884,12 @@
 		    if (toscroll == -1 && screen_ins_lines(0, 0, 1,
 						     (int)Rows, 0, NULL) == OK)
 		    {
-			/* display line at top */
+			// display line at top
 			(void)disp_sb_line(0, mp);
 		    }
 		    else
 		    {
-			/* redisplay all lines */
+			// redisplay all lines
 			screenclear();
 			for (i = 0; mp != NULL && i < Rows - 1; ++i)
 			{
@@ -2903,10 +2902,10 @@
 	    }
 	    else
 	    {
-		/* First display any text that we scrolled back. */
+		// First display any text that we scrolled back.
 		while (toscroll > 0 && mp_last != NULL)
 		{
-		    /* scroll up, display line at bottom */
+		    // scroll up, display line at bottom
 		    msg_scroll_up();
 		    inc_msg_scrolled();
 		    screen_fill((int)Rows - 2, (int)Rows - 1, 0,
@@ -2918,21 +2917,21 @@
 
 	    if (toscroll <= 0)
 	    {
-		/* displayed the requested text, more prompt again */
+		// displayed the requested text, more prompt again
 		screen_fill((int)Rows - 1, (int)Rows, 0,
 						   (int)Columns, ' ', ' ', 0);
 		msg_moremsg(FALSE);
 		continue;
 	    }
 
-	    /* display more text, return to caller */
+	    // display more text, return to caller
 	    lines_left = toscroll;
 	}
 
 	break;
     }
 
-    /* clear the --more-- message */
+    // clear the --more-- message
     screen_fill((int)Rows - 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0);
     State = oldState;
     setmouse();
@@ -3000,9 +2999,9 @@
 #endif
 
 #if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI) && !defined(VIMDLL)
-    /* On Unix use stderr if it's a tty.
-     * When not going to start the GUI also use stderr.
-     * On Mac, when started from Finder, stderr is the console. */
+    // On Unix use stderr if it's a tty.
+    // When not going to start the GUI also use stderr.
+    // On Mac, when started from Finder, stderr is the console.
     if (
 # ifdef UNIX
 #  ifdef MACOS_X
@@ -3035,7 +3034,7 @@
 #endif
 
 #if !defined(MSWIN) || defined(FEAT_GUI_MSWIN)
-    /* avoid a delay for a message that isn't there */
+    // avoid a delay for a message that isn't there
     emsg_on_display = FALSE;
 
     len = (int)STRLEN(str) + 1;
@@ -3049,7 +3048,7 @@
 	mch_memmove((char_u *)error_ga.ga_data + error_ga.ga_len,
 							  (char_u *)str, len);
 # ifdef UNIX
-	/* remove CR characters, they are displayed */
+	// remove CR characters, they are displayed
 	{
 	    char_u	*p;
 
@@ -3063,7 +3062,7 @@
 	    }
 	}
 # endif
-	--len;		/* don't count the NUL at the end */
+	--len;		// don't count the NUL at the end
 	error_ga.ga_len += len;
     }
 #endif
@@ -3103,10 +3102,10 @@
 mch_msg(char *str)
 {
 #if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI) && !defined(VIMDLL)
-    /* On Unix use stdout if we have a tty.  This allows "vim -h | more" and
-     * uses mch_errmsg() when started from the desktop.
-     * When not going to start the GUI also use stdout.
-     * On Mac, when started from Finder, stderr is the console. */
+    // On Unix use stdout if we have a tty.  This allows "vim -h | more" and
+    // uses mch_errmsg() when started from the desktop.
+    // When not going to start the GUI also use stdout.
+    // On Mac, when started from Finder, stderr is the console.
     if (
 # ifdef UNIX
 #  ifdef MACOS_X
@@ -3141,7 +3140,7 @@
     mch_errmsg(str);
 #endif
 }
-#endif /* USE_MCH_ERRMSG */
+#endif // USE_MCH_ERRMSG
 
 /*
  * Put a character on the screen at the current message position and advance
@@ -3150,7 +3149,7 @@
     static void
 msg_screen_putchar(int c, int attr)
 {
-    msg_didout = TRUE;		/* remember that line is not empty */
+    msg_didout = TRUE;		// remember that line is not empty
     screen_putchar(c, msg_row, msg_col, attr);
 #ifdef FEAT_RIGHTLEFT
     if (cmdmsg_rl)
@@ -3195,27 +3194,27 @@
 {
     if (State == ASKMORE)
     {
-	msg_moremsg(TRUE);	/* display --more-- message again */
+	msg_moremsg(TRUE);	// display --more-- message again
 	msg_row = Rows - 1;
     }
 #ifdef FEAT_CON_DIALOG
     else if (State == CONFIRM)
     {
-	display_confirm_msg();	/* display ":confirm" message again */
+	display_confirm_msg();	// display ":confirm" message again
 	msg_row = Rows - 1;
     }
 #endif
     else if (State == EXTERNCMD)
     {
-	windgoto(msg_row, msg_col); /* put cursor back */
+	windgoto(msg_row, msg_col); // put cursor back
     }
     else if (State == HITRETURN || State == SETWSIZE)
     {
 	if (msg_row == Rows - 1)
 	{
-	    /* Avoid drawing the "hit-enter" prompt below the previous one,
-	     * overwrite it.  Esp. useful when regaining focus and a
-	     * FocusGained autocmd exists but didn't draw anything. */
+	    // Avoid drawing the "hit-enter" prompt below the previous one,
+	    // overwrite it.  Esp. useful when regaining focus and a
+	    // FocusGained autocmd exists but didn't draw anything.
 	    msg_didout = FALSE;
 	    msg_col = 0;
 	    msg_clr_eos();
@@ -3265,12 +3264,12 @@
 {
     if (msg_use_printf())
     {
-	if (full_screen)	/* only when termcap codes are valid */
+	if (full_screen)	// only when termcap codes are valid
 	{
 	    if (*T_CD)
-		out_str(T_CD);	/* clear to end of display */
+		out_str(T_CD);	// clear to end of display
 	    else if (*T_CE)
-		out_str(T_CE);	/* clear to end of line */
+		out_str(T_CE);	// clear to end of line
 	}
     }
     else
@@ -3349,17 +3348,17 @@
     char_u	*s = str;
     static int	cur_col = 0;
 
-    /* Don't do anything for displaying prompts and the like. */
+    // Don't do anything for displaying prompts and the like.
     if (redir_off)
 	return;
 
-    /* If 'verbosefile' is set prepare for writing in that file. */
+    // If 'verbosefile' is set prepare for writing in that file.
     if (*p_vfile != NUL && verbose_fd == NULL)
 	verbose_open();
 
     if (redirecting())
     {
-	/* If the string doesn't start with CR or NL, go to msg_col */
+	// If the string doesn't start with CR or NL, go to msg_col
 	if (*s != '\n' && *s != '\r')
 	{
 	    while (cur_col < msg_col)
@@ -3390,7 +3389,7 @@
 	    var_redir_str(s, maxlen);
 #endif
 
-	/* Write and adjust the current column. */
+	// Write and adjust the current column.
 	while (*s != NUL && (maxlen < 0 || (int)(s - str) < maxlen))
 	{
 #ifdef FEAT_EVAL
@@ -3409,7 +3408,7 @@
 	    ++s;
 	}
 
-	if (msg_silent != 0)	/* should update msg_col */
+	if (msg_silent != 0)	// should update msg_col
 	    msg_col = cur_col;
     }
 }
@@ -3456,7 +3455,7 @@
     if (*p_vfile != NUL)
 	++msg_silent;
     else
-	/* always scroll up, don't overwrite */
+	// always scroll up, don't overwrite
 	msg_scroll = TRUE;
 }
 
@@ -3498,7 +3497,7 @@
 {
     if (verbose_fd == NULL && !verbose_did_open)
     {
-	/* Only give the error message once. */
+	// Only give the error message once.
 	verbose_did_open = TRUE;
 
 	verbose_fd = mch_fopen((char *)p_vfile, "a");
@@ -3518,11 +3517,11 @@
     void
 give_warning(char_u *message, int hl)
 {
-    /* Don't do this for ":silent". */
+    // Don't do this for ":silent".
     if (msg_silent != 0)
 	return;
 
-    /* Don't want a hit-enter prompt here. */
+    // Don't want a hit-enter prompt here.
     ++no_wait_return;
 
 #ifdef FEAT_EVAL
@@ -3535,8 +3534,8 @@
 	keep_msg_attr = 0;
     if (msg_attr((char *)message, keep_msg_attr) && msg_scrolled == 0)
 	set_keep_msg(message, keep_msg_attr);
-    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;
 
     --no_wait_return;
@@ -3566,12 +3565,12 @@
     void
 msg_advance(int col)
 {
-    if (msg_silent != 0)	/* nothing to advance to */
+    if (msg_silent != 0)	// nothing to advance to
     {
-	msg_col = col;		/* for redirection, may fill it up later */
+	msg_col = col;		// for redirection, may fill it up later
 	return;
     }
-    if (col >= Columns)		/* not enough room */
+    if (col >= Columns)		// not enough room
 	col = Columns - 1;
 #ifdef FEAT_RIGHTLEFT
     if (cmdmsg_rl)
@@ -3609,10 +3608,10 @@
     char_u	*message,
     char_u	*buttons,
     int		dfltbutton,
-    char_u	*textfield UNUSED,	/* IObuff for inputdialog(), NULL
-					   otherwise */
-    int		ex_cmd)	    /* when TRUE pressing : accepts default and starts
-			       Ex command */
+    char_u	*textfield UNUSED,	// IObuff for inputdialog(), NULL
+					// otherwise
+    int		ex_cmd)	    // when TRUE pressing : accepts default and starts
+			    // Ex command
 {
     int		oldState;
     int		retval = 0;
@@ -3621,24 +3620,24 @@
     int		i;
 
 #ifndef NO_CONSOLE
-    /* Don't output anything in silent mode ("ex -s") */
+    // Don't output anything in silent mode ("ex -s")
     if (silent_mode)
-	return dfltbutton;   /* return default option */
+	return dfltbutton;   // return default option
 #endif
 
 #ifdef FEAT_GUI_DIALOG
-    /* When GUI is running and 'c' not in 'guioptions', use the GUI dialog */
+    // When GUI is running and 'c' not in 'guioptions', use the GUI dialog
     if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL)
     {
 	c = gui_mch_dialog(type, title, message, buttons, dfltbutton,
 							   textfield, ex_cmd);
-	/* avoid a hit-enter prompt without clearing the cmdline */
+	// avoid a hit-enter prompt without clearing the cmdline
 	need_wait_return = FALSE;
 	emsg_on_display = FALSE;
 	cmdline_row = msg_row;
 
-	/* Flush output to avoid that further messages and redrawing is done
-	 * in the wrong order. */
+	// Flush output to avoid that further messages and redrawing is done
+	// in the wrong order.
 	out_flush();
 	gui_mch_update();
 
@@ -3661,20 +3660,20 @@
     {
 	for (;;)
 	{
-	    /* Get a typed character directly from the user. */
+	    // Get a typed character directly from the user.
 	    c = get_keystroke();
 	    switch (c)
 	    {
-	    case CAR:		/* User accepts default option */
+	    case CAR:		// User accepts default option
 	    case NL:
 		retval = dfltbutton;
 		break;
-	    case Ctrl_C:	/* User aborts/cancels */
+	    case Ctrl_C:	// User aborts/cancels
 	    case ESC:
 		retval = 0;
 		break;
-	    default:		/* Could be a hotkey? */
-		if (c < 0)	/* special keys are ignored here */
+	    default:		// Could be a hotkey?
+		if (c < 0)	// special keys are ignored here
 		    continue;
 		if (c == ':' && ex_cmd)
 		{
@@ -3683,7 +3682,7 @@
 		    break;
 		}
 
-		/* Make the character lowercase, as chars in "hotkeys" are. */
+		// Make the character lowercase, as chars in "hotkeys" are.
 		c = MB_TOLOWER(c);
 		retval = 1;
 		for (i = 0; hotkeys[i]; ++i)
@@ -3701,7 +3700,7 @@
 		}
 		if (hotkeys[i])
 		    break;
-		/* No hotkey match, so keep waiting */
+		// No hotkey match, so keep waiting
 		continue;
 	    }
 	    break;
@@ -3726,7 +3725,7 @@
 copy_char(
     char_u	*from,
     char_u	*to,
-    int		lowercase)	/* make character lower case */
+    int		lowercase)	// make character lower case
 {
     int		len;
     int		c;
@@ -3772,7 +3771,7 @@
 {
     int		len = 0;
 #define HOTK_LEN (has_mbyte ? MB_MAXBYTES : 1)
-    int		lenhotkey = HOTK_LEN;	/* count first button */
+    int		lenhotkey = HOTK_LEN;	// count first button
     char_u	*hotk = NULL;
     char_u	*msgp = NULL;
     char_u	*hotkp = NULL;
@@ -3780,7 +3779,7 @@
     int		copy;
 #define HAS_HOTKEY_LEN 30
     char_u	has_hotkey[HAS_HOTKEY_LEN];
-    int		first_hotkey = FALSE;	/* first char of button is hotkey */
+    int		first_hotkey = FALSE;	// first char of button is hotkey
     int		idx;
 
     has_hotkey[0] = FALSE;
@@ -3800,9 +3799,9 @@
 		if (copy)
 		{
 		    *msgp++ = ',';
-		    *msgp++ = ' ';	    /* '\n' -> ', ' */
+		    *msgp++ = ' ';	    // '\n' -> ', '
 
-		    /* advance to next hotkey and set default hotkey */
+		    // advance to next hotkey and set default hotkey
 		    if (has_mbyte)
 			hotkp += STRLEN(hotkp);
 		    else
@@ -3811,14 +3810,14 @@
 		    if (dfltbutton)
 			--dfltbutton;
 
-		    /* If no hotkey is specified first char is used. */
+		    // If no hotkey is specified first char is used.
 		    if (idx < HAS_HOTKEY_LEN - 1 && !has_hotkey[++idx])
 			first_hotkey = TRUE;
 		}
 		else
 		{
-		    len += 3;		    /* '\n' -> ', '; 'x' -> '(x)' */
-		    lenhotkey += HOTK_LEN;  /* each button needs a hotkey */
+		    len += 3;		    // '\n' -> ', '; 'x' -> '(x)'
+		    lenhotkey += HOTK_LEN;  // each button needs a hotkey
 		    if (idx < HAS_HOTKEY_LEN - 1)
 			has_hotkey[++idx] = FALSE;
 		}
@@ -3830,34 +3829,34 @@
 		first_hotkey = FALSE;
 		if (copy)
 		{
-		    if (*r == DLG_HOTKEY_CHAR)		/* '&&a' -> '&a' */
+		    if (*r == DLG_HOTKEY_CHAR)		// '&&a' -> '&a'
 			*msgp++ = *r;
 		    else
 		    {
-			/* '&a' -> '[a]' */
+			// '&a' -> '[a]'
 			*msgp++ = (dfltbutton == 1) ? '[' : '(';
 			msgp += copy_char(r, msgp, FALSE);
 			*msgp++ = (dfltbutton == 1) ? ']' : ')';
 
-			/* redefine hotkey */
+			// redefine hotkey
 			hotkp[copy_char(r, hotkp, TRUE)] = NUL;
 		    }
 		}
 		else
 		{
-		    ++len;	    /* '&a' -> '[a]' */
+		    ++len;	    // '&a' -> '[a]'
 		    if (idx < HAS_HOTKEY_LEN - 1)
 			has_hotkey[idx] = TRUE;
 		}
 	    }
 	    else
 	    {
-		/* everything else copy literally */
+		// everything else copy literally
 		if (copy)
 		    msgp += copy_char(r, msgp, FALSE);
 	    }
 
-	    /* advance to the next character */
+	    // advance to the next character
 	    MB_PTR_ADV(r);
 	}
 
@@ -3870,16 +3869,16 @@
 	else
 	{
 	    len += (int)(STRLEN(message)
-			+ 2			/* for the NL's */
+			+ 2			// for the NL's
 			+ STRLEN(buttons)
-			+ 3);			/* for the ": " and NUL */
-	    lenhotkey++;			/* for the NUL */
+			+ 3);			// for the ": " and NUL
+	    lenhotkey++;			// for the NUL
 
-	    /* If no hotkey is specified first char is used. */
+	    // If no hotkey is specified first char is used.
 	    if (!has_hotkey[0])
 	    {
 		first_hotkey = TRUE;
-		len += 2;		/* "x" -> "[x]" */
+		len += 2;		// "x" -> "[x]"
 	    }
 
 	    /*
@@ -3900,12 +3899,12 @@
 	    msgp = confirm_msg + 1 + STRLEN(message);
 	    hotkp = hotk;
 
-	    /* Define first default hotkey.  Keep the hotkey string NUL
-	     * terminated to avoid reading past the end. */
+	    // Define first default hotkey.  Keep the hotkey string NUL
+	    // terminated to avoid reading past the end.
 	    hotkp[copy_char(buttons, hotkp, TRUE)] = NUL;
 
-	    /* Remember where the choices start, displaying starts here when
-	     * "hotkp" typed at the more prompt. */
+	    // Remember where the choices start, displaying starts here when
+	    // "hotkp" typed at the more prompt.
 	    confirm_msg_tail = msgp;
 	    *msgp++ = '\n';
 	}
@@ -3921,14 +3920,14 @@
     static void
 display_confirm_msg(void)
 {
-    /* avoid that 'q' at the more prompt truncates the message here */
+    // avoid that 'q' at the more prompt truncates the message here
     ++confirm_msg_used;
     if (confirm_msg != NULL)
 	msg_puts_attr((char *)confirm_msg, HL_ATTR(HLF_M));
     --confirm_msg_used;
 }
 
-#endif /* FEAT_CON_DIALOG */
+#endif // FEAT_CON_DIALOG
 
 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
 
@@ -3986,7 +3985,7 @@
     return VIM_CANCEL;
 }
 
-#endif /* FEAT_GUI_DIALOG || FEAT_CON_DIALOG */
+#endif // FEAT_GUI_DIALOG || FEAT_CON_DIALOG
 
 #if defined(FEAT_EVAL)
 static char *e_printf = N_("E766: Insufficient arguments for printf()");
@@ -4134,11 +4133,11 @@
  * "typval_T".  When the latter is not used it must be NULL.
  */
 
-/* When generating prototypes all of this is skipped, cproto doesn't
- * understand this. */
+// When generating prototypes all of this is skipped, cproto doesn't
+// understand this.
 #ifndef PROTO
 
-/* Like vim_vsnprintf() but append to the string. */
+// Like vim_vsnprintf() but append to the string.
     int
 vim_snprintf_add(char *str, size_t str_m, const char *fmt, ...)
 {
@@ -4200,7 +4199,7 @@
 	    char    *q = strchr(p + 1, '%');
 	    size_t  n = (q == NULL) ? STRLEN(p) : (size_t)(q - p);
 
-	    /* Copy up to the next '%' or NUL without any changes. */
+	    // Copy up to the next '%' or NUL without any changes.
 	    if (str_l < str_m)
 	    {
 		size_t avail = str_m - str_l;
@@ -4216,18 +4215,18 @@
 	    int	    zero_padding = 0, precision_specified = 0, justify_left = 0;
 	    int	    alternate_form = 0, force_sign = 0;
 
-	    /* If both the ' ' and '+' flags appear, the ' ' flag should be
-	     * ignored. */
+	    // If both the ' ' and '+' flags appear, the ' ' flag should be
+	    // ignored.
 	    int	    space_for_positive = 1;
 
-	    /* allowed values: \0, h, l, L */
+	    // allowed values: \0, h, l, L
 	    char    length_modifier = '\0';
 
-	    /* temporary buffer for simple numeric->string conversion */
+	    // temporary buffer for simple numeric->string conversion
 # if defined(FEAT_FLOAT)
-#  define TMP_LEN 350	/* On my system 1e308 is the biggest number possible.
-			 * That sounds reasonable to use as the maximum
-			 * printable. */
+#  define TMP_LEN 350	// On my system 1e308 is the biggest number possible.
+			// That sounds reasonable to use as the maximum
+			// printable.
 # elif defined(FEAT_NUM64)
 #  define TMP_LEN 66
 # else
@@ -4235,34 +4234,34 @@
 # endif
 	    char    tmp[TMP_LEN];
 
-	    /* string address in case of string argument */
+	    // string address in case of string argument
 	    const char  *str_arg = NULL;
 
-	    /* natural field width of arg without padding and sign */
+	    // natural field width of arg without padding and sign
 	    size_t  str_arg_l;
 
-	    /* unsigned char argument value - only defined for c conversion.
-	     * N.B. standard explicitly states the char argument for the c
-	     * conversion is unsigned */
+	    // unsigned char argument value - only defined for c conversion.
+	    // N.B. standard explicitly states the char argument for the c
+	    // conversion is unsigned
 	    unsigned char uchar_arg;
 
-	    /* number of zeros to be inserted for numeric conversions as
-	     * required by the precision or minimal field width */
+	    // number of zeros to be inserted for numeric conversions as
+	    // required by the precision or minimal field width
 	    size_t  number_of_zeros_to_pad = 0;
 
-	    /* index into tmp where zero padding is to be inserted */
+	    // index into tmp where zero padding is to be inserted
 	    size_t  zero_padding_insertion_ind = 0;
 
-	    /* current conversion specifier character */
+	    // current conversion specifier character
 	    char    fmt_spec = '\0';
 
-	    /* buffer for 's' and 'S' specs */
+	    // buffer for 's' and 'S' specs
 	    char_u  *tofree = NULL;
 
 
-	    p++;  /* skip '%' */
+	    p++;  // skip '%'
 
-	    /* parse flags */
+	    // parse flags
 	    while (*p == '0' || *p == '-' || *p == '+' || *p == ' '
 						   || *p == '#' || *p == '\'')
 	    {
@@ -4272,18 +4271,18 @@
 		    case '-': justify_left = 1; break;
 		    case '+': force_sign = 1; space_for_positive = 0; break;
 		    case ' ': force_sign = 1;
-			      /* If both the ' ' and '+' flags appear, the ' '
-			       * flag should be ignored */
+			      // If both the ' ' and '+' flags appear, the ' '
+			      // flag should be ignored
 			      break;
 		    case '#': alternate_form = 1; break;
 		    case '\'': break;
 		}
 		p++;
 	    }
-	    /* If the '0' and '-' flags both appear, the '0' flag should be
-	     * ignored. */
+	    // If the '0' and '-' flags both appear, the '0' flag should be
+	    // ignored.
 
-	    /* parse field width */
+	    // parse field width
 	    if (*p == '*')
 	    {
 		int j;
@@ -4304,8 +4303,8 @@
 	    }
 	    else if (VIM_ISDIGIT((int)(*p)))
 	    {
-		/* size_t could be wider than unsigned int; make sure we treat
-		 * argument like common implementations do */
+		// size_t could be wider than unsigned int; make sure we treat
+		// argument like common implementations do
 		unsigned int uj = *p++ - '0';
 
 		while (VIM_ISDIGIT((int)(*p)))
@@ -4313,7 +4312,7 @@
 		min_field_width = uj;
 	    }
 
-	    /* parse precision */
+	    // parse precision
 	    if (*p == '.')
 	    {
 		p++;
@@ -4338,8 +4337,8 @@
 		}
 		else if (VIM_ISDIGIT((int)(*p)))
 		{
-		    /* size_t could be wider than unsigned int; make sure we
-		     * treat argument like common implementations do */
+		    // size_t could be wider than unsigned int; make sure we
+		    // treat argument like common implementations do
 		    unsigned int uj = *p++ - '0';
 
 		    while (VIM_ISDIGIT((int)(*p)))
@@ -4348,25 +4347,25 @@
 		}
 	    }
 
-	    /* parse 'h', 'l' and 'll' length modifiers */
+	    // parse 'h', 'l' and 'll' length modifiers
 	    if (*p == 'h' || *p == 'l')
 	    {
 		length_modifier = *p;
 		p++;
 		if (length_modifier == 'l' && *p == 'l')
 		{
-		    /* double l = long long */
+		    // double l = long long
 # ifdef FEAT_NUM64
 		    length_modifier = 'L';
 # else
-		    length_modifier = 'l';	/* treat it as a single 'l' */
+		    length_modifier = 'l';	// treat it as a single 'l'
 # endif
 		    p++;
 		}
 	    }
 	    fmt_spec = *p;
 
-	    /* common synonyms: */
+	    // common synonyms:
 	    switch (fmt_spec)
 	    {
 		case 'i': fmt_spec = 'd'; break;
@@ -4385,11 +4384,11 @@
 	    }
 # endif
 
-	    /* get parameter value, do initial processing */
+	    // get parameter value, do initial processing
 	    switch (fmt_spec)
 	    {
-		/* '%' and 'c' behave similar to 's' regarding flags and field
-		 * widths */
+		// '%' and 'c' behave similar to 's' regarding flags and field
+		// widths
 	    case '%':
 	    case 'c':
 	    case 's':
@@ -4410,7 +4409,7 @@
 			    tvs != NULL ? tv_nr(tvs, &arg_idx) :
 # endif
 				va_arg(ap, int);
-			/* standard demands unsigned char */
+			// standard demands unsigned char
 			uchar_arg = (unsigned char)j;
 			str_arg = (char *)&uchar_arg;
 			break;
@@ -4428,18 +4427,18 @@
 			str_arg = "[NULL]";
 			str_arg_l = 6;
 		    }
-		    /* make sure not to address string beyond the specified
-		     * precision !!! */
+		    // make sure not to address string beyond the specified
+		    // precision !!!
 		    else if (!precision_specified)
 			str_arg_l = strlen(str_arg);
-		    /* truncate string if necessary as requested by precision */
+		    // truncate string if necessary as requested by precision
 		    else if (precision == 0)
 			str_arg_l = 0;
 		    else
 		    {
-			/* Don't put the #if inside memchr(), it can be a
-			 * macro. */
-			/* memchr on HP does not like n > 2^31  !!! */
+			// Don't put the #if inside memchr(), it can be a
+			// macro.
+			// memchr on HP does not like n > 2^31  !!!
 			char *q = memchr(str_arg, '\0',
 				  precision <= (size_t)0x7fffffffL ? precision
 						       : (size_t)0x7fffffffL);
@@ -4479,36 +4478,36 @@
 	    case 'x': case 'X':
 	    case 'p':
 		{
-		    /* NOTE: the u, b, o, x, X and p conversion specifiers
-		     * imply the value is unsigned;  d implies a signed
-		     * value */
+		    // NOTE: the u, b, o, x, X and p conversion specifiers
+		    // imply the value is unsigned;  d implies a signed
+		    // value
 
-		    /* 0 if numeric argument is zero (or if pointer is
-		     * NULL for 'p'), +1 if greater than zero (or nonzero
-		     * for unsigned arguments), -1 if negative (unsigned
-		     * argument is never negative) */
+		    // 0 if numeric argument is zero (or if pointer is
+		    // NULL for 'p'), +1 if greater than zero (or nonzero
+		    // for unsigned arguments), -1 if negative (unsigned
+		    // argument is never negative)
 		    int arg_sign = 0;
 
-		    /* only defined for length modifier h, or for no
-		     * length modifiers */
+		    // only defined for length modifier h, or for no
+		    // length modifiers
 		    int int_arg = 0;
 		    unsigned int uint_arg = 0;
 
-		    /* only defined for length modifier l */
+		    // only defined for length modifier l
 		    long int long_arg = 0;
 		    unsigned long int ulong_arg = 0;
 
 # ifdef FEAT_NUM64
-		    /* only defined for length modifier ll */
+		    // only defined for length modifier ll
 		    varnumber_T llong_arg = 0;
 		    uvarnumber_T ullong_arg = 0;
 # endif
 
-		    /* only defined for b conversion */
+		    // only defined for b conversion
 		    uvarnumber_T bin_arg = 0;
 
-		    /* pointer argument value -only defined for p
-		     * conversion */
+		    // pointer argument value -only defined for p
+		    // conversion
 		    void *ptr_arg = NULL;
 
 		    if (fmt_spec == 'p')
@@ -4536,12 +4535,12 @@
 		    }
 		    else if (fmt_spec == 'd')
 		    {
-			/* signed */
+			// signed
 			switch (length_modifier)
 			{
 			case '\0':
 			case 'h':
-			    /* char and short arguments are passed as int. */
+			    // char and short arguments are passed as int.
 			    int_arg =
 # if defined(FEAT_EVAL)
 					tvs != NULL ? tv_nr(tvs, &arg_idx) :
@@ -4580,7 +4579,7 @@
 		    }
 		    else
 		    {
-			/* unsigned */
+			// unsigned
 			switch (length_modifier)
 			{
 			    case '\0':
@@ -4622,20 +4621,19 @@
 		    str_arg = tmp;
 		    str_arg_l = 0;
 
-		    /* NOTE:
-		     *   For d, i, u, o, x, and X conversions, if precision is
-		     *   specified, the '0' flag should be ignored. This is so
-		     *   with Solaris 2.6, Digital UNIX 4.0, HPUX 10, Linux,
-		     *   FreeBSD, NetBSD; but not with Perl.
-		     */
+		    // NOTE:
+		    //   For d, i, u, o, x, and X conversions, if precision is
+		    //   specified, the '0' flag should be ignored. This is so
+		    //   with Solaris 2.6, Digital UNIX 4.0, HPUX 10, Linux,
+		    //   FreeBSD, NetBSD; but not with Perl.
 		    if (precision_specified)
 			zero_padding = 0;
 		    if (fmt_spec == 'd')
 		    {
 			if (force_sign && arg_sign >= 0)
 			    tmp[str_arg_l++] = space_for_positive ? ' ' : '+';
-			/* leave negative numbers for sprintf to handle, to
-			 * avoid handling tricky cases like (short int)-32768 */
+			// leave negative numbers for sprintf to handle, to
+			// avoid handling tricky cases like (short int)-32768
 		    }
 		    else if (alternate_form)
 		    {
@@ -4646,25 +4644,25 @@
 			    tmp[str_arg_l++] = '0';
 			    tmp[str_arg_l++] = fmt_spec;
 			}
-			/* alternate form should have no effect for p
-			 * conversion, but ... */
+			// alternate form should have no effect for p
+			// conversion, but ...
 		    }
 
 		    zero_padding_insertion_ind = str_arg_l;
 		    if (!precision_specified)
-			precision = 1;   /* default precision is 1 */
+			precision = 1;   // default precision is 1
 		    if (precision == 0 && arg_sign == 0)
 		    {
-			/* When zero value is formatted with an explicit
-			 * precision 0, the resulting formatted string is
-			 * empty (d, i, u, b, B, o, x, X, p).   */
+			// When zero value is formatted with an explicit
+			// precision 0, the resulting formatted string is
+			// empty (d, i, u, b, B, o, x, X, p).
 		    }
 		    else
 		    {
 			char	f[6];
 			int	f_l = 0;
 
-			/* construct a simple format string for sprintf */
+			// construct a simple format string for sprintf
 			f[f_l++] = '%';
 			if (!length_modifier)
 			    ;
@@ -4708,7 +4706,7 @@
 			}
 			else if (fmt_spec == 'd')
 			{
-			    /* signed */
+			    // signed
 			    switch (length_modifier)
 			    {
 			    case '\0':
@@ -4727,7 +4725,7 @@
 			}
 			else
 			{
-			    /* unsigned */
+			    // unsigned
 			    switch (length_modifier)
 			    {
 			    case '\0':
@@ -4745,9 +4743,9 @@
 			    }
 			}
 
-			/* include the optional minus sign and possible
-			 * "0x" in the region before the zero padding
-			 * insertion point */
+			// include the optional minus sign and possible
+			// "0x" in the region before the zero padding
+			// insertion point
 			if (zero_padding_insertion_ind < str_arg_l
 				&& tmp[zero_padding_insertion_ind] == '-')
 			    zero_padding_insertion_ind++;
@@ -4763,28 +4761,28 @@
 						 - zero_padding_insertion_ind;
 
 			if (alternate_form && fmt_spec == 'o'
-				/* unless zero is already the first
-				 * character */
+				// unless zero is already the first
+				// character
 				&& !(zero_padding_insertion_ind < str_arg_l
 				    && tmp[zero_padding_insertion_ind] == '0'))
 			{
-			    /* assure leading zero for alternate-form
-			     * octal numbers */
+			    // assure leading zero for alternate-form
+			    // octal numbers
 			    if (!precision_specified
 					     || precision < num_of_digits + 1)
 			    {
-				/* precision is increased to force the
-				 * first character to be zero, except if a
-				 * zero value is formatted with an
-				 * explicit precision of zero */
+				// precision is increased to force the
+				// first character to be zero, except if a
+				// zero value is formatted with an
+				// explicit precision of zero
 				precision = num_of_digits + 1;
 			    }
 			}
-			/* zero padding to specified precision? */
+			// zero padding to specified precision?
 			if (num_of_digits < precision)
 			    number_of_zeros_to_pad = precision - num_of_digits;
 		    }
-		    /* zero padding to specified minimal field width? */
+		    // zero padding to specified minimal field width?
 		    if (!justify_left && zero_padding)
 		    {
 			int n = (int)(min_field_width - (str_arg_l
@@ -4803,7 +4801,7 @@
 	    case 'g':
 	    case 'G':
 		{
-		    /* Floating point. */
+		    // Floating point.
 		    double	f;
 		    double	abs_f;
 		    char	format[40];
@@ -4819,8 +4817,8 @@
 
 		    if (fmt_spec == 'g' || fmt_spec == 'G')
 		    {
-			/* Would be nice to use %g directly, but it prints
-			 * "1.0" as "1", we don't want that. */
+			// Would be nice to use %g directly, but it prints
+			// "1.0" as "1", we don't want that.
 			if ((abs_f >= 0.001 && abs_f < 10000000.0)
 							      || abs_f == 0.0)
 			    fmt_spec = ASCII_ISUPPER(fmt_spec) ? 'F' : 'f';
@@ -4837,7 +4835,7 @@
 #  endif
 			    )
 		    {
-			/* Avoid a buffer overflow */
+			// Avoid a buffer overflow
 			STRCPY(tmp, infinity_str(f > 0.0, fmt_spec,
 					      force_sign, space_for_positive));
 			str_arg_l = STRLEN(tmp);
@@ -4847,7 +4845,7 @@
 		    {
 			if (isnan(f))
 			{
-			    /* Not a number: nan or NAN */
+			    // Not a number: nan or NAN
 			    STRCPY(tmp, ASCII_ISUPPER(fmt_spec) ? "NAN"
 								      : "nan");
 			    str_arg_l = 3;
@@ -4862,7 +4860,7 @@
 			}
 			else
 			{
-			    /* Regular float number */
+			    // Regular float number
 			    format[0] = '%';
 			    l = 1;
 			    if (force_sign)
@@ -4871,8 +4869,8 @@
 			    {
 				size_t max_prec = TMP_LEN - 10;
 
-				/* Make sure we don't get more digits than we
-				 * have room for. */
+				// Make sure we don't get more digits than we
+				// have room for.
 				if ((fmt_spec == 'f' || fmt_spec == 'F')
 								&& abs_f > 1.0)
 				    max_prec -= (size_t)log10(abs_f);
@@ -4891,7 +4889,7 @@
 			    int i;
 			    char *tp;
 
-			    /* Using %g or %G: remove superfluous zeroes. */
+			    // Using %g or %G: remove superfluous zeroes.
 			    if (fmt_spec == 'f' || fmt_spec == 'F')
 				tp = tmp + str_arg_l - 1;
 			    else
@@ -4900,18 +4898,18 @@
 						 fmt_spec == 'e' ? 'e' : 'E');
 				if (tp != NULL)
 				{
-				    /* Remove superfluous '+' and leading
-				     * zeroes from the exponent. */
+				    // Remove superfluous '+' and leading
+				    // zeroes from the exponent.
 				    if (tp[1] == '+')
 				    {
-					/* Change "1.0e+07" to "1.0e07" */
+					// Change "1.0e+07" to "1.0e07"
 					STRMOVE(tp + 1, tp + 2);
 					--str_arg_l;
 				    }
 				    i = (tp[1] == '-') ? 2 : 1;
 				    while (tp[i] == '0')
 				    {
-					/* Change "1.0e07" to "1.0e7" */
+					// Change "1.0e07" to "1.0e7"
 					STRMOVE(tp + i, tp + i + 1);
 					--str_arg_l;
 				    }
@@ -4920,8 +4918,8 @@
 			    }
 
 			    if (tp != NULL && !precision_specified)
-				/* Remove trailing zeroes, but keep the one
-				 * just after a dot. */
+				// Remove trailing zeroes, but keep the one
+				// just after a dot.
 				while (tp > tmp + 2 && *tp == '0'
 							     && tp[-1] != '.')
 				{
@@ -4934,9 +4932,9 @@
 			{
 			    char *tp;
 
-			    /* Be consistent: some printf("%e") use 1.0e+12
-			     * and some 1.0e+012.  Remove one zero in the last
-			     * case. */
+			    // Be consistent: some printf("%e") use 1.0e+12
+			    // and some 1.0e+012.  Remove one zero in the last
+			    // case.
 			    tp = (char *)vim_strchr((char_u *)tmp,
 						 fmt_spec == 'e' ? 'e' : 'E');
 			    if (tp != NULL && (tp[1] == '+' || tp[1] == '-')
@@ -4952,7 +4950,7 @@
 		    if (zero_padding && min_field_width > str_arg_l
 					      && (tmp[0] == '-' || force_sign))
 		    {
-			/* padding 0's should be inserted after the sign */
+			// padding 0's should be inserted after the sign
 			number_of_zeros_to_pad = min_field_width - str_arg_l;
 			zero_padding_insertion_ind = 1;
 		    }
@@ -4962,32 +4960,32 @@
 # endif
 
 	    default:
-		/* unrecognized conversion specifier, keep format string
-		 * as-is */
-		zero_padding = 0;  /* turn zero padding off for non-numeric
-				      conversion */
+		// unrecognized conversion specifier, keep format string
+		// as-is
+		zero_padding = 0;  // turn zero padding off for non-numeric
+				   // conversion
 		justify_left = 1;
-		min_field_width = 0;		    /* reset flags */
+		min_field_width = 0;		    // reset flags
 
-		/* discard the unrecognized conversion, just keep *
-		 * the unrecognized conversion character	  */
+		// discard the unrecognized conversion, just keep *
+		// the unrecognized conversion character
 		str_arg = p;
 		str_arg_l = 0;
 		if (*p != NUL)
-		    str_arg_l++;  /* include invalid conversion specifier
-				     unchanged if not at end-of-string */
+		    str_arg_l++;  // include invalid conversion specifier
+				  // unchanged if not at end-of-string
 		break;
 	    }
 
 	    if (*p != NUL)
-		p++;     /* step over the just processed conversion specifier */
+		p++;     // step over the just processed conversion specifier
 
-	    /* insert padding to the left as requested by min_field_width;
-	     * this does not include the zero padding in case of numerical
-	     * conversions*/
+	    // insert padding to the left as requested by min_field_width;
+	    // this does not include the zero padding in case of numerical
+	    // conversions
 	    if (!justify_left)
 	    {
-		/* left padding with blank or zero */
+		// left padding with blank or zero
 		int pn = (int)(min_field_width - (str_arg_l + number_of_zeros_to_pad));
 
 		if (pn > 0)
@@ -5004,18 +5002,18 @@
 		}
 	    }
 
-	    /* zero padding as requested by the precision or by the minimal
-	     * field width for numeric conversions required? */
+	    // zero padding as requested by the precision or by the minimal
+	    // field width for numeric conversions required?
 	    if (number_of_zeros_to_pad == 0)
 	    {
-		/* will not copy first part of numeric right now, *
-		 * force it to be copied later in its entirety    */
+		// will not copy first part of numeric right now, *
+		// force it to be copied later in its entirety
 		zero_padding_insertion_ind = 0;
 	    }
 	    else
 	    {
-		/* insert first part of numerics (sign or '0x') before zero
-		 * padding */
+		// insert first part of numerics (sign or '0x') before zero
+		// padding
 		int zn = (int)zero_padding_insertion_ind;
 
 		if (zn > 0)
@@ -5031,8 +5029,8 @@
 		    str_l += zn;
 		}
 
-		/* insert zero padding as requested by the precision or min
-		 * field width */
+		// insert zero padding as requested by the precision or min
+		// field width
 		zn = (int)number_of_zeros_to_pad;
 		if (zn > 0)
 		{
@@ -5048,8 +5046,8 @@
 		}
 	    }
 
-	    /* insert formatted string
-	     * (or as-is conversion specifier for unknown conversions) */
+	    // insert formatted string
+	    // (or as-is conversion specifier for unknown conversions)
 	    {
 		int sn = (int)(str_arg_l - zero_padding_insertion_ind);
 
@@ -5067,10 +5065,10 @@
 		}
 	    }
 
-	    /* insert right padding */
+	    // insert right padding
 	    if (justify_left)
 	    {
-		/* right blank padding to the field width */
+		// right blank padding to the field width
 		int pn = (int)(min_field_width
 				      - (str_arg_l + number_of_zeros_to_pad));
 
@@ -5093,19 +5091,19 @@
 
     if (str_m > 0)
     {
-	/* make sure the string is nul-terminated even at the expense of
-	 * overwriting the last character (shouldn't happen, but just in case)
-	 * */
+	// make sure the string is nul-terminated even at the expense of
+	// overwriting the last character (shouldn't happen, but just in case)
+	//
 	str[str_l <= str_m - 1 ? str_l : str_m - 1] = '\0';
     }
 
     if (tvs != NULL && tvs[arg_idx - 1].v_type != VAR_UNKNOWN)
 	emsg(_("E767: Too many arguments to printf()"));
 
-    /* Return the number of characters formatted (excluding trailing nul
-     * character), that is, the number of characters that would have been
-     * written to the buffer if it were large enough. */
+    // Return the number of characters formatted (excluding trailing nul
+    // character), that is, the number of characters that would have been
+    // written to the buffer if it were large enough.
     return (int)str_l;
 }
 
-#endif /* PROTO */
+#endif // PROTO
diff --git a/src/message_test.c b/src/message_test.c
index 55ca814..6faad65 100644
--- a/src/message_test.c
+++ b/src/message_test.c
@@ -14,12 +14,12 @@
 #undef NDEBUG
 #include <assert.h>
 
-/* Must include main.c because it contains much more than just main() */
+// Must include main.c because it contains much more than just main()
 #define NO_VIM_MAIN
 #include "main.c"
 
-/* This file has to be included because some of the tested functions are
- * static. */
+// This file has to be included because some of the tested functions are
+// static.
 #include "message.c"
 
 /*
@@ -31,7 +31,7 @@
     char_u  *buf; /*allocated every time to find uninit errors */
     char_u  *s;
 
-    /* in place */
+    // in place
     buf = alloc(40);
     STRCPY(buf, "text");
     trunc_string(buf, buf, 20, 40);
@@ -56,7 +56,7 @@
     assert(STRCMP(buf, "a text t...nott fits") == 0);
     vim_free(buf);
 
-    /* copy from string to buf */
+    // copy from string to buf
     buf = alloc(40);
     s = vim_strsave((char_u *)"text");
     trunc_string(s, buf, 20, 40);
diff --git a/src/misc1.c b/src/misc1.c
index b27c527..fb75e19 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -18,8 +18,8 @@
 # include <lm.h>
 #endif
 
-#define URL_SLASH	1		/* path_is_url() has found "://" */
-#define URL_BACKSLASH	2		/* path_is_url() has found ":\\" */
+#define URL_SLASH	1		// path_is_url() has found "://"
+#define URL_BACKSLASH	2		// path_is_url() has found ":\\"
 
 // All user names (for ~user completion as done by shell).
 static garray_T	ga_users;
@@ -45,15 +45,15 @@
     int		result;
     int		got_com = FALSE;
     int		found_one;
-    char_u	part_buf[COM_MAX_LEN];	/* buffer for one option part */
-    char_u	*string;		/* pointer to comment string */
+    char_u	part_buf[COM_MAX_LEN];	// buffer for one option part
+    char_u	*string;		// pointer to comment string
     char_u	*list;
     int		middle_match_len = 0;
     char_u	*prev_list;
     char_u	*saved_flags = NULL;
 
     result = i = 0;
-    while (VIM_ISWHITE(line[i]))    /* leading white space is ignored */
+    while (VIM_ISWHITE(line[i]))    // leading white space is ignored
 	++i;
 
     /*
@@ -67,60 +67,60 @@
 	found_one = FALSE;
 	for (list = curbuf->b_p_com; *list; )
 	{
-	    /* Get one option part into part_buf[].  Advance "list" to next
-	     * one.  Put "string" at start of string.  */
+	    // Get one option part into part_buf[].  Advance "list" to next
+	    // one.  Put "string" at start of string.
 	    if (!got_com && flags != NULL)
-		*flags = list;	    /* remember where flags started */
+		*flags = list;	    // remember where flags started
 	    prev_list = list;
 	    (void)copy_option_part(&list, part_buf, COM_MAX_LEN, ",");
 	    string = vim_strchr(part_buf, ':');
-	    if (string == NULL)	    /* missing ':', ignore this part */
+	    if (string == NULL)	    // missing ':', ignore this part
 		continue;
-	    *string++ = NUL;	    /* isolate flags from string */
+	    *string++ = NUL;	    // isolate flags from string
 
-	    /* If we found a middle match previously, use that match when this
-	     * is not a middle or end. */
+	    // If we found a middle match previously, use that match when this
+	    // is not a middle or end.
 	    if (middle_match_len != 0
 		    && vim_strchr(part_buf, COM_MIDDLE) == NULL
 		    && vim_strchr(part_buf, COM_END) == NULL)
 		break;
 
-	    /* When we already found a nested comment, only accept further
-	     * nested comments. */
+	    // When we already found a nested comment, only accept further
+	    // nested comments.
 	    if (got_com && vim_strchr(part_buf, COM_NEST) == NULL)
 		continue;
 
-	    /* When 'O' flag present and using "O" command skip this one. */
+	    // When 'O' flag present and using "O" command skip this one.
 	    if (backward && vim_strchr(part_buf, COM_NOBACK) != NULL)
 		continue;
 
-	    /* Line contents and string must match.
-	     * When string starts with white space, must have some white space
-	     * (but the amount does not need to match, there might be a mix of
-	     * TABs and spaces). */
+	    // Line contents and string must match.
+	    // When string starts with white space, must have some white space
+	    // (but the amount does not need to match, there might be a mix of
+	    // TABs and spaces).
 	    if (VIM_ISWHITE(string[0]))
 	    {
 		if (i == 0 || !VIM_ISWHITE(line[i - 1]))
-		    continue;  /* missing white space */
+		    continue;  // missing white space
 		while (VIM_ISWHITE(string[0]))
 		    ++string;
 	    }
 	    for (j = 0; string[j] != NUL && string[j] == line[i + j]; ++j)
 		;
 	    if (string[j] != NUL)
-		continue;  /* string doesn't match */
+		continue;  // string doesn't match
 
-	    /* When 'b' flag used, there must be white space or an
-	     * end-of-line after the string in the line. */
+	    // When 'b' flag used, there must be white space or an
+	    // end-of-line after the string in the line.
 	    if (vim_strchr(part_buf, COM_BLANK) != NULL
 			   && !VIM_ISWHITE(line[i + j]) && line[i + j] != NUL)
 		continue;
 
-	    /* We have found a match, stop searching unless this is a middle
-	     * comment. The middle comment can be a substring of the end
-	     * comment in which case it's better to return the length of the
-	     * end comment and its flags.  Thus we keep searching with middle
-	     * and end matches and use an end match if it matches better. */
+	    // We have found a match, stop searching unless this is a middle
+	    // comment. The middle comment can be a substring of the end
+	    // comment in which case it's better to return the length of the
+	    // end comment and its flags.  Thus we keep searching with middle
+	    // and end matches and use an end match if it matches better.
 	    if (vim_strchr(part_buf, COM_MIDDLE) != NULL)
 	    {
 		if (middle_match_len == 0)
@@ -131,8 +131,8 @@
 		continue;
 	    }
 	    if (middle_match_len != 0 && j > middle_match_len)
-		/* Use this match instead of the middle match, since it's a
-		 * longer thus better match. */
+		// Use this match instead of the middle match, since it's a
+		// longer thus better match.
 		middle_match_len = 0;
 
 	    if (middle_match_len == 0)
@@ -143,28 +143,28 @@
 
 	if (middle_match_len != 0)
 	{
-	    /* Use the previously found middle match after failing to find a
-	     * match with an end. */
+	    // Use the previously found middle match after failing to find a
+	    // match with an end.
 	    if (!got_com && flags != NULL)
 		*flags = saved_flags;
 	    i += middle_match_len;
 	    found_one = TRUE;
 	}
 
-	/* No match found, stop scanning. */
+	// No match found, stop scanning.
 	if (!found_one)
 	    break;
 
 	result = i;
 
-	/* Include any trailing white space. */
+	// Include any trailing white space.
 	while (VIM_ISWHITE(line[i]))
 	    ++i;
 
 	if (include_space)
 	    result = i;
 
-	/* If this comment doesn't nest, stop here. */
+	// If this comment doesn't nest, stop here.
 	got_com = TRUE;
 	if (vim_strchr(part_buf, COM_NEST) == NULL)
 	    break;
@@ -190,7 +190,7 @@
     char_u	*com_flags;
     char_u	*list;
     int		found_one;
-    char_u	part_buf[COM_MAX_LEN];	/* buffer for one option part */
+    char_u	part_buf[COM_MAX_LEN];	// buffer for one option part
 
     /*
      * Repeat to match several nested comment strings.
@@ -212,10 +212,10 @@
 	     */
 	    (void)copy_option_part(&list, part_buf, COM_MAX_LEN, ",");
 	    string = vim_strchr(part_buf, ':');
-	    if (string == NULL)	/* If everything is fine, this cannot actually
-				 * happen. */
+	    if (string == NULL)	// If everything is fine, this cannot actually
+				// happen.
 		continue;
-	    *string++ = NUL;	/* Isolate flags from string. */
+	    *string++ = NUL;	// Isolate flags from string.
 	    com_leader = string;
 
 	    /*
@@ -271,7 +271,7 @@
 
 	if (found_one)
 	{
-	    char_u  part_buf2[COM_MAX_LEN];	/* buffer for one option part */
+	    char_u  part_buf2[COM_MAX_LEN];	// buffer for one option part
 	    int     len1, len2, off;
 
 	    result = i;
@@ -283,11 +283,10 @@
 
 	    lower_check_bound = i;
 
-	    /* Let's verify whether the comment leader found is a substring
-	     * of other comment leaders. If it is, let's adjust the
-	     * lower_check_bound so that we make sure that we have determined
-	     * the comment leader correctly.
-	     */
+	    // Let's verify whether the comment leader found is a substring
+	    // of other comment leaders. If it is, let's adjust the
+	    // lower_check_bound so that we make sure that we have determined
+	    // the comment leader correctly.
 
 	    while (VIM_ISWHITE(*com_leader))
 		++com_leader;
@@ -308,8 +307,8 @@
 		if (len2 == 0)
 		    continue;
 
-		/* Now we have to verify whether string ends with a substring
-		 * beginning the com_leader. */
+		// Now we have to verify whether string ends with a substring
+		// beginning the com_leader.
 		for (off = (len2 > i ? i : len2); off > 0 && off + len1 > len2;)
 		{
 		    --off;
@@ -338,11 +337,11 @@
 plines_win(
     win_T	*wp,
     linenr_T	lnum,
-    int		winheight)	/* when TRUE limit to window height */
+    int		winheight)	// when TRUE limit to window height
 {
 #if defined(FEAT_DIFF) || defined(PROTO)
-    /* Check for filler lines above this buffer line.  When folded the result
-     * is one line anyway. */
+    // Check for filler lines above this buffer line.  When folded the result
+    // is one line anyway.
     return plines_win_nofill(wp, lnum, winheight) + diff_check_fill(wp, lnum);
 }
 
@@ -356,7 +355,7 @@
 plines_win_nofill(
     win_T	*wp,
     linenr_T	lnum,
-    int		winheight)	/* when TRUE limit to window height */
+    int		winheight)	// when TRUE limit to window height
 {
 #endif
     int		lines;
@@ -368,8 +367,8 @@
 	return 1;
 
 #ifdef FEAT_FOLDING
-    /* A folded lines is handled just like an empty line. */
-    /* NOTE: Caller must handle lines that are MAYBE folded. */
+    // A folded lines is handled just like an empty line.
+    // NOTE: Caller must handle lines that are MAYBE folded.
     if (lineFolded(wp, lnum) == TRUE)
 	return 1;
 #endif
@@ -392,7 +391,7 @@
     int		width;
 
     s = ml_get_buf(wp->w_buffer, lnum, FALSE);
-    if (*s == NUL)		/* empty line */
+    if (*s == NUL)		// empty line
 	return 1;
     col = win_linetabsize(wp, s, (colnr_T)MAXCOL);
 
@@ -430,8 +429,8 @@
     char_u	*line;
 
 #ifdef FEAT_DIFF
-    /* Check for filler lines above this buffer line.  When folded the result
-     * is one line anyway. */
+    // Check for filler lines above this buffer line.  When folded the result
+    // is one line anyway.
     lines = diff_check_fill(wp, lnum);
 #endif
 
@@ -483,12 +482,12 @@
 #ifdef FEAT_FOLDING
 	int	x;
 
-	/* Check if there are any really folded lines, but also included lines
-	 * that are maybe folded. */
+	// Check if there are any really folded lines, but also included lines
+	// that are maybe folded.
 	x = foldedCount(wp, first, NULL);
 	if (x > 0)
 	{
-	    ++count;	    /* count 1 for "+-- folded" line */
+	    ++count;	    // count 1 for "+-- folded" line
 	    first += x;
 	}
 	else
@@ -511,7 +510,7 @@
 {
     char_u	*ptr;
 
-    /* When searching columns is sometimes put at the end of a line. */
+    // When searching columns is sometimes put at the end of a line.
     if (pos->col == MAXCOL)
 	return NUL;
     ptr = ml_get_pos(pos);
@@ -585,7 +584,7 @@
     int	    r = ' ';
     int	    save_State = State;
 
-    if (exiting)		/* put terminal in raw mode for this question */
+    if (exiting)		// put terminal in raw mode for this question
 	settmode(TMODE_RAW);
     ++no_wait_return;
 #ifdef USE_ON_FLY_SCROLL
@@ -598,7 +597,7 @@
 
     while (r != 'y' && r != 'n')
     {
-	/* same highlighting as for wait_return */
+	// same highlighting as for wait_return
 	smsg_attr(HL_ATTR(HLF_R), "%s (y/n)?", str);
 	if (direct)
 	    r = get_keystroke();
@@ -606,7 +605,7 @@
 	    r = plain_vgetc();
 	if (r == Ctrl_C || r == ESC)
 	    r = 'n';
-	msg_putchar(r);	    /* show what you typed */
+	msg_putchar(r);	    // show what you typed
 	out_flush();
     }
     --no_wait_return;
@@ -632,7 +631,7 @@
 
     if (time_for_testing == 93784)
     {
-	/* Testing the two-character code. */
+	// Testing the two-character code.
 	buf[0] = 'x';
 	buf[1] = '!';
     }
@@ -702,8 +701,8 @@
 	}
     }
 
-    /* Clear out the minor mode when the argument is not a non-zero number or
-     * non-empty string.  */
+    // Clear out the minor mode when the argument is not a non-zero number or
+    // non-empty string.
     if (!non_zero_arg(&argvars[0]))
 	buf[1] = NUL;
 
@@ -777,15 +776,15 @@
     int		save_mapped_ctrl_c = mapped_ctrl_c;
     int		waited = 0;
 
-    mapped_ctrl_c = FALSE;	/* mappings are not used here */
+    mapped_ctrl_c = FALSE;	// mappings are not used here
     for (;;)
     {
 	cursor_on();
 	out_flush();
 
-	/* Leave some room for check_termcode() to insert a key code into (max
-	 * 5 chars plus NUL).  And fix_input_buffer() can triple the number of
-	 * bytes. */
+	// Leave some room for check_termcode() to insert a key code into (max
+	// 5 chars plus NUL).  And fix_input_buffer() can triple the number of
+	// bytes.
 	maxlen = (buflen - 6 - len) / 3;
 	if (buf == NULL)
 	    buf = alloc(buflen);
@@ -793,8 +792,8 @@
 	{
 	    char_u  *t_buf = buf;
 
-	    /* Need some more space. This might happen when receiving a long
-	     * escape sequence. */
+	    // Need some more space. This might happen when receiving a long
+	    // escape sequence.
 	    buflen += 100;
 	    buf = vim_realloc(buf, buflen);
 	    if (buf == NULL)
@@ -804,43 +803,43 @@
 	if (buf == NULL)
 	{
 	    do_outofmem_msg((long_u)buflen);
-	    return ESC;  /* panic! */
+	    return ESC;  // panic!
 	}
 
-	/* First time: blocking wait.  Second time: wait up to 100ms for a
-	 * terminal code to complete. */
+	// First time: blocking wait.  Second time: wait up to 100ms for a
+	// terminal code to complete.
 	n = ui_inchar(buf + len, maxlen, len == 0 ? -1L : 100L, 0);
 	if (n > 0)
 	{
-	    /* Replace zero and CSI by a special key code. */
+	    // Replace zero and CSI by a special key code.
 	    n = fix_input_buffer(buf + len, n);
 	    len += n;
 	    waited = 0;
 	}
 	else if (len > 0)
-	    ++waited;	    /* keep track of the waiting time */
+	    ++waited;	    // keep track of the waiting time
 
-	/* Incomplete termcode and not timed out yet: get more characters */
+	// Incomplete termcode and not timed out yet: get more characters
 	if ((n = check_termcode(1, buf, buflen, &len)) < 0
 	       && (!p_ttimeout || waited * 100L < (p_ttm < 0 ? p_tm : p_ttm)))
 	    continue;
 
-	if (n == KEYLEN_REMOVED)  /* key code removed */
+	if (n == KEYLEN_REMOVED)  // key code removed
 	{
 	    if (must_redraw != 0 && !need_wait_return && (State & CMDLINE) == 0)
 	    {
-		/* Redrawing was postponed, do it now. */
+		// Redrawing was postponed, do it now.
 		update_screen(0);
-		setcursor(); /* put cursor back where it belongs */
+		setcursor(); // put cursor back where it belongs
 	    }
 	    continue;
 	}
-	if (n > 0)		/* found a termcode: adjust length */
+	if (n > 0)		// found a termcode: adjust length
 	    len = n;
-	if (len == 0)		/* nothing typed yet */
+	if (len == 0)		// nothing typed yet
 	    continue;
 
-	/* Handle modifier and/or special key code. */
+	// Handle modifier and/or special key code.
 	n = buf[0];
 	if (n == K_SPECIAL)
 	{
@@ -866,7 +865,7 @@
 	if (has_mbyte)
 	{
 	    if (MB_BYTE2LEN(n) > len)
-		continue;	/* more bytes to get */
+		continue;	// more bytes to get
 	    buf[len >= buflen ? buflen - 1 : len] = NUL;
 	    n = (*mb_ptr2char)(buf);
 	}
@@ -888,7 +887,7 @@
  */
     int
 get_number(
-    int	    colon,			/* allow colon to abort */
+    int	    colon,			// allow colon to abort
     int	    *mouse_used)
 {
     int	n = 0;
@@ -898,16 +897,16 @@
     if (mouse_used != NULL)
 	*mouse_used = FALSE;
 
-    /* When not printing messages, the user won't know what to type, return a
-     * zero (as if CR was hit). */
+    // When not printing messages, the user won't know what to type, return a
+    // zero (as if CR was hit).
     if (msg_silent != 0)
 	return 0;
 
 #ifdef USE_ON_FLY_SCROLL
-    dont_scroll = TRUE;		/* disallow scrolling here */
+    dont_scroll = TRUE;		// disallow scrolling here
 #endif
     ++no_mapping;
-    ++allow_keys;		/* no mapping here, but recognize keys */
+    ++allow_keys;		// no mapping here, but recognize keys
     for (;;)
     {
 	windgoto(msg_row, msg_col);
@@ -938,7 +937,7 @@
 	    stuffcharReadbuff(':');
 	    if (!exmode_active)
 		cmdline_row = msg_row;
-	    skip_redraw = TRUE;	    /* skip redraw once */
+	    skip_redraw = TRUE;	    // skip redraw once
 	    do_redraw = FALSE;
 	    break;
 	}
@@ -962,7 +961,7 @@
     int		save_cmdline_row;
     int		save_State;
 
-    /* When using ":silent" assume that <CR> was entered. */
+    // When using ":silent" assume that <CR> was entered.
     if (mouse_used != NULL)
 	msg_puts(_("Type number and <Enter> or click with mouse (empty cancels): "));
     else
@@ -1002,13 +1001,13 @@
 {
     long pn;
 
-    if (global_busy	    /* no messages now, wait until global is finished */
-	    || !messaging())  /* 'lazyredraw' set, don't do messages now */
+    if (global_busy	    // no messages now, wait until global is finished
+	    || !messaging())  // 'lazyredraw' set, don't do messages now
 	return;
 
-    /* We don't want to overwrite another important message, but do overwrite
-     * a previous "more lines" or "fewer lines" message, so that "5dd" and
-     * then "put" reports the last action. */
+    // We don't want to overwrite another important message, but do overwrite
+    // a previous "more lines" or "fewer lines" message, so that "5dd" and
+    // then "put" reports the last action.
     if (keep_msg != NULL && !keep_msg_more)
 	return;
 
@@ -1054,7 +1053,7 @@
  */
     void
 vim_beep(
-    unsigned val) /* one of the BO_ values, e.g., BO_OPER */
+    unsigned val) // one of the BO_ values, e.g., BO_OPER
 {
 #ifdef FEAT_EVAL
     called_vim_beep = TRUE;
@@ -1068,8 +1067,8 @@
 	    static int		did_init = FALSE;
 	    static elapsed_T	start_tv;
 
-	    /* Only beep once per half a second, otherwise a sequence of beeps
-	     * would freeze Vim. */
+	    // Only beep once per half a second, otherwise a sequence of beeps
+	    // would freeze Vim.
 	    if (!did_init || ELAPSED_FUNC(start_tv) > 500)
 	    {
 		did_init = TRUE;
@@ -1077,15 +1076,15 @@
 #endif
 		if (p_vb
 #ifdef FEAT_GUI
-			/* While the GUI is starting up the termcap is set for
-			 * the GUI but the output still goes to a terminal. */
+			// While the GUI is starting up the termcap is set for
+			// the GUI but the output still goes to a terminal.
 			&& !(gui.in_use && gui.starting)
 #endif
 			)
 		{
 		    out_str_cf(T_VB);
 #ifdef FEAT_VTP
-		    /* No restore color information, refresh the screen. */
+		    // No restore color information, refresh the screen.
 		    if (has_vtp_working() != 0
 # ifdef FEAT_TERMGUICOLORS
 			    && (p_tgc || (!p_tgc && t_colors >= 256))
@@ -1105,9 +1104,9 @@
 #endif
 	}
 
-	/* When 'debug' contains "beep" produce a message.  If we are sourcing
-	 * a script or executing a function give the user a hint where the beep
-	 * comes from. */
+	// When 'debug' contains "beep" produce a message.  If we are sourcing
+	// a script or executing a function give the user a hint where the beep
+	// comes from.
 	if (vim_strchr(p_debug, 'e') != NULL)
 	{
 	    msg_source(HL_ATTR(HLF_W));
@@ -1132,7 +1131,7 @@
 {
     char_u  *var;
 
-    /* In case we are called a second time (when 'encoding' changes). */
+    // In case we are called a second time (when 'encoding' changes).
     VIM_CLEAR(homedir);
 
 #ifdef VMS
@@ -1192,7 +1191,7 @@
 	}
     }
 
-    if (var != NULL && *var == NUL)	/* empty is same as not set */
+    if (var != NULL && *var == NUL)	// empty is same as not set
 	var = NULL;
 
     if (enc_utf8 && var != NULL)
@@ -1200,8 +1199,8 @@
 	int	len;
 	char_u  *pp = NULL;
 
-	/* Convert from active codepage to UTF-8.  Other conversions are
-	 * not done, because they would fail for non-ASCII characters. */
+	// Convert from active codepage to UTF-8.  Other conversions are
+	// not done, because they would fail for non-ASCII characters.
 	acp_to_enc(var, (int)STRLEN(var), &pp, &len);
 	if (pp != NULL)
 	{
@@ -1286,40 +1285,40 @@
  */
     void
 expand_env(
-    char_u	*src,		/* input string e.g. "$HOME/vim.hlp" */
-    char_u	*dst,		/* where to put the result */
-    int		dstlen)		/* maximum length of the result */
+    char_u	*src,		// input string e.g. "$HOME/vim.hlp"
+    char_u	*dst,		// where to put the result
+    int		dstlen)		// maximum length of the result
 {
     expand_env_esc(src, dst, dstlen, FALSE, FALSE, NULL);
 }
 
     void
 expand_env_esc(
-    char_u	*srcp,		/* input string e.g. "$HOME/vim.hlp" */
-    char_u	*dst,		/* where to put the result */
-    int		dstlen,		/* maximum length of the result */
-    int		esc,		/* escape spaces in expanded variables */
-    int		one,		/* "srcp" is one file name */
-    char_u	*startstr)	/* start again after this (can be NULL) */
+    char_u	*srcp,		// input string e.g. "$HOME/vim.hlp"
+    char_u	*dst,		// where to put the result
+    int		dstlen,		// maximum length of the result
+    int		esc,		// escape spaces in expanded variables
+    int		one,		// "srcp" is one file name
+    char_u	*startstr)	// start again after this (can be NULL)
 {
     char_u	*src;
     char_u	*tail;
     int		c;
     char_u	*var;
     int		copy_char;
-    int		mustfree;	/* var was allocated, need to free it later */
-    int		at_start = TRUE; /* at start of a name */
+    int		mustfree;	// var was allocated, need to free it later
+    int		at_start = TRUE; // at start of a name
     int		startstr_len = 0;
 
     if (startstr != NULL)
 	startstr_len = (int)STRLEN(startstr);
 
     src = skipwhite(srcp);
-    --dstlen;		    /* leave one char space for "\," */
+    --dstlen;		    // leave one char space for "\,"
     while (*src && dstlen > 0)
     {
 #ifdef FEAT_EVAL
-	/* Skip over `=expr`. */
+	// Skip over `=expr`.
 	if (src[0] == '`' && src[1] == '=')
 	{
 	    size_t len;
@@ -1355,17 +1354,17 @@
 	     * The variable name is copied into dst temporarily, because it may
 	     * be a string in read-only memory and a NUL needs to be appended.
 	     */
-	    if (*src != '~')				/* environment var */
+	    if (*src != '~')				// environment var
 	    {
 		tail = src + 1;
 		var = dst;
 		c = dstlen - 1;
 
 #ifdef UNIX
-		/* Unix has ${var-name} type environment vars */
+		// Unix has ${var-name} type environment vars
 		if (*tail == '{' && !vim_isIDc('{'))
 		{
-		    tail++;	/* ignore '{' */
+		    tail++;	// ignore '{'
 		    while (c-- > 0 && *tail && *tail != '}')
 			*var++ = *tail++;
 		}
@@ -1402,7 +1401,7 @@
 		}
 #endif
 	    }
-							/* home directory */
+							// home directory
 	    else if (  src[1] == NUL
 		    || vim_ispathsep(src[1])
 		    || vim_strchr((char_u *)" ,\t\n", src[1]) != NULL)
@@ -1410,7 +1409,7 @@
 		var = homedir;
 		tail = src + 1;
 	    }
-	    else					/* user directory */
+	    else					// user directory
 	    {
 #if defined(UNIX) || (defined(VMS) && defined(USER_HOME))
 		/*
@@ -1434,8 +1433,8 @@
 		 */
 #  if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
 		{
-		    /* Note: memory allocated by getpwnam() is never freed.
-		     * Calling endpwent() apparently doesn't help. */
+		    // Note: memory allocated by getpwnam() is never freed.
+		    // Calling endpwent() apparently doesn't help.
 		    struct passwd *pw = (*dst == NUL)
 					? NULL : getpwnam((char *)dst + 1);
 
@@ -1453,7 +1452,7 @@
 		    mustfree = TRUE;
 		}
 
-# else	/* !UNIX, thus VMS */
+# else	// !UNIX, thus VMS
 		/*
 		 * USER_HOME is a comma-separated list of
 		 * directories to search for the user account in.
@@ -1483,17 +1482,17 @@
 			}
 		    }
 		}
-# endif /* UNIX */
+# endif // UNIX
 #else
-		/* cannot expand user's home directory, so don't try */
+		// cannot expand user's home directory, so don't try
 		var = NULL;
-		tail = (char_u *)"";	/* for gcc */
-#endif /* UNIX || VMS */
+		tail = (char_u *)"";	// for gcc
+#endif // UNIX || VMS
 	    }
 
 #ifdef BACKSLASH_IN_FILENAME
-	    /* If 'shellslash' is set change backslashes to forward slashes.
-	     * Can't use slash_adjust(), p_ssl may be set temporarily. */
+	    // If 'shellslash' is set change backslashes to forward slashes.
+	    // Can't use slash_adjust(), p_ssl may be set temporarily.
 	    if (p_ssl && var != NULL && vim_strchr(var, '\\') != NULL)
 	    {
 		char_u	*p = vim_strsave(var);
@@ -1509,8 +1508,8 @@
 	    }
 #endif
 
-	    /* If "var" contains white space, escape it with a backslash.
-	     * Required for ":e ~/tt" when $HOME includes a space. */
+	    // If "var" contains white space, escape it with a backslash.
+	    // Required for ":e ~/tt" when $HOME includes a space.
 	    if (esc && var != NULL && vim_strpbrk(var, (char_u *)" \t") != NULL)
 	    {
 		char_u	*p = vim_strsave_escaped(var, (char_u *)" \t");
@@ -1530,8 +1529,8 @@
 		STRCPY(dst, var);
 		dstlen -= (int)STRLEN(var);
 		c = (int)STRLEN(var);
-		/* if var[] ends in a path separator and tail[] starts
-		 * with it, skip a character */
+		// if var[] ends in a path separator and tail[] starts
+		// with it, skip a character
 		if (*var != NUL && after_pathsep(dst, dst + c)
 #if defined(BACKSLASH_IN_FILENAME) || defined(AMIGA)
 			&& dst[-1] != ':'
@@ -1546,7 +1545,7 @@
 		vim_free(var);
 	}
 
-	if (copy_char)	    /* copy at least one char */
+	if (copy_char)	    // copy at least one char
 	{
 	    /*
 	     * Recognize the start of a new name, for '~'.
@@ -1729,16 +1728,16 @@
 #endif
 	if (p != NULL)
 	{
-	    /* remove the file name */
+	    // remove the file name
 	    pend = gettail(p);
 
-	    /* remove "doc/" from 'helpfile', if present */
+	    // remove "doc/" from 'helpfile', if present
 	    if (p == p_hf)
 		pend = remove_tail(p, pend, (char_u *)"doc");
 
 #ifdef USE_EXE_NAME
 # ifdef MACOS_X
-	    /* remove "MacOS" from exe_name and add "Resources/vim" */
+	    // remove "MacOS" from exe_name and add "Resources/vim"
 	    if (p == exe_name)
 	    {
 		char_u	*pend1;
@@ -1758,26 +1757,26 @@
 		}
 	    }
 # endif
-	    /* remove "src/" from exe_name, if present */
+	    // remove "src/" from exe_name, if present
 	    if (p == exe_name)
 		pend = remove_tail(p, pend, (char_u *)"src");
 #endif
 
-	    /* for $VIM, remove "runtime/" or "vim54/", if present */
+	    // for $VIM, remove "runtime/" or "vim54/", if present
 	    if (!vimruntime)
 	    {
 		pend = remove_tail(p, pend, (char_u *)RUNTIME_DIRNAME);
 		pend = remove_tail(p, pend, (char_u *)VIM_VERSION_NODOT);
 	    }
 
-	    /* remove trailing path separator */
+	    // remove trailing path separator
 	    if (pend > p && after_pathsep(p, pend))
 		--pend;
 
 #ifdef MACOS_X
 	    if (p == exe_name || p == p_hf)
 #endif
-		/* check that the result is a directory name */
+		// check that the result is a directory name
 		p = vim_strnsave(p, (int)(pend - p));
 
 	    if (p != NULL && !mch_isdir(p))
@@ -1785,7 +1784,7 @@
 	    else
 	    {
 #ifdef USE_EXE_NAME
-		/* may add "/vim54" or "/runtime" if it exists */
+		// may add "/vim54" or "/runtime" if it exists
 		if (vimruntime && (pend = vim_version_dir(p)) != NULL)
 		{
 		    vim_free(p);
@@ -1798,11 +1797,11 @@
     }
 
 #ifdef HAVE_PATHDEF
-    /* When there is a pathdef.c file we can use default_vim_dir and
-     * default_vimruntime_dir */
+    // When there is a pathdef.c file we can use default_vim_dir and
+    // default_vimruntime_dir
     if (p == NULL)
     {
-	/* Only use default_vimruntime_dir when it is not empty */
+	// Only use default_vimruntime_dir when it is not empty
 	if (vimruntime && *default_vimruntime_dir != NUL)
 	{
 	    p = default_vimruntime_dir;
@@ -1909,7 +1908,7 @@
     return NULL;
 # else
 # ifndef __WIN32__
-    /* Borland C++ 5.2 has this in a header file. */
+    // Borland C++ 5.2 has this in a header file.
     extern char		**environ;
 # endif
 # define ENVNAMELEN 100
@@ -2053,9 +2052,9 @@
     for (i = 0; i < ga_users.ga_len; i++)
     {
 	if (STRCMP(((char_u **)ga_users.ga_data)[i], name) == 0)
-	    return 2; /* full match */
+	    return 2; // full match
 	if (STRNCMP(((char_u **)ga_users.ga_data)[i], name, n) == 0)
-	    result = 1; /* partial match */
+	    result = 1; // partial match
     }
     return result;
 }
@@ -2083,9 +2082,9 @@
 prepare_to_exit(void)
 {
 #if defined(SIGHUP) && defined(SIG_IGN)
-    /* Ignore SIGHUP, because a dropped connection causes a read error, which
-     * makes Vim exit and then handling SIGHUP causes various reentrance
-     * problems. */
+    // Ignore SIGHUP, because a dropped connection causes a read error, which
+    // makes Vim exit and then handling SIGHUP causes various reentrance
+    // problems.
     signal(SIGHUP, SIG_IGN);
 #endif
 
@@ -2093,7 +2092,7 @@
     if (gui.in_use)
     {
 	gui.dying = TRUE;
-	out_trash();	/* trash any pending output */
+	out_trash();	// trash any pending output
     }
     else
 #endif
@@ -2123,29 +2122,29 @@
 
     prepare_to_exit();
 
-    /* Setting this will prevent free() calls.  That avoids calling free()
-     * recursively when free() was invoked with a bad pointer. */
+    // Setting this will prevent free() calls.  That avoids calling free()
+    // recursively when free() was invoked with a bad pointer.
     really_exiting = TRUE;
 
     out_str(IObuff);
-    screen_start();		    /* don't know where cursor is now */
+    screen_start();		    // don't know where cursor is now
     out_flush();
 
-    ml_close_notmod();		    /* close all not-modified buffers */
+    ml_close_notmod();		    // close all not-modified buffers
 
     FOR_ALL_BUFFERS(buf)
     {
 	if (buf->b_ml.ml_mfp != NULL && buf->b_ml.ml_mfp->mf_fname != NULL)
 	{
 	    OUT_STR("Vim: preserving files...\n");
-	    screen_start();	    /* don't know where cursor is now */
+	    screen_start();	    // don't know where cursor is now
 	    out_flush();
-	    ml_sync_all(FALSE, FALSE);	/* preserve all swap files */
+	    ml_sync_all(FALSE, FALSE);	// preserve all swap files
 	    break;
 	}
     }
 
-    ml_close_all(FALSE);	    /* close all memfiles, without deleting */
+    ml_close_all(FALSE);	    // close all memfiles, without deleting
 
     OUT_STR("Vim: Finished.\n");
 
@@ -2208,8 +2207,8 @@
     char_u *
 get_cmd_output(
     char_u	*cmd,
-    char_u	*infile,	/* optional input file name */
-    int		flags,		/* can be SHELL_SILENT */
+    char_u	*infile,	// optional input file name
+    int		flags,		// can be SHELL_SILENT
     int		*ret_len)
 {
     char_u	*tempname;
@@ -2222,14 +2221,14 @@
     if (check_restricted() || check_secure())
 	return NULL;
 
-    /* get a name for the temp file */
+    // get a name for the temp file
     if ((tempname = vim_tempname('o', FALSE)) == NULL)
     {
 	emsg(_(e_notmp));
 	return NULL;
     }
 
-    /* Add the redirection stuff */
+    // Add the redirection stuff
     command = make_filter_cmd(cmd, infile, tempname);
     if (command == NULL)
 	goto done;
@@ -2248,7 +2247,7 @@
      * read the names from the file into memory
      */
 # ifdef VMS
-    /* created temporary file is not always readable as binary */
+    // created temporary file is not always readable as binary
     fd = mch_fopen((char *)tempname, "r");
 # else
     fd = mch_fopen((char *)tempname, READBIN);
@@ -2261,7 +2260,7 @@
     }
 
     fseek(fd, 0L, SEEK_END);
-    len = ftell(fd);		    /* get size of temp file */
+    len = ftell(fd);		    // get size of temp file
     fseek(fd, 0L, SEEK_SET);
 
     buffer = alloc(len + 1);
@@ -2272,7 +2271,7 @@
     if (buffer == NULL)
 	goto done;
 #ifdef VMS
-    len = i;	/* VMS doesn't give us what we asked for... */
+    len = i;	// VMS doesn't give us what we asked for...
 #endif
     if (i != len)
     {
@@ -2281,12 +2280,12 @@
     }
     else if (ret_len == NULL)
     {
-	/* Change NUL into SOH, otherwise the string is truncated. */
+	// Change NUL into SOH, otherwise the string is truncated.
 	for (i = 0; i < len; ++i)
 	    if (buffer[i] == NUL)
 		buffer[i] = 1;
 
-	buffer[len] = NUL;	/* make sure the buffer is terminated */
+	buffer[len] = NUL;	// make sure the buffer is terminated
     }
     else
 	*ret_len = len;
@@ -2377,7 +2376,7 @@
 	    if (p == NULL)
 	    {
 		fclose(fd);
-		goto errret;		/* type error; errmsg already given */
+		goto errret;		// type error; errmsg already given
 	    }
 	    len = STRLEN(p);
 	    if (len > 0 && fwrite(p, len, 1, fd) != 1)
@@ -2392,8 +2391,8 @@
 	}
     }
 
-    /* Omit SHELL_COOKED when invoked with ":silent".  Avoids that the shell
-     * echoes typeahead, that messes up the display. */
+    // Omit SHELL_COOKED when invoked with ":silent".  Avoids that the shell
+    // echoes typeahead, that messes up the display.
     if (!msg_silent)
 	flags += SHELL_COOKED;
 
@@ -2448,7 +2447,7 @@
     {
 	res = get_cmd_output(tv_get_string(&argvars[0]), infile, flags, NULL);
 #ifdef USE_CRNL
-	/* translate <CR><NL> into <NL> */
+	// translate <CR><NL> into <NL>
 	if (res != NULL)
 	{
 	    char_u	*s, *d;
@@ -2531,14 +2530,14 @@
     p = skiptowhite(p_sh);
     if (*p == NUL)
     {
-	/* No white space, use the tail. */
+	// No white space, use the tail.
 	p = vim_strsave(gettail(p_sh));
     }
     else
     {
 	char_u  *p1, *p2;
 
-	/* Find the last path separator before the space. */
+	// Find the last path separator before the space.
 	p1 = p_sh;
 	for (p2 = p_sh; p2 < p; MB_PTR_ADV(p2))
 	    if (vim_ispathsep(*p2))
@@ -2593,10 +2592,10 @@
     {
 	curtime = vim_localtime(&tt, &tmval);
 	if (vim_time() - tt < (60L * 60L * 12L))
-	    /* within 12 hours */
+	    // within 12 hours
 	    (void)strftime((char *)buf, buflen, "%H:%M:%S", curtime);
 	else
-	    /* longer ago */
+	    // longer ago
 	    (void)strftime((char *)buf, buflen, "%Y/%m/%d %H:%M:%S", curtime);
     }
     else
diff --git a/src/misc2.c b/src/misc2.c
index ce76798..c0208de 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -12,7 +12,7 @@
  */
 #include "vim.h"
 
-static char_u	*username = NULL; /* cached result of mch_get_user_name() */
+static char_u	*username = NULL; // cached result of mch_get_user_name()
 
 static int coladvance2(pos_T *pos, int addspaces, int finetune, colnr_T wcol);
 
@@ -22,9 +22,9 @@
     int
 virtual_active(void)
 {
-    /* While an operator is being executed we return "virtual_op", because
-     * VIsual_active has already been reset, thus we can't check for "block"
-     * being used. */
+    // While an operator is being executed we return "virtual_op", because
+    // VIsual_active has already been reset, thus we can't check for "block"
+    // being used.
     if (virtual_op != MAYBE)
 	return virtual_op;
     return (ve_flags == VE_ALL
@@ -58,7 +58,7 @@
 	curwin->w_valid &= ~VALID_VIRTCOL;
     else
     {
-	/* Virtcol is valid */
+	// Virtcol is valid
 	curwin->w_valid |= VALID_VIRTCOL;
 	curwin->w_virtcol = wcol;
     }
@@ -99,7 +99,7 @@
 	curwin->w_valid &= ~VALID_VIRTCOL;
     else if (*ml_get_cursor() != TAB)
     {
-	/* Virtcol is valid when not on a TAB */
+	// Virtcol is valid when not on a TAB
 	curwin->w_valid |= VALID_VIRTCOL;
 	curwin->w_virtcol = wcol;
     }
@@ -168,10 +168,10 @@
 	    if (wcol / width > (colnr_T)csize / width
 		    && ((State & INSERT) == 0 || (int)wcol > csize + 1))
 	    {
-		/* In case of line wrapping don't move the cursor beyond the
-		 * right screen edge.  In Insert mode allow going just beyond
-		 * the last character (like what happens when typing and
-		 * reaching the right window edge). */
+		// In case of line wrapping don't move the cursor beyond the
+		// right screen edge.  In Insert mode allow going just beyond
+		// the last character (like what happens when typing and
+		// reaching the right window edge).
 		wcol = (csize / width + 1) * width - 1;
 	    }
 	}
@@ -179,7 +179,7 @@
 	ptr = line;
 	while (col <= wcol && *ptr != NUL)
 	{
-	    /* Count a tab for what it's worth (if list mode not on) */
+	    // Count a tab for what it's worth (if list mode not on)
 #ifdef FEAT_LINEBREAK
 	    csize = win_lbr_chartabsize(curwin, line, ptr, col, &head);
 	    MB_PTR_ADV(ptr);
@@ -199,7 +199,7 @@
 	{
 	    idx -= 1;
 # ifdef FEAT_LINEBREAK
-	    /* Don't count the chars from 'showbreak'. */
+	    // Don't count the chars from 'showbreak'.
 	    csize -= head;
 # endif
 	    col -= csize;
@@ -210,12 +210,12 @@
 		&& wcol >= 0
 		&& ((col != wcol && col != wcol + 1) || csize > 1))
 	{
-	    /* 'virtualedit' is set: The difference between wcol and col is
-	     * filled with spaces. */
+	    // 'virtualedit' is set: The difference between wcol and col is
+	    // filled with spaces.
 
 	    if (line[idx] == NUL)
 	    {
-		/* Append spaces */
+		// Append spaces
 		int	correct = wcol - col;
 		char_u	*newline = alloc(idx + correct + 1);
 		int	t;
@@ -238,9 +238,9 @@
 	    }
 	    else
 	    {
-		/* Break a tab */
+		// Break a tab
 		int	linelen = (int)STRLEN(line);
-		int	correct = wcol - col - csize + 1; /* negative!! */
+		int	correct = wcol - col - csize + 1; // negative!!
 		char_u	*newline;
 		int	t, s = 0;
 		int	v;
@@ -282,7 +282,7 @@
     {
 	if (wcol == MAXCOL)
 	{
-	    /* The width of the last character is used to set coladd. */
+	    // The width of the last character is used to set coladd.
 	    if (!one_more)
 	    {
 		colnr_T	    scol, ecol;
@@ -295,7 +295,7 @@
 	{
 	    int b = (int)wcol - (int)col;
 
-	    /* The difference between wcol and col is used to set coladd. */
+	    // The difference between wcol and col is used to set coladd.
 	    if (b > 0 && b < (MAXCOL - 2 * curwin->w_width))
 		pos->coladd = b;
 
@@ -303,7 +303,7 @@
 	}
     }
 
-    /* prevent from moving onto a trail byte */
+    // prevent from moving onto a trail byte
     if (has_mbyte)
 	mb_adjustpos(curbuf, pos);
 
@@ -333,11 +333,11 @@
 {
     char_u  *p;
 
-    /* when searching position may be set to end of a line */
+    // when searching position may be set to end of a line
     if (lp->col != MAXCOL)
     {
 	p = ml_get_pos(lp);
-	if (*p != NUL)	/* still within line, move to next char (may be NUL) */
+	if (*p != NUL)	// still within line, move to next char (may be NUL)
 	{
 	    if (has_mbyte)
 	    {
@@ -351,7 +351,7 @@
 	    return ((p[1] != NUL) ? 0 : 2);
 	}
     }
-    if (lp->lnum != curbuf->b_ml.ml_line_count)     /* there is a next line */
+    if (lp->lnum != curbuf->b_ml.ml_line_count)     // there is a next line
     {
 	lp->col = 0;
 	lp->lnum++;
@@ -394,7 +394,7 @@
     lp->coladd = 0;
     if (lp->col == MAXCOL)
     {
-	/* past end of line */
+	// past end of line
 	p = ml_get(lp->lnum);
 	lp->col = (colnr_T)STRLEN(p);
 	if (has_mbyte)
@@ -404,7 +404,7 @@
 
     if (lp->col > 0)
     {
-	/* still within line */
+	// still within line
 	lp->col--;
 	if (has_mbyte)
 	{
@@ -416,7 +416,7 @@
 
     if (lp->lnum > 1)
     {
-	/* there is a prior line */
+	// there is a prior line
 	lp->lnum--;
 	p = ml_get(lp->lnum);
 	lp->col = (colnr_T)STRLEN(p);
@@ -425,7 +425,7 @@
 	return 1;
     }
 
-    /* at start of file */
+    // at start of file
     return -1;
 }
 
@@ -450,7 +450,7 @@
     linenr_T
 get_cursor_rel_lnum(
     win_T	*wp,
-    linenr_T	lnum)		    /* line number to get the result for */
+    linenr_T	lnum)		    // line number to get the result for
 {
     linenr_T	cursor = wp->w_cursor.lnum;
     linenr_T	retval = 0;
@@ -463,8 +463,8 @@
 	    while (lnum > cursor)
 	    {
 		(void)hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL);
-		/* if lnum and cursor are in the same fold,
-		 * now lnum <= cursor */
+		// if lnum and cursor are in the same fold,
+		// now lnum <= cursor
 		if (lnum > cursor)
 		    retval++;
 		lnum--;
@@ -475,16 +475,15 @@
 	    while (lnum < cursor)
 	    {
 		(void)hasFoldingWin(wp, lnum, NULL, &lnum, TRUE, NULL);
-		/* if lnum and cursor are in the same fold,
-		 * now lnum >= cursor */
+		// if lnum and cursor are in the same fold,
+		// now lnum >= cursor
 		if (lnum < cursor)
 		    retval--;
 		lnum++;
 	    }
 	}
-	/* else if (lnum == cursor)
-	 *     retval = 0;
-	 */
+	// else if (lnum == cursor)
+	//     retval = 0;
     }
     else
 #endif
@@ -524,8 +523,8 @@
     if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
     {
 #ifdef FEAT_FOLDING
-	/* If there is a closed fold at the end of the file, put the cursor in
-	 * its first line.  Otherwise in the last line. */
+	// If there is a closed fold at the end of the file, put the cursor in
+	// its first line.  Otherwise in the last line.
 	if (!hasFolding(curbuf->b_ml.ml_line_count,
 						&curwin->w_cursor.lnum, NULL))
 #endif
@@ -559,10 +558,10 @@
 	win->w_cursor.col = 0;
     else if (win->w_cursor.col >= len)
     {
-	/* Allow cursor past end-of-line when:
-	 * - in Insert mode or restarting Insert mode
-	 * - in Visual mode and 'selection' isn't "old"
-	 * - 'virtualedit' is set */
+	// Allow cursor past end-of-line when:
+	// - in Insert mode or restarting Insert mode
+	// - in Visual mode and 'selection' isn't "old"
+	// - 'virtualedit' is set
 	if ((State & INSERT) || restart_edit
 		|| (VIsual_active && *p_sel != 'o')
 		|| (ve_flags & VE_ONEMORE)
@@ -571,7 +570,7 @@
 	else
 	{
 	    win->w_cursor.col = len - 1;
-	    /* Move the cursor to the head byte. */
+	    // Move the cursor to the head byte.
 	    if (has_mbyte)
 		mb_adjustpos(win->w_buffer, &win->w_cursor);
 	}
@@ -579,9 +578,9 @@
     else if (win->w_cursor.col < 0)
 	win->w_cursor.col = 0;
 
-    /* If virtual editing is on, we can leave the cursor on the old position,
-     * only we must set it to virtual.  But don't do it when at the end of the
-     * line. */
+    // If virtual editing is on, we can leave the cursor on the old position,
+    // only we must set it to virtual.  But don't do it when at the end of the
+    // line.
     if (oldcol == MAXCOL)
 	win->w_cursor.coladd = 0;
     else if (ve_flags == VE_ALL)
@@ -590,9 +589,9 @@
 	{
 	    win->w_cursor.coladd = oldcoladd - win->w_cursor.col;
 
-	    /* Make sure that coladd is not more than the char width.
-	     * Not for the last character, coladd is then used when the cursor
-	     * is actually after the last character. */
+	    // Make sure that coladd is not more than the char width.
+	    // Not for the last character, coladd is then used when the cursor
+	    // is actually after the last character.
 	    if (win->w_cursor.col + 1 < len && win->w_cursor.coladd > 0)
 	    {
 		int cs, ce;
@@ -603,7 +602,7 @@
 	    }
 	}
 	else
-	    /* avoid weird number when there is a miscalculation or overflow */
+	    // avoid weird number when there is a miscalculation or overflow
 	    win->w_cursor.coladd = 0;
     }
 }
@@ -678,9 +677,9 @@
     else if (s < curwin->w_leftcol)
     {
 	retval = TRUE;
-	if (coladvance(e + 1) == FAIL)	/* there isn't another character */
+	if (coladvance(e + 1) == FAIL)	// there isn't another character
 	{
-	    curwin->w_leftcol = s;	/* adjust w_leftcol instead */
+	    curwin->w_leftcol = s;	// adjust w_leftcol instead
 	    changed_cline_bef_curs();
 	}
     }
@@ -794,7 +793,7 @@
 	    num_alloc, num_freed);
 }
 
-#endif /* MEM_PROFILE */
+#endif // MEM_PROFILE
 
 #ifdef FEAT_EVAL
     int
@@ -890,11 +889,11 @@
     void *
 lalloc(size_t size, int message)
 {
-    void	*p;		    /* pointer to new storage space */
-    static int	releasing = FALSE;  /* don't do mf_release_all() recursive */
+    void	*p;		    // pointer to new storage space
+    static int	releasing = FALSE;  // don't do mf_release_all() recursive
     int		try_again;
 #if defined(HAVE_AVAIL_MEM)
-    static size_t allocated = 0;    /* allocated since last avail check */
+    static size_t allocated = 0;    // allocated since last avail check
 #endif
 
     // Safety check for allocating zero bytes
@@ -926,20 +925,20 @@
 	if ((p = malloc(size)) != NULL)
 	{
 #ifndef HAVE_AVAIL_MEM
-	    /* 1. No check for available memory: Just return. */
+	    // 1. No check for available memory: Just return.
 	    goto theend;
 #else
-	    /* 2. Slow check for available memory: call mch_avail_mem() after
-	     *    allocating (KEEP_ROOM / 2) amount of memory. */
+	    // 2. Slow check for available memory: call mch_avail_mem() after
+	    //    allocating (KEEP_ROOM / 2) amount of memory.
 	    allocated += size;
 	    if (allocated < KEEP_ROOM / 2)
 		goto theend;
 	    allocated = 0;
 
-	    /* 3. check for available memory: call mch_avail_mem() */
+	    // 3. check for available memory: call mch_avail_mem()
 	    if (mch_avail_mem(TRUE) < KEEP_ROOM_KB && !releasing)
 	    {
-		free(p);	/* System is low... no go! */
+		free(p);	// System is low... no go!
 		p = NULL;
 	    }
 	    else
@@ -954,8 +953,8 @@
 	    break;
 	releasing = TRUE;
 
-	clear_sb_text(TRUE);	      /* free any scrollback text */
-	try_again = mf_release_all(); /* release as many blocks as possible */
+	clear_sb_text(TRUE);	      // free any scrollback text
+	try_again = mf_release_all(); // release as many blocks as possible
 
 	releasing = FALSE;
 	if (!try_again)
@@ -1046,16 +1045,16 @@
 {
     buf_T	*buf, *nextbuf;
 
-    /* When we cause a crash here it is caught and Vim tries to exit cleanly.
-     * Don't try freeing everything again. */
+    // When we cause a crash here it is caught and Vim tries to exit cleanly.
+    // Don't try freeing everything again.
     if (entered_free_all_mem)
 	return;
     entered_free_all_mem = TRUE;
 
-    /* Don't want to trigger autocommands from here on. */
+    // Don't want to trigger autocommands from here on.
     block_autocmds();
 
-    /* Close all tabs and windows.  Reset 'equalalways' to avoid redraws. */
+    // Close all tabs and windows.  Reset 'equalalways' to avoid redraws.
     p_ea = FALSE;
     if (first_tabpage != NULL && first_tabpage->tp_next != NULL)
 	do_cmdline_cmd((char_u *)"tabonly!");
@@ -1063,7 +1062,7 @@
 	do_cmdline_cmd((char_u *)"only!");
 
 # if defined(FEAT_SPELL)
-    /* Free all spell info. */
+    // Free all spell info.
     spell_free_all();
 # endif
 
@@ -1109,7 +1108,7 @@
     free_findfile();
 # endif
 
-    /* Obviously named calls. */
+    // Obviously named calls.
     free_all_autocmds();
     clear_termcodes();
     free_all_marks();
@@ -1134,9 +1133,9 @@
     if (curtab != NULL)
 	diff_clear(curtab);
 # endif
-    clear_sb_text(TRUE);	      /* free any scrollback text */
+    clear_sb_text(TRUE);	      // free any scrollback text
 
-    /* Free some global vars. */
+    // Free some global vars.
     vim_free(username);
 # ifdef FEAT_CLIPBOARD
     vim_regfree(clip_exclude_prog);
@@ -1145,7 +1144,7 @@
     vim_free(new_last_cmdline);
     set_keep_msg(NULL, 0);
 
-    /* Clear cmdline history. */
+    // Clear cmdline history.
     p_hi = 0;
     init_history();
 # ifdef FEAT_PROP_POPUP
@@ -1171,11 +1170,11 @@
 	// Destroy all windows.  Must come before freeing buffers.
 	win_free_all();
 
-    /* Free all option values.  Must come after closing windows. */
+    // Free all option values.  Must come after closing windows.
     free_all_options();
 
-    /* Free all buffers.  Reset 'autochdir' to avoid accessing things that
-     * were freed already. */
+    // Free all buffers.  Reset 'autochdir' to avoid accessing things that
+    // were freed already.
 # ifdef FEAT_AUTOCHDIR
     p_acd = FALSE;
 # endif
@@ -1187,7 +1186,7 @@
 	nextbuf = buf->b_next;
 	close_buffer(NULL, buf, DOBUF_WIPE, FALSE, FALSE);
 	if (bufref_valid(&bufref))
-	    buf = nextbuf;	/* didn't work, try next one */
+	    buf = nextbuf;	// didn't work, try next one
 	else
 	    buf = firstbuf;
     }
@@ -1196,7 +1195,7 @@
     free_arshape_buf();
 # endif
 
-    /* Clear registers. */
+    // Clear registers.
     clear_registers();
     ResetRedobuff();
     ResetRedobuff();
@@ -1205,7 +1204,7 @@
     vim_free(serverDelayedStartName);
 # endif
 
-    /* highlight info */
+    // highlight info
     free_highlight();
 
     reset_last_sourcing();
@@ -1217,11 +1216,11 @@
     }
 
 # ifdef UNIX
-    /* Machine-specific free. */
+    // Machine-specific free.
     mch_free_mem();
 # endif
 
-    /* message history */
+    // message history
     for (;;)
 	if (delete_first_msg() == FAIL)
 	    break;
@@ -1233,17 +1232,17 @@
     timer_free_all();
 # endif
 # ifdef FEAT_EVAL
-    /* must be after channel_free_all() with unrefs partials */
+    // must be after channel_free_all() with unrefs partials
     eval_clear();
 # endif
 # ifdef FEAT_JOB_CHANNEL
-    /* must be after eval_clear() with unrefs jobs */
+    // must be after eval_clear() with unrefs jobs
     job_free_all();
 # endif
 
     free_termoptions();
 
-    /* screenlines (can't display anything now!) */
+    // screenlines (can't display anything now!)
     free_screenlines();
 
 # if defined(FEAT_SOUND)
@@ -1347,18 +1346,18 @@
      * First count the number of backslashes required.
      * Then allocate the memory and insert them.
      */
-    length = 1;				/* count the trailing NUL */
+    length = 1;				// count the trailing NUL
     for (p = string; *p; p++)
     {
 	if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
 	{
-	    length += l;		/* count a multibyte char */
+	    length += l;		// count a multibyte char
 	    p += l - 1;
 	    continue;
 	}
 	if (vim_strchr(esc_chars, *p) != NULL || (bsl && rem_backslash(p)))
-	    ++length;			/* count a backslash */
-	++length;			/* count an ordinary char */
+	    ++length;			// count a backslash
+	++length;			// count an ordinary char
     }
     escaped_string = alloc(length);
     if (escaped_string != NULL)
@@ -1370,7 +1369,7 @@
 	    {
 		mch_memmove(p2, p, (size_t)l);
 		p2 += l;
-		p += l - 1;		/* skip multibyte char  */
+		p += l - 1;		// skip multibyte char
 		continue;
 	    }
 	    if (vim_strchr(esc_chars, *p) != NULL || (bsl && rem_backslash(p)))
@@ -1411,47 +1410,47 @@
     int		l;
     int		csh_like;
 
-    /* Only csh and similar shells expand '!' within single quotes.  For sh and
-     * the like we must not put a backslash before it, it will be taken
-     * literally.  If do_special is set the '!' will be escaped twice.
-     * Csh also needs to have "\n" escaped twice when do_special is set. */
+    // Only csh and similar shells expand '!' within single quotes.  For sh and
+    // the like we must not put a backslash before it, it will be taken
+    // literally.  If do_special is set the '!' will be escaped twice.
+    // Csh also needs to have "\n" escaped twice when do_special is set.
     csh_like = csh_like_shell();
 
-    /* First count the number of extra bytes required. */
-    length = (unsigned)STRLEN(string) + 3;  /* two quotes and a trailing NUL */
+    // First count the number of extra bytes required.
+    length = (unsigned)STRLEN(string) + 3;  // two quotes and a trailing NUL
     for (p = string; *p != NUL; MB_PTR_ADV(p))
     {
 # ifdef MSWIN
 	if (!p_ssl)
 	{
 	    if (*p == '"')
-		++length;		/* " -> "" */
+		++length;		// " -> ""
 	}
 	else
 # endif
 	if (*p == '\'')
-	    length += 3;		/* ' => '\'' */
+	    length += 3;		// ' => '\''
 	if ((*p == '\n' && (csh_like || do_newline))
 		|| (*p == '!' && (csh_like || do_special)))
 	{
-	    ++length;			/* insert backslash */
+	    ++length;			// insert backslash
 	    if (csh_like && do_special)
-		++length;		/* insert backslash */
+		++length;		// insert backslash
 	}
 	if (do_special && find_cmdline_var(p, &l) >= 0)
 	{
-	    ++length;			/* insert backslash */
+	    ++length;			// insert backslash
 	    p += l - 1;
 	}
     }
 
-    /* Allocate memory for the result and fill it. */
+    // Allocate memory for the result and fill it.
     escaped_string = alloc(length);
     if (escaped_string != NULL)
     {
 	d = escaped_string;
 
-	/* add opening quote */
+	// add opening quote
 # ifdef MSWIN
 	if (!p_ssl)
 	    *d++ = '"';
@@ -1494,8 +1493,8 @@
 	    }
 	    if (do_special && find_cmdline_var(p, &l) >= 0)
 	    {
-		*d++ = '\\';		/* insert backslash */
-		while (--l >= 0)	/* copy the var */
+		*d++ = '\\';		// insert backslash
+		while (--l >= 0)	// copy the var
 		    *d++ = *p++;
 		continue;
 	    }
@@ -1503,7 +1502,7 @@
 	    MB_COPY_CHAR(p, d);
 	}
 
-	/* add terminating quote and finish with a NUL */
+	// add terminating quote and finish with a NUL
 # ifdef MSWIN
 	if (!p_ssl)
 	    *d++ = '"';
@@ -1595,14 +1594,14 @@
 		l = utf_ptr2len(p);
 		if (c == 0)
 		{
-		    /* overlong sequence, use only the first byte */
+		    // overlong sequence, use only the first byte
 		    c = *p;
 		    l = 1;
 		}
 		uc = utf_toupper(c);
 
-		/* Reallocate string when byte count changes.  This is rare,
-		 * thus it's OK to do another malloc()/free(). */
+		// Reallocate string when byte count changes.  This is rare,
+		// thus it's OK to do another malloc()/free().
 		newl = utf_char2len(uc);
 		if (newl != l)
 		{
@@ -1623,10 +1622,10 @@
 		p += newl;
 	    }
 	    else if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
-		p += l;		/* skip multi-byte character */
+		p += l;		// skip multi-byte character
 	    else
 	    {
-		*p = TOUPPER_LOC(*p); /* note that toupper() can be a macro */
+		*p = TOUPPER_LOC(*p); // note that toupper() can be a macro
 		p++;
 	    }
 	}
@@ -1662,14 +1661,14 @@
 		l = utf_ptr2len(p);
 		if (c == 0)
 		{
-		    /* overlong sequence, use only the first byte */
+		    // overlong sequence, use only the first byte
 		    c = *p;
 		    l = 1;
 		}
 		lc = utf_tolower(c);
 
-		/* Reallocate string when byte count changes.  This is rare,
-		 * thus it's OK to do another malloc()/free(). */
+		// Reallocate string when byte count changes.  This is rare,
+		// thus it's OK to do another malloc()/free().
 		newl = utf_char2len(lc);
 		if (newl != l)
 		{
@@ -1690,10 +1689,10 @@
 		p += newl;
 	    }
 	    else if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
-		p += l;		/* skip multi-byte character */
+		p += l;		// skip multi-byte character
 	    else
 	    {
-		*p = TOLOWER_LOC(*p); /* note that tolower() can be a macro */
+		*p = TOLOWER_LOC(*p); // note that tolower() can be a macro
 		p++;
 	    }
 	}
@@ -1762,7 +1761,7 @@
     int	    len = 0;
     char_u  *p = *option;
 
-    /* skip '.' at start of option part, for 'suffixes' */
+    // skip '.' at start of option part, for 'suffixes'
     if (*p == '.')
 	buf[len++] = *p++;
     while (*p != NUL && vim_strchr((char_u *)sep_chars, *p) == NULL)
@@ -1778,9 +1777,9 @@
     }
     buf[len] = NUL;
 
-    if (*p != NUL && *p != ',')	/* skip non-standard separator */
+    if (*p != NUL && *p != ',')	// skip non-standard separator
 	++p;
-    p = skip_to_option_part(p);	/* p points to next file name */
+    p = skip_to_option_part(p);	// p points to next file name
 
     *option = p;
     return len;
@@ -1832,13 +1831,13 @@
     {
 	i = (int)TOLOWER_LOC(*s1) - (int)TOLOWER_LOC(*s2);
 	if (i != 0)
-	    return i;			    /* this character different */
+	    return i;			    // this character different
 	if (*s1 == NUL)
-	    break;			    /* strings match until NUL */
+	    break;			    // strings match until NUL
 	++s1;
 	++s2;
     }
-    return 0;				    /* strings match */
+    return 0;				    // strings match
 }
 #endif
 
@@ -1857,14 +1856,14 @@
     {
 	i = (int)TOLOWER_LOC(*s1) - (int)TOLOWER_LOC(*s2);
 	if (i != 0)
-	    return i;			    /* this character different */
+	    return i;			    // this character different
 	if (*s1 == NUL)
-	    break;			    /* strings match until NUL */
+	    break;			    // strings match until NUL
 	++s1;
 	++s2;
 	--len;
     }
-    return 0;				    /* strings match */
+    return 0;				    // strings match
 }
 #endif
 
@@ -1886,7 +1885,7 @@
 	{
 	    int l = utfc_ptr2len(p);
 
-	    /* Avoid matching an illegal byte here. */
+	    // Avoid matching an illegal byte here.
 	    if (utf_ptr2char(p) == c && l > 1)
 		return p;
 	    p += l;
@@ -2177,7 +2176,7 @@
     void
 append_ga_line(garray_T *gap)
 {
-    /* Remove trailing CR. */
+    // Remove trailing CR.
     if (gap->ga_len > 0
 	    && !curbuf->b_p_bin
 	    && ((char_u *)gap->ga_data)[gap->ga_len - 1] == CAR)
@@ -2199,9 +2198,9 @@
 
 static struct modmasktable
 {
-    short	mod_mask;	/* Bit-mask for particular key modifier */
-    short	mod_flag;	/* Bit(s) for particular key modifier */
-    char_u	name;		/* Single letter name of modifier */
+    short	mod_mask;	// Bit-mask for particular key modifier
+    short	mod_flag;	// Bit(s) for particular key modifier
+    char_u	name;		// Single letter name of modifier
 } mod_mask_table[] =
 {
     {MOD_MASK_ALT,		MOD_MASK_ALT,		(char_u)'M'},
@@ -2214,10 +2213,10 @@
 #ifdef MACOS_X
     {MOD_MASK_CMD,		MOD_MASK_CMD,		(char_u)'D'},
 #endif
-    /* 'A' must be the last one */
+    // 'A' must be the last one
     {MOD_MASK_ALT,		MOD_MASK_ALT,		(char_u)'A'},
     {0, 0, NUL}
-    /* NOTE: when adding an entry, update MAX_KEY_NAME_LEN! */
+    // NOTE: when adding an entry, update MAX_KEY_NAME_LEN!
 };
 
 /*
@@ -2228,48 +2227,48 @@
 
 static char_u modifier_keys_table[] =
 {
-/*  mod mask	    with modifier		without modifier */
-    MOD_MASK_SHIFT, '&', '9',			'@', '1',	/* begin */
-    MOD_MASK_SHIFT, '&', '0',			'@', '2',	/* cancel */
-    MOD_MASK_SHIFT, '*', '1',			'@', '4',	/* command */
-    MOD_MASK_SHIFT, '*', '2',			'@', '5',	/* copy */
-    MOD_MASK_SHIFT, '*', '3',			'@', '6',	/* create */
-    MOD_MASK_SHIFT, '*', '4',			'k', 'D',	/* delete char */
-    MOD_MASK_SHIFT, '*', '5',			'k', 'L',	/* delete line */
-    MOD_MASK_SHIFT, '*', '7',			'@', '7',	/* end */
-    MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_END,	'@', '7',	/* end */
-    MOD_MASK_SHIFT, '*', '9',			'@', '9',	/* exit */
-    MOD_MASK_SHIFT, '*', '0',			'@', '0',	/* find */
-    MOD_MASK_SHIFT, '#', '1',			'%', '1',	/* help */
-    MOD_MASK_SHIFT, '#', '2',			'k', 'h',	/* home */
-    MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_HOME,	'k', 'h',	/* home */
-    MOD_MASK_SHIFT, '#', '3',			'k', 'I',	/* insert */
-    MOD_MASK_SHIFT, '#', '4',			'k', 'l',	/* left arrow */
-    MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_LEFT,	'k', 'l',	/* left arrow */
-    MOD_MASK_SHIFT, '%', 'a',			'%', '3',	/* message */
-    MOD_MASK_SHIFT, '%', 'b',			'%', '4',	/* move */
-    MOD_MASK_SHIFT, '%', 'c',			'%', '5',	/* next */
-    MOD_MASK_SHIFT, '%', 'd',			'%', '7',	/* options */
-    MOD_MASK_SHIFT, '%', 'e',			'%', '8',	/* previous */
-    MOD_MASK_SHIFT, '%', 'f',			'%', '9',	/* print */
-    MOD_MASK_SHIFT, '%', 'g',			'%', '0',	/* redo */
-    MOD_MASK_SHIFT, '%', 'h',			'&', '3',	/* replace */
-    MOD_MASK_SHIFT, '%', 'i',			'k', 'r',	/* right arr. */
-    MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_RIGHT,	'k', 'r',	/* right arr. */
-    MOD_MASK_SHIFT, '%', 'j',			'&', '5',	/* resume */
-    MOD_MASK_SHIFT, '!', '1',			'&', '6',	/* save */
-    MOD_MASK_SHIFT, '!', '2',			'&', '7',	/* suspend */
-    MOD_MASK_SHIFT, '!', '3',			'&', '8',	/* undo */
-    MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_UP,	'k', 'u',	/* up arrow */
-    MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_DOWN,	'k', 'd',	/* down arrow */
+//  mod mask	    with modifier		without modifier
+    MOD_MASK_SHIFT, '&', '9',			'@', '1',	// begin
+    MOD_MASK_SHIFT, '&', '0',			'@', '2',	// cancel
+    MOD_MASK_SHIFT, '*', '1',			'@', '4',	// command
+    MOD_MASK_SHIFT, '*', '2',			'@', '5',	// copy
+    MOD_MASK_SHIFT, '*', '3',			'@', '6',	// create
+    MOD_MASK_SHIFT, '*', '4',			'k', 'D',	// delete char
+    MOD_MASK_SHIFT, '*', '5',			'k', 'L',	// delete line
+    MOD_MASK_SHIFT, '*', '7',			'@', '7',	// end
+    MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_END,	'@', '7',	// end
+    MOD_MASK_SHIFT, '*', '9',			'@', '9',	// exit
+    MOD_MASK_SHIFT, '*', '0',			'@', '0',	// find
+    MOD_MASK_SHIFT, '#', '1',			'%', '1',	// help
+    MOD_MASK_SHIFT, '#', '2',			'k', 'h',	// home
+    MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_HOME,	'k', 'h',	// home
+    MOD_MASK_SHIFT, '#', '3',			'k', 'I',	// insert
+    MOD_MASK_SHIFT, '#', '4',			'k', 'l',	// left arrow
+    MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_LEFT,	'k', 'l',	// left arrow
+    MOD_MASK_SHIFT, '%', 'a',			'%', '3',	// message
+    MOD_MASK_SHIFT, '%', 'b',			'%', '4',	// move
+    MOD_MASK_SHIFT, '%', 'c',			'%', '5',	// next
+    MOD_MASK_SHIFT, '%', 'd',			'%', '7',	// options
+    MOD_MASK_SHIFT, '%', 'e',			'%', '8',	// previous
+    MOD_MASK_SHIFT, '%', 'f',			'%', '9',	// print
+    MOD_MASK_SHIFT, '%', 'g',			'%', '0',	// redo
+    MOD_MASK_SHIFT, '%', 'h',			'&', '3',	// replace
+    MOD_MASK_SHIFT, '%', 'i',			'k', 'r',	// right arr.
+    MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_RIGHT,	'k', 'r',	// right arr.
+    MOD_MASK_SHIFT, '%', 'j',			'&', '5',	// resume
+    MOD_MASK_SHIFT, '!', '1',			'&', '6',	// save
+    MOD_MASK_SHIFT, '!', '2',			'&', '7',	// suspend
+    MOD_MASK_SHIFT, '!', '3',			'&', '8',	// undo
+    MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_UP,	'k', 'u',	// up arrow
+    MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_DOWN,	'k', 'd',	// down arrow
 
-								/* vt100 F1 */
+								// vt100 F1
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF1,	KS_EXTRA, (int)KE_XF1,
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF2,	KS_EXTRA, (int)KE_XF2,
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF3,	KS_EXTRA, (int)KE_XF3,
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF4,	KS_EXTRA, (int)KE_XF4,
 
-    MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F1,	'k', '1',	/* F1 */
+    MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F1,	'k', '1',	// F1
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F2,	'k', '2',
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F3,	'k', '3',
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F4,	'k', '4',
@@ -2278,7 +2277,7 @@
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F7,	'k', '7',
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F8,	'k', '8',
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F9,	'k', '9',
-    MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F10,	'k', ';',	/* F10 */
+    MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F10,	'k', ';',	// F10
 
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F11,	'F', '1',
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F12,	'F', '2',
@@ -2310,7 +2309,7 @@
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F36,	'F', 'Q',
     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F37,	'F', 'R',
 
-							    /* TAB pseudo code*/
+							    // TAB pseudo code
     MOD_MASK_SHIFT, 'k', 'B',			KS_EXTRA, (int)KE_TAB,
 
     NUL
@@ -2318,29 +2317,29 @@
 
 static struct key_name_entry
 {
-    int	    key;	/* Special key code or ascii value */
-    char_u  *name;	/* Name of key */
+    int	    key;	// Special key code or ascii value
+    char_u  *name;	// Name of key
 } key_names_table[] =
 {
     {' ',		(char_u *)"Space"},
     {TAB,		(char_u *)"Tab"},
     {K_TAB,		(char_u *)"Tab"},
     {NL,		(char_u *)"NL"},
-    {NL,		(char_u *)"NewLine"},	/* Alternative name */
-    {NL,		(char_u *)"LineFeed"},	/* Alternative name */
-    {NL,		(char_u *)"LF"},	/* Alternative name */
+    {NL,		(char_u *)"NewLine"},	// Alternative name
+    {NL,		(char_u *)"LineFeed"},	// Alternative name
+    {NL,		(char_u *)"LF"},	// Alternative name
     {CAR,		(char_u *)"CR"},
-    {CAR,		(char_u *)"Return"},	/* Alternative name */
-    {CAR,		(char_u *)"Enter"},	/* Alternative name */
+    {CAR,		(char_u *)"Return"},	// Alternative name
+    {CAR,		(char_u *)"Enter"},	// Alternative name
     {K_BS,		(char_u *)"BS"},
-    {K_BS,		(char_u *)"BackSpace"},	/* Alternative name */
+    {K_BS,		(char_u *)"BackSpace"},	// Alternative name
     {ESC,		(char_u *)"Esc"},
     {CSI,		(char_u *)"CSI"},
     {K_CSI,		(char_u *)"xCSI"},
     {'|',		(char_u *)"Bar"},
     {'\\',		(char_u *)"Bslash"},
     {K_DEL,		(char_u *)"Del"},
-    {K_DEL,		(char_u *)"Delete"},	/* Alternative name */
+    {K_DEL,		(char_u *)"Delete"},	// Alternative name
     {K_KDEL,		(char_u *)"kDel"},
     {K_UP,		(char_u *)"Up"},
     {K_DOWN,		(char_u *)"Down"},
@@ -2402,7 +2401,7 @@
     {K_HELP,		(char_u *)"Help"},
     {K_UNDO,		(char_u *)"Undo"},
     {K_INS,		(char_u *)"Insert"},
-    {K_INS,		(char_u *)"Ins"},	/* Alternative name */
+    {K_INS,		(char_u *)"Ins"},	// Alternative name
     {K_KINS,		(char_u *)"kInsert"},
     {K_HOME,		(char_u *)"Home"},
     {K_KHOME,		(char_u *)"kHome"},
@@ -2471,8 +2470,8 @@
     {K_MOUSEUP,		(char_u *)"ScrollWheelDown"},
     {K_MOUSELEFT,	(char_u *)"ScrollWheelRight"},
     {K_MOUSERIGHT,	(char_u *)"ScrollWheelLeft"},
-    {K_MOUSEDOWN,	(char_u *)"MouseDown"}, /* OBSOLETE: Use	  */
-    {K_MOUSEUP,		(char_u *)"MouseUp"},	/* ScrollWheelXXX instead */
+    {K_MOUSEDOWN,	(char_u *)"MouseDown"}, // OBSOLETE: Use
+    {K_MOUSEUP,		(char_u *)"MouseUp"},	// ScrollWheelXXX instead
     {K_X1MOUSE,		(char_u *)"X1Mouse"},
     {K_X1DRAG,		(char_u *)"X1Drag"},
     {K_X1RELEASE,		(char_u *)"X1Release"},
@@ -2488,7 +2487,7 @@
     {K_CURSORHOLD,	(char_u *)"CursorHold"},
     {K_IGNORE,		(char_u *)"Ignore"},
     {0,			NULL}
-    /* NOTE: When adding a long name update MAX_KEY_NAME_LEN. */
+    // NOTE: When adding a long name update MAX_KEY_NAME_LEN.
 };
 
 #define KEY_NAMES_TABLE_LEN (sizeof(key_names_table) / sizeof(struct key_name_entry))
@@ -2522,7 +2521,7 @@
 
     if (*modifiers & (MOD_MASK_SHIFT | MOD_MASK_CTRL | MOD_MASK_ALT))
     {
-	/* TAB is a special case */
+	// TAB is a special case
 	if (key == TAB && (*modifiers & MOD_MASK_SHIFT))
 	{
 	    *modifiers &= ~MOD_MASK_SHIFT;
@@ -2587,7 +2586,7 @@
     string[0] = '<';
     idx = 1;
 
-    /* Key that stands for a normal character. */
+    // Key that stands for a normal character.
     if (IS_SPECIAL(c) && KEY2TERMCAP0(c) == KS_KEY)
 	c = KEY2TERMCAP1(c);
 
@@ -2608,7 +2607,7 @@
 	    }
     }
 
-    /* try to find the key in the special key table */
+    // try to find the key in the special key table
     table_idx = find_special_key_in_table(c);
 
     /*
@@ -2623,7 +2622,7 @@
 	{
 	    c &= 0x7f;
 	    modifiers |= MOD_MASK_ALT;
-	    /* try again, to find the un-alted key in the special key table */
+	    // try again, to find the un-alted key in the special key table
 	    table_idx = find_special_key_in_table(c);
 	}
 	if (table_idx < 0 && !vim_isprintc(c) && c < ' ')
@@ -2637,7 +2636,7 @@
 	}
     }
 
-    /* translate the modifier into a string */
+    // translate the modifier into a string
     for (i = 0; mod_mask_table[i].name != 'A'; i++)
 	if ((modifiers & mod_mask_table[i].mod_mask)
 						== mod_mask_table[i].mod_flag)
@@ -2646,7 +2645,7 @@
 	    string[idx++] = (char_u)'-';
 	}
 
-    if (table_idx < 0)		/* unknown special key, may output t_xx */
+    if (table_idx < 0)		// unknown special key, may output t_xx
     {
 	if (IS_SPECIAL(c))
 	{
@@ -2655,7 +2654,7 @@
 	    string[idx++] = KEY2TERMCAP0(c);
 	    string[idx++] = KEY2TERMCAP1(c);
 	}
-	/* Not a special key, only modifiers, output directly */
+	// Not a special key, only modifiers, output directly
 	else
 	{
 	    if (has_mbyte && (*mb_char2len)(c) > 1)
@@ -2670,7 +2669,7 @@
 	    }
 	}
     }
-    else		/* use name of special key */
+    else		// use name of special key
     {
 	size_t len = STRLEN(key_names_table[table_idx].name);
 
@@ -2723,7 +2722,7 @@
 {
     int		dlen = 0;
 
-    /* Put the appropriate modifier in a string */
+    // Put the appropriate modifier in a string
     if (modifiers != 0)
     {
 	dst[dlen++] = K_SPECIAL;
@@ -2776,7 +2775,7 @@
     if (src[0] != '<')
 	return 0;
 
-    /* Find end of modifier list */
+    // Find end of modifier list
     last_dash = src;
     for (bp = src + 1; *bp == '-' || vim_isIDc(*bp); bp++)
     {
@@ -2800,7 +2799,7 @@
 	    }
 	}
 	if (bp[0] == 't' && bp[1] == '_' && bp[2] && bp[3])
-	    bp += 3;	/* skip t_xx, xx may be '-' or '>' */
+	    bp += 3;	// skip t_xx, xx may be '-' or '>'
 	else if (STRNICMP(bp, "char-", 5) == 0)
 	{
 	    vim_str2nr(bp + 5, NULL, &l, STR2NR_ALL, NULL, NULL, 0, TRUE);
@@ -2814,11 +2813,11 @@
 	}
     }
 
-    if (*bp == '>')	/* found matching '>' */
+    if (*bp == '>')	// found matching '>'
     {
 	end_of_name = bp + 1;
 
-	/* Which modifiers are given? */
+	// Which modifiers are given?
 	modifiers = 0x0;
 	for (bp = src + 1; bp < last_dash; bp++)
 	{
@@ -2826,7 +2825,7 @@
 	    {
 		bit = name_to_mod_mask(*bp);
 		if (bit == 0x0)
-		    break;	/* Illegal modifier name */
+		    break;	// Illegal modifier name
 		modifiers |= bit;
 	    }
 	}
@@ -2839,7 +2838,7 @@
 	    if (STRNICMP(last_dash + 1, "char-", 5) == 0
 						 && VIM_ISDIGIT(last_dash[6]))
 	    {
-		/* <Char-123> or <Char-033> or <Char-0x33> */
+		// <Char-123> or <Char-033> or <Char-0x33>
 		vim_str2nr(last_dash + 6, NULL, &l, STR2NR_ALL, NULL,
 								  &n, 0, TRUE);
 		if (l == 0)
@@ -2853,7 +2852,7 @@
 	    {
 		int off = 1;
 
-		/* Modifier with single letter, or special key name.  */
+		// Modifier with single letter, or special key name.
 		if (in_string && last_dash[1] == '\\' && last_dash[2] == '"')
 		    off = 2;
 		if (has_mbyte)
@@ -2884,7 +2883,7 @@
 
 		if (!keycode)
 		{
-		    /* don't want keycode, use single byte code */
+		    // don't want keycode, use single byte code
 		    if (key == K_BS)
 			key = BS;
 		    else if (key == K_DEL || key == K_KDEL)
@@ -2948,7 +2947,7 @@
     {
 	key = Ctrl_chr(key);
 	modifiers &= ~MOD_MASK_CTRL;
-	/* <C-@> is <Nul> */
+	// <C-@> is <Nul>
 	if (key == 0)
 	    key = K_ZERO;
 	if (did_simplify != NULL)
@@ -2956,14 +2955,14 @@
     }
 
 #ifdef MACOS_X
-    /* Command-key really special, no fancynest */
+    // Command-key really special, no fancynest
     if (!(modifiers & MOD_MASK_CMD))
 #endif
     if (simplify && (modifiers & MOD_MASK_ALT) && key < 0x80
 	    && !enc_dbcs)		// avoid creating a lead byte
     {
 	key |= 0x80;
-	modifiers &= ~MOD_MASK_ALT;	/* remove the META modifier */
+	modifiers &= ~MOD_MASK_ALT;	// remove the META modifier
 	if (did_simplify != NULL)
 	    *did_simplify = TRUE;
     }
@@ -3057,7 +3056,7 @@
     int
 get_fileformat_force(
     buf_T	*buf,
-    exarg_T	*eap)	    /* can be NULL! */
+    exarg_T	*eap)	    // can be NULL!
 {
     int		c;
 
@@ -3085,7 +3084,7 @@
     void
 set_fileformat(
     int		t,
-    int		opt_flags)	/* OPT_LOCAL and/or OPT_GLOBAL */
+    int		opt_flags)	// OPT_LOCAL and/or OPT_GLOBAL
 {
     char	*p = NULL;
 
@@ -3108,11 +3107,11 @@
 	set_string_option_direct((char_u *)"ff", -1, (char_u *)p,
 						     OPT_FREE | opt_flags, 0);
 
-    /* This may cause the buffer to become (un)modified. */
+    // This may cause the buffer to become (un)modified.
     check_status(curbuf);
     redraw_tabline = TRUE;
 #ifdef FEAT_TITLE
-    need_maketitle = TRUE;	    /* set window title later */
+    need_maketitle = TRUE;	    // set window title later
 #endif
 }
 
@@ -3165,13 +3164,13 @@
     else
     {
 #ifdef FEAT_GUI_MSWIN
-	/* Don't hide the pointer while executing a shell command. */
+	// Don't hide the pointer while executing a shell command.
 	gui_mch_mousehide(FALSE);
 #endif
 #ifdef FEAT_GUI
 	++hold_gui_events;
 #endif
-	/* The external command may update a tags file, clear cached tags. */
+	// The external command may update a tags file, clear cached tags.
 	tag_freematch();
 
 	if (cmd == NULL || *p_sxq == NUL)
@@ -3269,7 +3268,7 @@
     char_u	*t1;
     char_u	*t2;
 
-    /* safety check */
+    // safety check
     if (f1 == NULL || f2 == NULL)
 	return FALSE;
 
@@ -3327,11 +3326,11 @@
 illegal_slash(const char *name)
 {
     if (name[0] == NUL)
-	return FALSE;	    /* no file name is not illegal */
+	return FALSE;	    // no file name is not illegal
     if (name[strlen(name) - 1] != '/')
-	return FALSE;	    /* no trailing slash */
+	return FALSE;	    // no trailing slash
     if (mch_isdir((char_u *)name))
-	return FALSE;	    /* trailing slash for a directory */
+	return FALSE;	    // trailing slash for a directory
     return TRUE;
 }
 
@@ -3341,8 +3340,8 @@
     int
 vim_stat(const char *name, stat_T *stp)
 {
-    /* On Solaris stat() accepts "file/" as if it was "file".  Return -1 if
-     * the name ends in "/" and it's not a directory. */
+    // On Solaris stat() accepts "file/" as if it was "file".  Return -1 if
+    // the name ends in "/" and it's not a directory.
     return illegal_slash(name) ? -1 : stat(name, stp);
 }
 #endif
@@ -3355,9 +3354,9 @@
 
 cursorentry_T shape_table[SHAPE_IDX_COUNT] =
 {
-    /* The values will be filled in from the 'guicursor' and 'mouseshape'
-     * defaults when Vim starts.
-     * Adjust the SHAPE_IDX_ defines when making changes! */
+    // The values will be filled in from the 'guicursor' and 'mouseshape'
+    // defaults when Vim starts.
+    // Adjust the SHAPE_IDX_ defines when making changes!
     {0,	0, 0, 700L, 400L, 250L, 0, 0, "n", SHAPE_CURSOR+SHAPE_MOUSE},
     {0,	0, 0, 700L, 400L, 250L, 0, 0, "v", SHAPE_CURSOR+SHAPE_MOUSE},
     {0,	0, 0, 700L, 400L, 250L, 0, 0, "i", SHAPE_CURSOR+SHAPE_MOUSE},
@@ -3384,8 +3383,8 @@
  */
 static char * mshape_names[] =
 {
-    "arrow",	/* default, must be the first one */
-    "blank",	/* hidden */
+    "arrow",	// default, must be the first one
+    "blank",	// hidden
     "beam",
     "updown",
     "udsizing",
@@ -3417,12 +3416,12 @@
     char_u	*commap;
     char_u	*slashp;
     char_u	*p, *endp;
-    int		idx = 0;		/* init for GCC */
+    int		idx = 0;		// init for GCC
     int		all_idx;
     int		len;
     int		i;
     long	n;
-    int		found_ve = FALSE;	/* found "ve" flag */
+    int		found_ve = FALSE;	// found "ve" flag
     int		round;
 
     /*
@@ -3458,7 +3457,7 @@
 	    {
 		if (all_idx < 0)
 		{
-		    /* Find the mode. */
+		    // Find the mode.
 		    if (modep[1] == '-' || modep[1] == ':')
 			len = 1;
 		    else
@@ -3487,13 +3486,13 @@
 #ifdef FEAT_MOUSESHAPE
 		    if (what == SHAPE_MOUSE)
 		    {
-			/* Set the default, for the missing parts */
+			// Set the default, for the missing parts
 			shape_table[idx].mshape = 0;
 		    }
 		    else
 #endif
 		    {
-			/* Set the defaults, for the missing parts */
+			// Set the defaults, for the missing parts
 			shape_table[idx].shape = SHAPE_BLOCK;
 			shape_table[idx].blinkwait = 700L;
 			shape_table[idx].blinkon = 400L;
@@ -3501,7 +3500,7 @@
 		    }
 		}
 
-		/* Parse the part after the colon */
+		// Parse the part after the colon
 		for (p = colonp + 1; *p && *p != ','; )
 		{
 #ifdef FEAT_MOUSESHAPE
@@ -3530,7 +3529,7 @@
 			    }
 			}
 		    }
-		    else /* if (what == SHAPE_MOUSE) */
+		    else // if (what == SHAPE_MOUSE)
 #endif
 		    {
 			/*
@@ -3554,7 +3553,7 @@
 			    if (!VIM_ISDIGIT(*p))
 				return N_("E548: digit expected");
 			    n = getdigits(&p);
-			    if (len == 3)   /* "ver" or "hor" */
+			    if (len == 3)   // "ver" or "hor"
 			    {
 				if (n == 0)
 				    return N_("E549: Illegal percentage");
@@ -3583,20 +3582,20 @@
 				shape_table[idx].shape = SHAPE_BLOCK;
 			    p += 5;
 			}
-			else	/* must be a highlight group name then */
+			else	// must be a highlight group name then
 			{
 			    endp = vim_strchr(p, '-');
-			    if (commap == NULL)		    /* last part */
+			    if (commap == NULL)		    // last part
 			    {
 				if (endp == NULL)
-				    endp = p + STRLEN(p);   /* find end of part */
+				    endp = p + STRLEN(p);   // find end of part
 			    }
 			    else if (endp > commap || endp == NULL)
 				endp = commap;
 			    slashp = vim_strchr(p, '/');
 			    if (slashp != NULL && slashp < endp)
 			    {
-				/* "group/langmap_group" */
+				// "group/langmap_group"
 				i = syn_check_group(p, (int)(slashp - p));
 				p = slashp + 1;
 			    }
@@ -3610,7 +3609,7 @@
 			    }
 			    p = endp;
 			}
-		    } /* if (what != SHAPE_MOUSE) */
+		    } // if (what != SHAPE_MOUSE)
 
 		    if (*p == '-')
 			++p;
@@ -3622,7 +3621,7 @@
 	}
     }
 
-    /* If the 's' flag is not given, use the 'v' cursor for 's' */
+    // If the 's' flag is not given, use the 'v' cursor for 's'
     if (!found_ve)
     {
 #ifdef FEAT_MOUSESHAPE
@@ -3719,19 +3718,19 @@
 {
     int new_mouse_shape;
 
-    /* Only works in GUI mode. */
+    // Only works in GUI mode.
     if (!gui.in_use || gui.starting)
 	return;
 
-    /* Postpone the updating when more is to come.  Speeds up executing of
-     * mappings. */
+    // Postpone the updating when more is to come.  Speeds up executing of
+    // mappings.
     if (shape_idx == -1 && char_avail())
     {
 	postponed_mouseshape = TRUE;
 	return;
     }
 
-    /* When ignoring the mouse don't change shape on the statusline. */
+    // When ignoring the mouse don't change shape on the statusline.
     if (*p_mouse == NUL
 	    && (shape_idx == SHAPE_IDX_CLINE
 		|| shape_idx == SHAPE_IDX_STATUS
@@ -3756,7 +3755,7 @@
 }
 # endif
 
-#endif /* CURSOR_SHAPE */
+#endif // CURSOR_SHAPE
 
 
 /*
@@ -3829,12 +3828,12 @@
 	for (i = gap; i < elm_count; ++i)
 	    for (j = i - gap; j >= 0; j -= gap)
 	    {
-		/* Compare the elements. */
+		// Compare the elements.
 		p1 = (char_u *)base + j * elm_size;
 		p2 = (char_u *)base + (j + gap) * elm_size;
 		if ((*cmp)((void *)p1, (void *)p2) <= 0)
 		    break;
-		/* Exchange the elements. */
+		// Exchange the elements.
 		mch_memmove(buf, p1, elm_size);
 		mch_memmove(p1, p2, elm_size);
 		mch_memmove(p2, buf, elm_size);
@@ -3891,14 +3890,14 @@
 
 #if !defined(HAVE_SETENV) && !defined(HAVE_PUTENV)
 
-#define EXTRASIZE 5		/* increment to add to env. size */
+#define EXTRASIZE 5		// increment to add to env. size
 
-static int  envsize = -1;	/* current size of environment */
-extern char **environ;		/* the global which is your env. */
+static int  envsize = -1;	// current size of environment
+extern char **environ;		// the global which is your env.
 
-static int  findenv(char *name); /* look for a name in the env. */
-static int  newenv(void);	/* copy env. from stack to heap */
-static int  moreenv(void);	/* incr. size of env. */
+static int  findenv(char *name); // look for a name in the env.
+static int  newenv(void);	// copy env. from stack to heap
+static int  moreenv(void);	// incr. size of env.
 
     int
 putenv(const char *string)
@@ -3907,33 +3906,33 @@
     char    *p;
 
     if (envsize < 0)
-    {				/* first time putenv called */
-	if (newenv() < 0)	/* copy env. to heap */
+    {				// first time putenv called
+	if (newenv() < 0)	// copy env. to heap
 	    return -1;
     }
 
-    i = findenv((char *)string); /* look for name in environment */
+    i = findenv((char *)string); // look for name in environment
 
     if (i < 0)
-    {				/* name must be added */
+    {				// name must be added
 	for (i = 0; environ[i]; i++);
 	if (i >= (envsize - 1))
-	{			/* need new slot */
+	{			// need new slot
 	    if (moreenv() < 0)
 		return -1;
 	}
 	p = alloc(strlen(string) + 1);
-	if (p == NULL)		/* not enough core */
+	if (p == NULL)		// not enough core
 	    return -1;
-	environ[i + 1] = 0;	/* new end of env. */
+	environ[i + 1] = 0;	// new end of env.
     }
     else
-    {				/* name already in env. */
+    {				// name already in env.
 	p = vim_realloc(environ[i], strlen(string) + 1);
 	if (p == NULL)
 	    return -1;
     }
-    sprintf(p, "%s", string);	/* copy into env. */
+    sprintf(p, "%s", string);	// copy into env.
     environ[i] = p;
 
     return 0;
@@ -4027,7 +4026,7 @@
 }
 # endif
 
-#endif /* !defined(HAVE_SETENV) && !defined(HAVE_PUTENV) */
+#endif // !defined(HAVE_SETENV) && !defined(HAVE_PUTENV)
 
 #if defined(FEAT_EVAL) || defined(FEAT_SPELL) || defined(PROTO)
 /*
@@ -4108,8 +4107,8 @@
 get4c(FILE *fd)
 {
     int		c;
-    /* Use unsigned rather than int otherwise result is undefined
-     * when left-shift sets the MSB. */
+    // Use unsigned rather than int otherwise result is undefined
+    // when left-shift sets the MSB.
     unsigned	n;
 
     c = getc(fd);
@@ -4158,11 +4157,11 @@
     int		i;
     int		c;
 
-    /* allocate memory */
+    // allocate memory
     str = alloc(cnt + 1);
     if (str != NULL)
     {
-	/* Read the string.  Quit when running into the EOF. */
+	// Read the string.  Quit when running into the EOF.
 	for (i = 0; i < cnt; ++i)
 	{
 	    c = getc(fd);
@@ -4194,8 +4193,8 @@
 
 #ifdef _MSC_VER
 # if (_MSC_VER <= 1200)
-/* This line is required for VC6 without the service pack.  Also see the
- * matching #pragma below. */
+// This line is required for VC6 without the service pack.  Also see the
+// matching #pragma below.
  #  pragma optimize("", off)
 # endif
 #endif
@@ -4224,17 +4223,17 @@
     int		bi = 0;
     time_T	wtime = the_time;
 
-    /* time_T can be up to 8 bytes in size, more than long_u, thus we
-     * can't use put_bytes() here.
-     * Another problem is that ">>" may do an arithmetic shift that keeps the
-     * sign.  This happens for large values of wtime.  A cast to long_u may
-     * truncate if time_T is 8 bytes.  So only use a cast when it is 4 bytes,
-     * it's safe to assume that long_u is 4 bytes or more and when using 8
-     * bytes the top bit won't be set. */
+    // time_T can be up to 8 bytes in size, more than long_u, thus we
+    // can't use put_bytes() here.
+    // Another problem is that ">>" may do an arithmetic shift that keeps the
+    // sign.  This happens for large values of wtime.  A cast to long_u may
+    // truncate if time_T is 8 bytes.  So only use a cast when it is 4 bytes,
+    // it's safe to assume that long_u is 4 bytes or more and when using 8
+    // bytes the top bit won't be set.
     for (i = 7; i >= 0; --i)
     {
 	if (i + 1 > (int)sizeof(time_T))
-	    /* ">>" doesn't work well when shifting more bits than avail */
+	    // ">>" doesn't work well when shifting more bits than avail
 	    buf[bi++] = 0;
 	else
 	{
@@ -4274,7 +4273,7 @@
 }
 #endif
 
-#ifndef PROTO  /* proto is defined in vim.h */
+#ifndef PROTO  // proto is defined in vim.h
 # ifdef ELAPSED_TIMEVAL
 /*
  * Return time in msec since "start_tv".
@@ -4368,7 +4367,7 @@
 	{
 	    if (use_shcf)
 	    {
-		/* Account for possible multiple args in p_shcf. */
+		// Account for possible multiple args in p_shcf.
 		p = p_shcf;
 		for (;;)
 		{
@@ -4381,7 +4380,7 @@
 	    }
 
 	    *argv = ALLOC_MULT(char *, *argc + 4);
-	    if (*argv == NULL)	    /* out of memory */
+	    if (*argv == NULL)	    // out of memory
 		return FAIL;
 	}
     }
@@ -4400,7 +4399,7 @@
     char_u	*cmd_copy;
     int		i;
 
-    /* Make a copy, parsing will modify "cmd". */
+    // Make a copy, parsing will modify "cmd".
     cmd_copy = vim_strsave(cmd);
     if (cmd_copy == NULL
 	    || mch_parse_cmd(cmd_copy, FALSE, argv, argc) == FAIL)
@@ -4426,7 +4425,7 @@
     listitem_T  *li;
     char_u	*s;
 
-    /* Pass argv[] to mch_call_shell(). */
+    // Pass argv[] to mch_call_shell().
     *argv = ALLOC_MULT(char *, l->lv_len + 1);
     if (*argv == NULL)
 	return FAIL;
diff --git a/src/move.c b/src/move.c
index 6121e3e..6b85454 100644
--- a/src/move.c
+++ b/src/move.c
@@ -25,11 +25,11 @@
 
 typedef struct
 {
-    linenr_T	    lnum;	/* line number */
+    linenr_T	    lnum;	// line number
 #ifdef FEAT_DIFF
-    int		    fill;	/* filler lines */
+    int		    fill;	// filler lines
 #endif
-    int		    height;	/* height of added line */
+    int		    height;	// height of added line
 } lineoff_T;
 
 static void topline_back(lineoff_T *lp);
@@ -108,7 +108,7 @@
 #endif
     }
 
-    /* wp->w_botline is the line that is just below the window */
+    // wp->w_botline is the line that is just below the window
     wp->w_botline = lnum;
     wp->w_valid |= VALID_BOTLINE|VALID_BOTLINE_AP;
 
@@ -192,8 +192,8 @@
     long        *so_ptr = curwin->w_p_so >= 0 ? &curwin->w_p_so : &p_so;
     int		save_so = *so_ptr;
 
-    /* If there is no valid screen and when the window height is zero just use
-     * the cursor line. */
+    // If there is no valid screen and when the window height is zero just use
+    // the cursor line.
     if (!screen_valid(TRUE) || curwin->w_height == 0)
     {
 	curwin->w_topline = curwin->w_cursor.lnum;
@@ -207,7 +207,7 @@
     if (curwin->w_valid & VALID_TOPLINE)
 	return;
 
-    /* When dragging with the mouse, don't scroll that quickly */
+    // When dragging with the mouse, don't scroll that quickly
     if (mouse_dragging > 0)
 	*so_ptr = mouse_dragging - 1;
 
@@ -219,7 +219,7 @@
     /*
      * If the buffer is empty, always set topline to 1.
      */
-    if (BUFEMPTY())		/* special case - file is empty */
+    if (BUFEMPTY())		// special case - file is empty
     {
 	if (curwin->w_topline != 1)
 	    redraw_later(NOT_VALID);
@@ -237,16 +237,16 @@
     {
 	if (curwin->w_topline > 1)
 	{
-	    /* If the cursor is above topline, scrolling is always needed.
-	     * If the cursor is far below topline and there is no folding,
-	     * scrolling down is never needed. */
+	    // If the cursor is above topline, scrolling is always needed.
+	    // If the cursor is far below topline and there is no folding,
+	    // scrolling down is never needed.
 	    if (curwin->w_cursor.lnum < curwin->w_topline)
 		check_topline = TRUE;
 	    else if (check_top_offset())
 		check_topline = TRUE;
 	}
 #ifdef FEAT_DIFF
-	    /* Check if there are more filler lines than allowed. */
+	    // Check if there are more filler lines than allowed.
 	if (!check_topline && curwin->w_topfill > diff_check_fill(curwin,
 							   curwin->w_topline))
 	    check_topline = TRUE;
@@ -261,15 +261,15 @@
 #ifdef FEAT_FOLDING
 	    if (hasAnyFolding(curwin))
 	    {
-		/* Count the number of logical lines between the cursor and
-		 * topline + scrolloff (approximation of how much will be
-		 * scrolled). */
+		// Count the number of logical lines between the cursor and
+		// topline + scrolloff (approximation of how much will be
+		// scrolled).
 		n = 0;
 		for (lnum = curwin->w_cursor.lnum;
-				      lnum < curwin->w_topline + *so_ptr; ++lnum)
+				    lnum < curwin->w_topline + *so_ptr; ++lnum)
 		{
 		    ++n;
-		    /* stop at end of file or when we know we are far off */
+		    // stop at end of file or when we know we are far off
 		    if (lnum >= curbuf->b_ml.ml_line_count || n >= halfheight)
 			break;
 		    (void)hasFolding(lnum, NULL, &lnum);
@@ -279,9 +279,9 @@
 #endif
 		n = curwin->w_topline + *so_ptr - curwin->w_cursor.lnum;
 
-	    /* If we weren't very close to begin with, we scroll to put the
-	     * cursor in the middle of the window.  Otherwise put the cursor
-	     * near the top of the window. */
+	    // If we weren't very close to begin with, we scroll to put the
+	    // cursor in the middle of the window.  Otherwise put the cursor
+	    // near the top of the window.
 	    if (n >= halfheight)
 		scroll_cursor_halfway(FALSE);
 	    else
@@ -294,7 +294,7 @@
 	else
 	{
 #ifdef FEAT_FOLDING
-	    /* Make sure topline is the first line of a fold. */
+	    // Make sure topline is the first line of a fold.
 	    (void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
 #endif
 	    check_botline = TRUE;
@@ -327,13 +327,13 @@
 	      {
 		lineoff_T	loff;
 
-		/* Cursor is (a few lines) above botline, check if there are
-		 * 'scrolloff' window lines below the cursor.  If not, need to
-		 * scroll. */
+		// Cursor is (a few lines) above botline, check if there are
+		// 'scrolloff' window lines below the cursor.  If not, need to
+		// scroll.
 		n = curwin->w_empty_rows;
 		loff.lnum = curwin->w_cursor.lnum;
 #ifdef FEAT_FOLDING
-		/* In a fold go to its last line. */
+		// In a fold go to its last line.
 		(void)hasFolding(loff.lnum, NULL, &loff.lnum);
 #endif
 #ifdef FEAT_DIFF
@@ -353,11 +353,11 @@
 		    botline_forw(&loff);
 		}
 		if (n >= *so_ptr)
-		    /* sufficient context, no need to scroll */
+		    // sufficient context, no need to scroll
 		    check_botline = FALSE;
 	      }
 	      else
-		  /* sufficient context, no need to scroll */
+		  // sufficient context, no need to scroll
 		  check_botline = FALSE;
 	    }
 	    if (check_botline)
@@ -365,15 +365,15 @@
 #ifdef FEAT_FOLDING
 		if (hasAnyFolding(curwin))
 		{
-		    /* Count the number of logical lines between the cursor and
-		     * botline - scrolloff (approximation of how much will be
-		     * scrolled). */
+		    // Count the number of logical lines between the cursor and
+		    // botline - scrolloff (approximation of how much will be
+		    // scrolled).
 		    line_count = 0;
 		    for (lnum = curwin->w_cursor.lnum;
-				     lnum >= curwin->w_botline - *so_ptr; --lnum)
+				   lnum >= curwin->w_botline - *so_ptr; --lnum)
 		    {
 			++line_count;
-			/* stop at end of file or when we know we are far off */
+			// stop at end of file or when we know we are far off
 			if (lnum <= 0 || line_count > curwin->w_height + 1)
 			    break;
 			(void)hasFolding(lnum, &lnum, NULL);
@@ -409,7 +409,7 @@
 	}
 	else
 	    redraw_later(VALID);
-	/* May need to set w_skipcol when cursor in w_topline. */
+	// May need to set w_skipcol when cursor in w_topline.
 	if (curwin->w_cursor.lnum == curwin->w_topline)
 	    validate_cursor();
     }
@@ -450,15 +450,15 @@
 	loff.lnum = curwin->w_cursor.lnum;
 #ifdef FEAT_DIFF
 	loff.fill = 0;
-	n = curwin->w_topfill;	    /* always have this context */
+	n = curwin->w_topfill;	    // always have this context
 #else
 	n = 0;
 #endif
-	/* Count the visible screen lines above the cursor line. */
+	// Count the visible screen lines above the cursor line.
 	while (n < so)
 	{
 	    topline_back(&loff);
-	    /* Stop when included a line above the window. */
+	    // Stop when included a line above the window.
 	    if (loff.lnum < curwin->w_topline
 #ifdef FEAT_DIFF
 		    || (loff.lnum == curwin->w_topline && loff.fill > 0)
@@ -535,10 +535,10 @@
 set_topline(win_T *wp, linenr_T lnum)
 {
 #ifdef FEAT_FOLDING
-    /* go to first of folded lines */
+    // go to first of folded lines
     (void)hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL);
 #endif
-    /* Approximate the value of w_botline */
+    // Approximate the value of w_botline
     wp->w_botline += lnum - wp->w_topline;
     wp->w_topline = lnum;
     wp->w_topline_was_set = TRUE;
@@ -546,7 +546,7 @@
     wp->w_topfill = 0;
 #endif
     wp->w_valid &= ~(VALID_WROW|VALID_CROW|VALID_BOTLINE|VALID_TOPLINE);
-    /* Don't set VALID_TOPLINE here, 'scrolloff' needs to be checked. */
+    // Don't set VALID_TOPLINE here, 'scrolloff' needs to be checked.
     redraw_later(VALID);
 }
 
@@ -675,7 +675,7 @@
     long	fold_count;
 #endif
 
-    /* Check if wp->w_lines[].wl_size is invalid */
+    // Check if wp->w_lines[].wl_size is invalid
     all_invalid = (!redrawing()
 			|| wp->w_lines_valid == 0
 			|| wp->w_lines[0].wl_lnum > wp->w_topline);
@@ -687,12 +687,12 @@
 	if (!all_invalid && i < wp->w_lines_valid)
 	{
 	    if (wp->w_lines[i].wl_lnum < lnum || !wp->w_lines[i].wl_valid)
-		continue;		/* skip changed or deleted lines */
+		continue;		// skip changed or deleted lines
 	    if (wp->w_lines[i].wl_lnum == lnum)
 	    {
 #ifdef FEAT_FOLDING
-		/* Check for newly inserted lines below this row, in which
-		 * case we need to check for folded lines. */
+		// Check for newly inserted lines below this row, in which
+		// case we need to check for folded lines.
 		if (!wp->w_buffer->b_mod_set
 			|| wp->w_lines[i].wl_lastlnum < wp->w_cursor.lnum
 			|| wp->w_buffer->b_mod_top
@@ -701,7 +701,7 @@
 		valid = TRUE;
 	    }
 	    else if (wp->w_lines[i].wl_lnum > lnum)
-		--i;			/* hold at inserted lines */
+		--i;			// hold at inserted lines
 	}
 	if (valid
 #ifdef FEAT_DIFF
@@ -711,7 +711,7 @@
 	{
 #ifdef FEAT_FOLDING
 	    lnum = wp->w_lines[i].wl_lastlnum + 1;
-	    /* Cursor inside folded lines, don't count this row */
+	    // Cursor inside folded lines, don't count this row
 	    if (lnum > wp->w_cursor.lnum)
 		break;
 #else
@@ -765,7 +765,7 @@
 	}
 	else if (i > wp->w_lines_valid)
 	{
-	    /* a line that is too long to fit on the last screen line */
+	    // a line that is too long to fit on the last screen line
 	    wp->w_cline_height = 0;
 #ifdef FEAT_FOLDING
 	    wp->w_cline_folded = hasFoldingWin(wp, wp->w_cursor.lnum,
@@ -854,11 +854,11 @@
 	col += off;
 	width = curwin->w_width - off + curwin_col_off2();
 
-	/* long line wrapping, adjust curwin->w_wrow */
+	// long line wrapping, adjust curwin->w_wrow
 	if (curwin->w_p_wrap
 		&& col >= (colnr_T)curwin->w_width
 		&& width > 0)
-	    /* use same formula as what is used in curs_columns() */
+	    // use same formula as what is used in curs_columns()
 	    col -= ((col - curwin->w_width) / width + 1) * width;
 	if (col > (int)curwin->w_leftcol)
 	    col -= curwin->w_leftcol;
@@ -922,10 +922,10 @@
  */
     void
 curs_columns(
-    int		may_scroll)	/* when TRUE, may scroll horizontally */
+    int		may_scroll)	// when TRUE, may scroll horizontally
 {
     int		diff;
-    int		extra;		/* offset for first screen line */
+    int		extra;		// offset for first screen line
     int		off_left, off_right;
     int		n;
     int		p_lines;
@@ -954,14 +954,14 @@
      */
 #ifdef FEAT_FOLDING
     if (curwin->w_cline_folded)
-	/* In a folded line the cursor is always in the first column */
+	// In a folded line the cursor is always in the first column
 	startcol = curwin->w_virtcol = endcol = curwin->w_leftcol;
     else
 #endif
 	getvvcol(curwin, &curwin->w_cursor,
 				&startcol, &(curwin->w_virtcol), &endcol);
 
-    /* remove '$' from change command when cursor moves onto it */
+    // remove '$' from change command when cursor moves onto it
     if (startcol > dollar_vcol)
 	dollar_vcol = -1;
 
@@ -977,7 +977,7 @@
     textwidth = curwin->w_width - extra;
     if (textwidth <= 0)
     {
-	/* No room for text, put cursor in last char of window. */
+	// No room for text, put cursor in last char of window.
 	curwin->w_wcol = curwin->w_width - 1;
 	curwin->w_wrow = curwin->w_height - 1;
     }
@@ -985,22 +985,22 @@
     {
 	width = textwidth + curwin_col_off2();
 
-	/* long line wrapping, adjust curwin->w_wrow */
+	// long line wrapping, adjust curwin->w_wrow
 	if (curwin->w_wcol >= curwin->w_width)
 	{
 #ifdef FEAT_LINEBREAK
 	    char_u *sbr;
 #endif
 
-	    /* this same formula is used in validate_cursor_col() */
+	    // this same formula is used in validate_cursor_col()
 	    n = (curwin->w_wcol - curwin->w_width) / width + 1;
 	    curwin->w_wcol -= n * width;
 	    curwin->w_wrow += n;
 
 #ifdef FEAT_LINEBREAK
-	    /* When cursor wraps to first char of next line in Insert
-	     * mode, the 'showbreak' string isn't shown, backup to first
-	     * column */
+	    // When cursor wraps to first char of next line in Insert
+	    // mode, the 'showbreak' string isn't shown, backup to first
+	    // column
 	    sbr = get_showbreak_value(curwin);
 	    if (*sbr && *ml_get_cursor() == NUL
 				    && curwin->w_wcol == (int)vim_strsize(sbr))
@@ -1009,9 +1009,9 @@
 	}
     }
 
-    /* No line wrapping: compute curwin->w_leftcol if scrolling is on and line
-     * is not folded.
-     * If scrolling is off, curwin->w_leftcol is assumed to be 0 */
+    // No line wrapping: compute curwin->w_leftcol if scrolling is on and line
+    // is not folded.
+    // If scrolling is off, curwin->w_leftcol is assumed to be 0
     else if (may_scroll
 #ifdef FEAT_FOLDING
 	    && !curwin->w_cline_folded
@@ -1034,8 +1034,8 @@
 	    else
 		diff = off_right;
 
-	    /* When far off or not enough room on either side, put cursor in
-	     * middle of window. */
+	    // When far off or not enough room on either side, put cursor in
+	    // middle of window.
 	    if (p_ss == 0 || diff >= textwidth / 2 || off_right >= off_left)
 		new_leftcol = curwin->w_wcol - extra - textwidth / 2;
 	    else
@@ -1052,7 +1052,7 @@
 	    if (new_leftcol != (int)curwin->w_leftcol)
 	    {
 		curwin->w_leftcol = new_leftcol;
-		/* screen has to be redrawn with new curwin->w_leftcol */
+		// screen has to be redrawn with new curwin->w_leftcol
 		redraw_later(NOT_VALID);
 	    }
 	}
@@ -1064,8 +1064,8 @@
 	curwin->w_wcol = 0;
 
 #ifdef FEAT_DIFF
-    /* Skip over filler lines.  At the top use w_topfill, there
-     * may be some filler lines above the window. */
+    // Skip over filler lines.  At the top use w_topfill, there
+    // may be some filler lines above the window.
     if (curwin->w_cursor.lnum == curwin->w_topline)
 	curwin->w_wrow += curwin->w_topfill;
     else
@@ -1092,17 +1092,17 @@
 	    && width > 0
 	    && curwin->w_width != 0)
     {
-	/* Cursor past end of screen.  Happens with a single line that does
-	 * not fit on screen.  Find a skipcol to show the text around the
-	 * cursor.  Avoid scrolling all the time. compute value of "extra":
-	 * 1: Less than 'scrolloff' lines above
-	 * 2: Less than 'scrolloff' lines below
-	 * 3: both of them */
+	// Cursor past end of screen.  Happens with a single line that does
+	// not fit on screen.  Find a skipcol to show the text around the
+	// cursor.  Avoid scrolling all the time. compute value of "extra":
+	// 1: Less than 'scrolloff' lines above
+	// 2: Less than 'scrolloff' lines below
+	// 3: both of them
 	extra = 0;
 	if (curwin->w_skipcol + so * width > curwin->w_virtcol)
 	    extra = 1;
-	/* Compute last display line of the buffer line that we want at the
-	 * bottom of the window. */
+	// Compute last display line of the buffer line that we want at the
+	// bottom of the window.
 	if (p_lines == 0)
 	    p_lines = plines_win(curwin, curwin->w_cursor.lnum, FALSE);
 	--p_lines;
@@ -1115,20 +1115,20 @@
 
 	if (extra == 3 || p_lines < so * 2)
 	{
-	    /* not enough room for 'scrolloff', put cursor in the middle */
+	    // not enough room for 'scrolloff', put cursor in the middle
 	    n = curwin->w_virtcol / width;
 	    if (n > curwin->w_height / 2)
 		n -= curwin->w_height / 2;
 	    else
 		n = 0;
-	    /* don't skip more than necessary */
+	    // don't skip more than necessary
 	    if (n > p_lines - curwin->w_height + 1)
 		n = p_lines - curwin->w_height + 1;
 	    curwin->w_skipcol = n * width;
 	}
 	else if (extra == 1)
 	{
-	    /* less then 'scrolloff' lines above, decrease skipcol */
+	    // less then 'scrolloff' lines above, decrease skipcol
 	    extra = (curwin->w_skipcol + so * width - curwin->w_virtcol
 				     + width - 1) / width;
 	    if (extra > 0)
@@ -1140,7 +1140,7 @@
 	}
 	else if (extra == 2)
 	{
-	    /* less then 'scrolloff' lines below, increase skipcol */
+	    // less then 'scrolloff' lines below, increase skipcol
 	    endcol = (n - curwin->w_height + 1) * width;
 	    while (endcol > curwin->w_virtcol)
 		endcol -= width;
@@ -1151,7 +1151,7 @@
 	curwin->w_wrow -= curwin->w_skipcol / width;
 	if (curwin->w_wrow >= curwin->w_height)
 	{
-	    /* small window, make sure cursor is in it */
+	    // small window, make sure cursor is in it
 	    extra = curwin->w_wrow - curwin->w_height + 1;
 	    curwin->w_skipcol += extra * width;
 	    curwin->w_wrow -= extra;
@@ -1169,7 +1169,7 @@
 	redraw_later(NOT_VALID);
 
 #ifdef FEAT_SYN_HL
-    /* Redraw when w_virtcol changes and 'cursorcolumn' is set */
+    // Redraw when w_virtcol changes and 'cursorcolumn' is set
     if (curwin->w_p_cuc && (curwin->w_valid & VALID_VIRTCOL) == 0
 	    && !pum_visible())
 	redraw_later(SOME_VALID);
@@ -1279,19 +1279,19 @@
     void
 scrolldown(
     long	line_count,
-    int		byfold UNUSED)	/* TRUE: count a closed fold as one line */
+    int		byfold UNUSED)	// TRUE: count a closed fold as one line
 {
-    long	done = 0;	/* total # of physical lines done */
+    long	done = 0;	// total # of physical lines done
     int		wrow;
     int		moved = FALSE;
 
 #ifdef FEAT_FOLDING
     linenr_T	first;
 
-    /* Make sure w_topline is at the first of a sequence of folded lines. */
+    // Make sure w_topline is at the first of a sequence of folded lines.
     (void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
 #endif
-    validate_cursor();		/* w_wrow needs to be valid */
+    validate_cursor();		// w_wrow needs to be valid
     while (line_count-- > 0)
     {
 #ifdef FEAT_DIFF
@@ -1311,7 +1311,7 @@
 	    curwin->w_topfill = 0;
 #endif
 #ifdef FEAT_FOLDING
-	    /* A sequence of folded lines only counts for one logical line */
+	    // A sequence of folded lines only counts for one logical line
 	    if (hasFolding(curwin->w_topline, &first, NULL))
 	    {
 		++done;
@@ -1324,11 +1324,11 @@
 #endif
 		done += PLINES_NOFILL(curwin->w_topline);
 	}
-	--curwin->w_botline;		/* approximate w_botline */
+	--curwin->w_botline;		// approximate w_botline
 	invalidate_botline();
     }
-    curwin->w_wrow += done;		/* keep w_wrow updated */
-    curwin->w_cline_row += done;	/* keep w_cline_row updated */
+    curwin->w_wrow += done;		// keep w_wrow updated
+    curwin->w_cline_row += done;	// keep w_cline_row updated
 
 #ifdef FEAT_DIFF
     if (curwin->w_cursor.lnum == curwin->w_topline)
@@ -1369,7 +1369,7 @@
     if (moved)
     {
 #ifdef FEAT_FOLDING
-	/* Move cursor to first line of closed fold. */
+	// Move cursor to first line of closed fold.
 	foldAdjustCursor();
 #endif
 	coladvance(curwin->w_curswant);
@@ -1382,7 +1382,7 @@
     void
 scrollup(
     long	line_count,
-    int		byfold UNUSED)	/* TRUE: count a closed fold as one line */
+    int		byfold UNUSED)	// TRUE: count a closed fold as one line
 {
 #if defined(FEAT_FOLDING) || defined(FEAT_DIFF)
     linenr_T	lnum;
@@ -1399,7 +1399,7 @@
 # endif
 	    )
     {
-	/* count each sequence of folded lines as one logical line */
+	// count each sequence of folded lines as one logical line
 	lnum = curwin->w_topline;
 	while (line_count--)
 	{
@@ -1421,7 +1421,7 @@
 # endif
 	    }
 	}
-	/* approximate w_botline */
+	// approximate w_botline
 	curwin->w_botline += lnum - curwin->w_topline;
 	curwin->w_topline = lnum;
     }
@@ -1429,7 +1429,7 @@
 #endif
     {
 	curwin->w_topline += line_count;
-	curwin->w_botline += line_count;	/* approximate w_botline */
+	curwin->w_botline += line_count;	// approximate w_botline
     }
 
     if (curwin->w_topline > curbuf->b_ml.ml_line_count)
@@ -1443,7 +1443,7 @@
 
 #ifdef FEAT_FOLDING
     if (hasAnyFolding(curwin))
-	/* Make sure w_topline is at the first of a sequence of folded lines. */
+	// Make sure w_topline is at the first of a sequence of folded lines.
 	(void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
 #endif
 
@@ -1464,7 +1464,7 @@
     void
 check_topfill(
     win_T	*wp,
-    int		down)	/* when TRUE scroll down when not enough space */
+    int		down)	// when TRUE scroll down when not enough space
 {
     int		n;
 
@@ -1529,7 +1529,7 @@
 	    )
 	return;
 
-    validate_cursor();	    /* w_wrow needs to be valid */
+    validate_cursor();	    // w_wrow needs to be valid
 
     /*
      * Compute the row number of the last row of the cursor line
@@ -1571,7 +1571,7 @@
 #ifdef FEAT_FOLDING
 	(void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
 #endif
-	--curwin->w_botline;	    /* approximate w_botline */
+	--curwin->w_botline;	    // approximate w_botline
 	curwin->w_valid &= ~(VALID_WROW|VALID_CROW|VALID_BOTLINE);
     }
 }
@@ -1592,7 +1592,7 @@
 	    )
 	return;
 
-    validate_cursor();	    /* w_wrow needs to be valid */
+    validate_cursor();	    // w_wrow needs to be valid
 
     /*
      * Compute the row number of the first row of the cursor line
@@ -1623,7 +1623,7 @@
 #endif
 	    ++curwin->w_topline;
 	}
-	++curwin->w_botline;		/* approximate w_botline */
+	++curwin->w_botline;		// approximate w_botline
 	curwin->w_valid &= ~(VALID_WROW|VALID_CROW|VALID_BOTLINE);
     }
 }
@@ -1640,7 +1640,7 @@
 #ifdef FEAT_DIFF
     if (lp->fill < diff_check_fill(curwin, lp->lnum))
     {
-	/* Add a filler line. */
+	// Add a filler line.
 	++lp->fill;
 	lp->height = 1;
     }
@@ -1656,7 +1656,7 @@
 	else
 #ifdef FEAT_FOLDING
 	    if (hasFolding(lp->lnum, &lp->lnum, NULL))
-	    /* Add a closed fold */
+	    // Add a closed fold
 	    lp->height = 1;
 	else
 #endif
@@ -1676,7 +1676,7 @@
 #ifdef FEAT_DIFF
     if (lp->fill < diff_check_fill(curwin, lp->lnum + 1))
     {
-	/* Add a filler line. */
+	// Add a filler line.
 	++lp->fill;
 	lp->height = 1;
     }
@@ -1692,7 +1692,7 @@
 	else
 #ifdef FEAT_FOLDING
 	    if (hasFolding(lp->lnum, NULL, &lp->lnum))
-	    /* Add a closed fold */
+	    // Add a closed fold
 	    lp->height = 1;
 	else
 #endif
@@ -1744,8 +1744,8 @@
     int		extra = 0;
     int		used;
     int		i;
-    linenr_T	top;		/* just above displayed lines */
-    linenr_T	bot;		/* just below displayed lines */
+    linenr_T	top;		// just above displayed lines
+    linenr_T	bot;		// just below displayed lines
     linenr_T	old_topline = curwin->w_topline;
 #ifdef FEAT_DIFF
     linenr_T	old_topfill = curwin->w_topfill;
@@ -1764,7 +1764,7 @@
      * - at least 'scrolloff' lines above and below the cursor
      */
     validate_cheight();
-    used = curwin->w_cline_height; /* includes filler lines above */
+    used = curwin->w_cline_height; // includes filler lines above
     if (curwin->w_cursor.lnum < curwin->w_topline)
 	scrolled = used;
 
@@ -1783,9 +1783,9 @@
     new_topline = top + 1;
 
 #ifdef FEAT_DIFF
-    /* "used" already contains the number of filler lines above, don't add it
-     * again.
-     * Hide filler lines above cursor line by adding them to "extra". */
+    // "used" already contains the number of filler lines above, don't add it
+    // again.
+    // Hide filler lines above cursor line by adding them to "extra".
     extra += diff_check_fill(curwin, curwin->w_cursor.lnum);
 #endif
 
@@ -1797,7 +1797,7 @@
     {
 #ifdef FEAT_FOLDING
 	if (hasFolding(top, &top, NULL))
-	    /* count one logical line for a sequence of folded lines */
+	    // count one logical line for a sequence of folded lines
 	    i = 1;
 	else
 #endif
@@ -1807,7 +1807,7 @@
 	{
 #ifdef FEAT_FOLDING
 	    if (hasFolding(bot, NULL, &bot))
-		/* count one logical line for a sequence of folded lines */
+		// count one logical line for a sequence of folded lines
 		++used;
 	    else
 #endif
@@ -1880,7 +1880,7 @@
     wp->w_filler_rows = 0;
 #endif
     if (used == 0)
-	wp->w_empty_rows = 0;	/* single line that doesn't fit */
+	wp->w_empty_rows = 0;	// single line that doesn't fit
     else
     {
 	wp->w_empty_rows = wp->w_height - used;
@@ -1924,7 +1924,7 @@
     linenr_T	old_botline = curwin->w_botline;
     linenr_T	old_valid = curwin->w_valid;
     int		old_empty_rows = curwin->w_empty_rows;
-    linenr_T	cln;		    /* Cursor Line Number */
+    linenr_T	cln;		    // Cursor Line Number
     long        so = get_scrolloff_value();
 
     cln = curwin->w_cursor.lnum;
@@ -1960,7 +1960,7 @@
     else
 	validate_botline();
 
-    /* The lines of the cursor line itself are always used. */
+    // The lines of the cursor line itself are always used.
 #ifdef FEAT_DIFF
     used = plines_nofill(cln);
 #else
@@ -1968,9 +1968,9 @@
     used = curwin->w_cline_height;
 #endif
 
-    /* If the cursor is below botline, we will at least scroll by the height
-     * of the cursor line.  Correct for empty lines, which are really part of
-     * botline. */
+    // If the cursor is below botline, we will at least scroll by the height
+    // of the cursor line.  Correct for empty lines, which are really part of
+    // botline.
     if (cln >= curwin->w_botline)
     {
 	scrolled = used;
@@ -2001,8 +2001,8 @@
 
     while (loff.lnum > 1)
     {
-	/* Stop when scrolled nothing or at least "min_scroll", found "extra"
-	 * context for 'scrolloff' and counted all lines below the window. */
+	// Stop when scrolled nothing or at least "min_scroll", found "extra"
+	// context for 'scrolloff' and counted all lines below the window.
 	if ((((scrolled <= 0 || scrolled >= min_scroll)
 		    && extra >= (mouse_dragging > 0 ? mouse_dragging - 1 : so))
 		    || boff.lnum + 1 > curbuf->b_ml.ml_line_count)
@@ -2014,7 +2014,7 @@
 		)
 	    break;
 
-	/* Add one line above */
+	// Add one line above
 	topline_back(&loff);
 	if (loff.height == MAXCOL)
 	    used = MAXCOL;
@@ -2029,7 +2029,7 @@
 #endif
 		)
 	{
-	    /* Count screen lines that are below the window. */
+	    // Count screen lines that are below the window.
 	    scrolled += loff.height;
 	    if (loff.lnum == curwin->w_botline
 #ifdef FEAT_DIFF
@@ -2041,7 +2041,7 @@
 
 	if (boff.lnum < curbuf->b_ml.ml_line_count)
 	{
-	    /* Add one line below */
+	    // Add one line below
 	    botline_forw(&boff);
 	    used += boff.height;
 	    if (used > curwin->w_height)
@@ -2057,7 +2057,7 @@
 #endif
 		   )
 		{
-		    /* Count screen lines that are below the window. */
+		    // Count screen lines that are below the window.
 		    scrolled += boff.height;
 		    if (boff.lnum == curwin->w_botline
 #ifdef FEAT_DIFF
@@ -2070,13 +2070,13 @@
 	}
     }
 
-    /* curwin->w_empty_rows is larger, no need to scroll */
+    // curwin->w_empty_rows is larger, no need to scroll
     if (scrolled <= 0)
 	line_count = 0;
-    /* more than a screenfull, don't scroll but redraw */
+    // more than a screenfull, don't scroll but redraw
     else if (used > curwin->w_height)
 	line_count = used;
-    /* scroll minimal number of lines */
+    // scroll minimal number of lines
     else
     {
 	line_count = 0;
@@ -2090,7 +2090,7 @@
 	    i += boff.height;
 	    ++line_count;
 	}
-	if (i < scrolled)	/* below curwin->w_botline, don't scroll */
+	if (i < scrolled)	// below curwin->w_botline, don't scroll
 	    line_count = 9999;
     }
 
@@ -2151,7 +2151,7 @@
     topline = loff.lnum;
     while (topline > 1)
     {
-	if (below <= above)	    /* add a line below the cursor first */
+	if (below <= above)	    // add a line below the cursor first
 	{
 	    if (boff.lnum < curbuf->b_ml.ml_line_count)
 	    {
@@ -2163,13 +2163,13 @@
 	    }
 	    else
 	    {
-		++below;	    /* count a "~" line */
+		++below;	    // count a "~" line
 		if (atend)
 		    ++used;
 	    }
 	}
 
-	if (below > above)	    /* add a line above the cursor */
+	if (below > above)	    // add a line above the cursor
 	{
 	    topline_back(&loff);
 	    if (loff.height == MAXCOL)
@@ -2208,12 +2208,12 @@
     void
 cursor_correct(void)
 {
-    int		above = 0;	    /* screen lines above topline */
+    int		above = 0;	    // screen lines above topline
     linenr_T	topline;
-    int		below = 0;	    /* screen lines below botline */
+    int		below = 0;	    // screen lines below botline
     linenr_T	botline;
     int		above_wanted, below_wanted;
-    linenr_T	cln;		    /* Cursor Line Number */
+    linenr_T	cln;		    // Cursor Line Number
     int		max_off;
     long        so = get_scrolloff_value();
 
@@ -2267,7 +2267,7 @@
     topline = curwin->w_topline;
     botline = curwin->w_botline - 1;
 #ifdef FEAT_DIFF
-    /* count filler lines as context */
+    // count filler lines as context
     above = curwin->w_topfill;
     below = curwin->w_filler_rows;
 #endif
@@ -2292,7 +2292,7 @@
 #endif
 		above += PLINES_NOFILL(topline);
 #ifdef FEAT_DIFF
-	    /* Count filler lines below this line as context. */
+	    // Count filler lines below this line as context.
 	    if (topline < botline)
 		above += diff_check_fill(curwin, topline + 1);
 #endif
@@ -2337,7 +2337,7 @@
     linenr_T	old_topline = curwin->w_topline;
     long        so = get_scrolloff_value();
 
-    if (curbuf->b_ml.ml_line_count == 1)    /* nothing to do */
+    if (curbuf->b_ml.ml_line_count == 1)    // nothing to do
     {
 	beep_flush();
 	return FAIL;
@@ -2374,7 +2374,7 @@
 	{
 	    if (ONE_WINDOW && p_window > 0 && p_window < Rows - 1)
 	    {
-		/* Vi compatible scrolling */
+		// Vi compatible scrolling
 		if (p_window <= 2)
 		    ++curwin->w_topline;
 		else
@@ -2385,7 +2385,7 @@
 	    }
 	    else if (curwin->w_botline > curbuf->b_ml.ml_line_count)
 	    {
-		/* at end of file */
+		// at end of file
 		curwin->w_topline = curbuf->b_ml.ml_line_count;
 #ifdef FEAT_DIFF
 		curwin->w_topfill = 0;
@@ -2394,8 +2394,8 @@
 	    }
 	    else
 	    {
-		/* For the overlap, start with the line just below the window
-		 * and go upwards. */
+		// For the overlap, start with the line just below the window
+		// and go upwards.
 		loff.lnum = curwin->w_botline;
 #ifdef FEAT_DIFF
 		loff.fill = diff_check_fill(curwin, loff.lnum)
@@ -2412,19 +2412,19 @@
 				   VALID_CROW|VALID_BOTLINE|VALID_BOTLINE_AP);
 	    }
 	}
-	else	/* dir == BACKWARDS */
+	else	// dir == BACKWARDS
 	{
 #ifdef FEAT_DIFF
 	    if (curwin->w_topline == 1)
 	    {
-		/* Include max number of filler lines */
+		// Include max number of filler lines
 		max_topfill();
 		continue;
 	    }
 #endif
 	    if (ONE_WINDOW && p_window > 0 && p_window < Rows - 1)
 	    {
-		/* Vi compatible scrolling (sort of) */
+		// Vi compatible scrolling (sort of)
 		if (p_window <= 2)
 		    --curwin->w_topline;
 		else
@@ -2437,9 +2437,9 @@
 		continue;
 	    }
 
-	    /* Find the line at the top of the window that is going to be the
-	     * line at the bottom of the window.  Make sure this results in
-	     * the same line as before doing CTRL-F. */
+	    // Find the line at the top of the window that is going to be the
+	    // line at the bottom of the window.  Make sure this results in
+	    // the same line as before doing CTRL-F.
 	    loff.lnum = curwin->w_topline - 1;
 #ifdef FEAT_DIFF
 	    loff.fill = diff_check_fill(curwin, loff.lnum + 1)
@@ -2460,8 +2460,8 @@
 	    }
 	    curwin->w_cursor.lnum = loff.lnum;
 
-	    /* Find the line just above the new topline to get the right line
-	     * at the bottom of the window. */
+	    // Find the line just above the new topline to get the right line
+	    // at the bottom of the window.
 	    n = 0;
 	    while (n <= curwin->w_height && loff.lnum >= 1)
 	    {
@@ -2471,7 +2471,7 @@
 		else
 		    n += loff.height;
 	    }
-	    if (loff.lnum < 1)			/* at begin of file */
+	    if (loff.lnum < 1)			// at begin of file
 	    {
 		curwin->w_topline = 1;
 #ifdef FEAT_DIFF
@@ -2481,7 +2481,7 @@
 	    }
 	    else
 	    {
-		/* Go two lines forward again. */
+		// Go two lines forward again.
 #ifdef FEAT_DIFF
 		topline_botline(&loff);
 #endif
@@ -2491,12 +2491,12 @@
 		botline_topline(&loff);
 #endif
 #ifdef FEAT_FOLDING
-		/* We're at the wrong end of a fold now. */
+		// We're at the wrong end of a fold now.
 		(void)hasFolding(loff.lnum, &loff.lnum, NULL);
 #endif
 
-		/* Always scroll at least one line.  Avoid getting stuck on
-		 * very long lines. */
+		// Always scroll at least one line.  Avoid getting stuck on
+		// very long lines.
 		if (loff.lnum >= curwin->w_topline
 #ifdef FEAT_DIFF
 			&& (loff.lnum > curwin->w_topline
@@ -2505,8 +2505,8 @@
 			)
 		{
 #ifdef FEAT_DIFF
-		    /* First try using the maximum number of filler lines.  If
-		     * that's not enough, backup one line. */
+		    // First try using the maximum number of filler lines.  If
+		    // that's not enough, backup one line.
 		    loff.fill = curwin->w_topfill;
 		    if (curwin->w_topfill < diff_check_fill(curwin,
 							   curwin->w_topline))
@@ -2601,7 +2601,7 @@
 #endif
     h1 = lp->height;
     if (h1 > min_height)
-	return;		/* no overlap */
+	return;		// no overlap
 
     loff0 = *lp;
     if (dir > 0)
@@ -2611,7 +2611,7 @@
     h2 = lp->height;
     if (h2 == MAXCOL || h2 + h1 > min_height)
     {
-	*lp = loff0;	/* no overlap */
+	*lp = loff0;	// no overlap
 	return;
     }
 
@@ -2623,7 +2623,7 @@
     h3 = lp->height;
     if (h3 == MAXCOL || h3 + h2 > min_height)
     {
-	*lp = loff0;	/* no overlap */
+	*lp = loff0;	// no overlap
 	return;
     }
 
@@ -2634,9 +2634,9 @@
 	topline_back(lp);
     h4 = lp->height;
     if (h4 == MAXCOL || h4 + h3 + h2 > min_height || h3 + h2 + h1 > min_height)
-	*lp = loff1;	/* 1 line overlap */
+	*lp = loff1;	// 1 line overlap
     else
-	*lp = loff2;	/* 2 lines overlap */
+	*lp = loff2;	// 2 lines overlap
     return;
 }
 
@@ -2814,7 +2814,7 @@
 	}
     }
 # ifdef FEAT_FOLDING
-    /* Move cursor to first line of closed fold. */
+    // Move cursor to first line of closed fold.
     foldAdjustCursor();
 # endif
 #ifdef FEAT_DIFF
@@ -2846,7 +2846,7 @@
     FOR_ALL_WINDOWS(curwin)
     {
 	curbuf = curwin->w_buffer;
-	/* skip original window  and windows with 'noscrollbind' */
+	// skip original window  and windows with 'noscrollbind'
 	if (curwin != old_curwin && curwin->w_p_crb)
 	{
 # ifdef FEAT_DIFF
@@ -2861,8 +2861,8 @@
 	    curwin->w_curswant = curswant;
 	    curwin->w_set_curswant = set_curswant;
 
-	    /* Make sure the cursor is in a valid position.  Temporarily set
-	     * "restart_edit" to allow the cursor to be beyond the EOL. */
+	    // Make sure the cursor is in a valid position.  Temporarily set
+	    // "restart_edit" to allow the cursor to be beyond the EOL.
 	    restart_edit_save = restart_edit;
 	    restart_edit = TRUE;
 	    check_cursor();
@@ -2871,12 +2871,12 @@
 		validate_cursor();
 # endif
 	    restart_edit = restart_edit_save;
-	    /* Correct cursor for multi-byte character. */
+	    // Correct cursor for multi-byte character.
 	    if (has_mbyte)
 		mb_adjust_cursor();
 	    redraw_later(VALID);
 
-	    /* Only scroll when 'scrollbind' hasn't done this. */
+	    // Only scroll when 'scrollbind' hasn't done this.
 	    if (!curwin->w_p_scb)
 		update_topline();
 	    curwin->w_redr_status = TRUE;
diff --git a/src/version.c b/src/version.c
index 67b4c4b..740f059 100644
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    26,
+/**/
     25,
 /**/
     24,
