diff --git a/src/os_unix.c b/src/os_unix.c
index fd50eb3..90c5aed 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -24,7 +24,7 @@
 # include "if_mzsch.h"
 #endif
 
-#include "os_unixx.h"	    /* unix includes for os_unix.c only */
+#include "os_unixx.h"	    // unix includes for os_unix.c only
 
 #ifdef USE_XSMP
 # include <X11/SM/SMlib.h>
@@ -51,8 +51,8 @@
 #ifdef __CYGWIN__
 # ifndef MSWIN
 #  include <cygwin/version.h>
-#  include <sys/cygwin.h>	/* for cygwin_conv_to_posix_path() and/or
-				 * for cygwin_conv_path() */
+#  include <sys/cygwin.h>	// for cygwin_conv_to_posix_path() and/or
+				// for cygwin_conv_path()
 #  ifdef FEAT_CYGWIN_WIN32_CLIPBOARD
 #   define WIN32_LEAN_AND_MEAN
 #   include <windows.h>
@@ -63,11 +63,10 @@
 
 #ifdef FEAT_MOUSE_GPM
 # include <gpm.h>
-/* <linux/keyboard.h> contains defines conflicting with "keymap.h",
- * I just copied relevant defines here. A cleaner solution would be to put gpm
- * code into separate file and include there linux/keyboard.h
- */
-/* #include <linux/keyboard.h> */
+// <linux/keyboard.h> contains defines conflicting with "keymap.h",
+// I just copied relevant defines here. A cleaner solution would be to put gpm
+// code into separate file and include there linux/keyboard.h
+// #include <linux/keyboard.h>
 # define KG_SHIFT	0
 # define KG_CTRL	2
 # define KG_ALT		3
@@ -96,7 +95,7 @@
  * end of autoconf section. To be extended...
  */
 
-/* Are the following #ifdefs still required? And why? Is that for X11? */
+// Are the following #ifdefs still required? And why? Is that for X11?
 
 #if defined(ESIX) || defined(M_UNIX) && !defined(SCO)
 # ifdef SIGWINCH
@@ -107,7 +106,7 @@
 # endif
 #endif
 
-#if defined(SIGWINDOW) && !defined(SIGWINCH)	/* hpux 9.01 has it */
+#if defined(SIGWINDOW) && !defined(SIGWINCH)	// hpux 9.01 has it
 # define SIGWINCH SIGWINDOW
 #endif
 
@@ -157,7 +156,7 @@
 
 #ifdef FEAT_XCLIPBOARD
 static int do_xterm_trace(void);
-# define XT_TRACE_DELAY	50	/* delay for xterm tracing */
+# define XT_TRACE_DELAY	50	// delay for xterm tracing
 #endif
 
 static void handle_resize(void);
@@ -175,7 +174,7 @@
 	&& defined(FEAT_TITLE) && !defined(FEAT_GUI_GTK)
 # define SET_SIG_ALARM
 static RETSIGTYPE sig_alarm SIGPROTOARG;
-/* volatile because it is used in signal handler sig_alarm(). */
+// volatile because it is used in signal handler sig_alarm().
 static volatile sig_atomic_t sig_alarm_called;
 #endif
 static RETSIGTYPE deathtrap SIGPROTOARG;
@@ -201,29 +200,29 @@
 # define SIG_ERR	((RETSIGTYPE (*)())-1)
 #endif
 
-/* volatile because it is used in signal handler sig_winch(). */
+// volatile because it is used in signal handler sig_winch().
 static volatile sig_atomic_t do_resize = FALSE;
 static char_u	*extra_shell_arg = NULL;
 static int	show_shell_mess = TRUE;
-/* volatile because it is used in signal handler deathtrap(). */
-static volatile sig_atomic_t deadly_signal = 0;	   /* The signal we caught */
-/* volatile because it is used in signal handler deathtrap(). */
-static volatile sig_atomic_t in_mch_delay = FALSE; /* sleeping in mch_delay() */
+// volatile because it is used in signal handler deathtrap().
+static volatile sig_atomic_t deadly_signal = 0;	   // The signal we caught
+// volatile because it is used in signal handler deathtrap().
+static volatile sig_atomic_t in_mch_delay = FALSE; // sleeping in mch_delay()
 
 #if defined(FEAT_JOB_CHANNEL) && !defined(USE_SYSTEM)
 static int dont_check_job_ended = 0;
 #endif
 
-static int curr_tmode = TMODE_COOK;	/* contains current terminal mode */
+static int curr_tmode = TMODE_COOK;	// contains current terminal mode
 
 #ifdef USE_XSMP
 typedef struct
 {
-    SmcConn smcconn;	    /* The SM connection ID */
-    IceConn iceconn;	    /* The ICE connection ID */
-    char *clientid;	    /* The client ID for the current smc session */
-    Bool save_yourself;     /* If we're in the middle of a save_yourself */
-    Bool shutdown;	    /* If we're in shutdown mode */
+    SmcConn smcconn;	    // The SM connection ID
+    IceConn iceconn;	    // The ICE connection ID
+    char *clientid;	    // The client ID for the current smc session
+    Bool save_yourself;     // If we're in the middle of a save_yourself
+    Bool shutdown;	    // If we're in shutdown mode
 } xsmp_config_T;
 
 static xsmp_config_T xsmp;
@@ -243,9 +242,9 @@
 
 static struct signalinfo
 {
-    int	    sig;	/* Signal number, eg. SIGSEGV etc */
-    char    *name;	/* Signal name (not char_u!). */
-    char    deadly;	/* Catch as a deadly signal? */
+    int	    sig;	// Signal number, eg. SIGSEGV etc
+    char    *name;	// Signal name (not char_u!).
+    char    deadly;	// Catch as a deadly signal?
 } signal_info[] =
 {
 #ifdef SIGHUP
@@ -273,14 +272,14 @@
     {SIGBUS,	    "BUS",	TRUE},
 #endif
 #if defined(SIGSEGV) && !defined(FEAT_MZSCHEME)
-    /* MzScheme uses SEGV in its garbage collector */
+    // MzScheme uses SEGV in its garbage collector
     {SIGSEGV,	    "SEGV",	TRUE},
 #endif
 #ifdef SIGSYS
     {SIGSYS,	    "SYS",	TRUE},
 #endif
 #ifdef SIGALRM
-    {SIGALRM,	    "ALRM",	FALSE},	/* Perl's alarm() can trigger it */
+    {SIGALRM,	    "ALRM",	FALSE},	// Perl's alarm() can trigger it
 #endif
 #ifdef SIGTERM
     {SIGTERM,	    "TERM",	TRUE},
@@ -289,8 +288,8 @@
     {SIGVTALRM,	    "VTALRM",	TRUE},
 #endif
 #if defined(SIGPROF) && !defined(FEAT_MZSCHEME) && !defined(WE_ARE_PROFILING)
-    /* MzScheme uses SIGPROF for its own needs; On Linux with profiling
-     * this makes Vim exit.  WE_ARE_PROFILING is defined in Makefile.  */
+    // MzScheme uses SIGPROF for its own needs; On Linux with profiling
+    // this makes Vim exit.  WE_ARE_PROFILING is defined in Makefile.
     {SIGPROF,	    "PROF",	TRUE},
 #endif
 #ifdef SIGXCPU
@@ -303,7 +302,7 @@
     {SIGUSR1,	    "USR1",	TRUE},
 #endif
 #if defined(SIGUSR2) && !defined(FEAT_SYSMOUSE)
-    /* Used for sysmouse handling */
+    // Used for sysmouse handling
     {SIGUSR2,	    "USR2",	TRUE},
 #endif
 #ifdef SIGINT
@@ -337,7 +336,7 @@
 # endif
 }
 
-/* Why is NeXT excluded here (and not in os_unixx.h)? */
+// Why is NeXT excluded here (and not in os_unixx.h)?
 #if defined(ECHOE) && defined(ICANON) \
     && (defined(HAVE_TERMIO_H) || defined(HAVE_TERMIOS_H)) \
     && !defined(__NeXT__)
@@ -351,7 +350,7 @@
 mch_write(char_u *s, int len)
 {
     vim_ignored = (int)write(1, (char *)s, len);
-    if (p_wd)		/* Unix is too fast, slow down a bit more */
+    if (p_wd)		// Unix is too fast, slow down a bit more
 	RealWaitForChar(read_cmd_fd, p_wd, NULL, NULL);
 }
 
@@ -382,7 +381,7 @@
 mch_inchar(
     char_u	*buf,
     int		maxlen,
-    long	wtime,	    /* don't use "time", MIPS cannot handle it */
+    long	wtime,	    // don't use "time", MIPS cannot handle it
     int		tb_change_cnt)
 {
     return inchar_loop(buf, maxlen, wtime, tb_change_cnt,
@@ -439,11 +438,11 @@
 mch_total_mem(int special UNUSED)
 {
     long_u	mem = 0;
-    long_u	shiftright = 10;  /* how much to shift "mem" right for Kbyte */
+    long_u	shiftright = 10;  // how much to shift "mem" right for Kbyte
 
 # ifdef MACOS_X
     {
-	/* Mac (Darwin) way of getting the amount of RAM available */
+	// Mac (Darwin) way of getting the amount of RAM available
 	mach_port_t		host = mach_host_self();
 	kern_return_t		kret;
 #  ifdef HOST_VM_INFO64
@@ -460,7 +459,7 @@
 					       (host_info_t)&vm_stat, &count);
 #  endif
 	if (kret == KERN_SUCCESS)
-	    /* get the amount of user memory by summing each usage */
+	    // get the amount of user memory by summing each usage
 	    mem = (long_u)(vm_stat.free_count + vm_stat.active_count
 					    + vm_stat.inactive_count
 #  ifdef MAC_OS_X_VERSION_10_9
@@ -474,13 +473,13 @@
 # ifdef HAVE_SYSCTL
     if (mem == 0)
     {
-	/* BSD way of getting the amount of RAM available. */
+	// BSD way of getting the amount of RAM available.
 	int		mib[2];
 	size_t		len = sizeof(long_u);
 #  ifdef HW_USERMEM64
 	long_u		physmem;
 #  else
-	/* sysctl() may return 32 bit or 64 bit, accept both */
+	// sysctl() may return 32 bit or 64 bit, accept both
 	union {
 	    int_u	u32;
 	    long_u	u64;
@@ -512,11 +511,11 @@
     {
 	struct sysinfo sinfo;
 
-	/* Linux way of getting amount of RAM available */
+	// Linux way of getting amount of RAM available
 	if (sysinfo(&sinfo) == 0)
 	{
 #  ifdef HAVE_SYSINFO_MEM_UNIT
-	    /* avoid overflow as much as possible */
+	    // avoid overflow as much as possible
 	    while (shiftright > 0 && (sinfo.mem_unit & 1) == 0)
 	    {
 		sinfo.mem_unit = sinfo.mem_unit >> 1;
@@ -535,12 +534,12 @@
     {
 	long	    pagesize, pagecount;
 
-	/* Solaris way of getting amount of RAM available */
+	// Solaris way of getting amount of RAM available
 	pagesize = sysconf(_SC_PAGESIZE);
 	pagecount = sysconf(_SC_PHYS_PAGES);
 	if (pagesize > 0 && pagecount > 0)
 	{
-	    /* avoid overflow as much as possible */
+	    // avoid overflow as much as possible
 	    while (shiftright > 0 && (pagesize & 1) == 0)
 	    {
 		pagesize = (long_u)pagesize >> 1;
@@ -551,8 +550,8 @@
     }
 # endif
 
-    /* Return the minimum of the physical memory and the user limit, because
-     * using more than the user limit may cause Vim to be terminated. */
+    // Return the minimum of the physical memory and the user limit, because
+    // using more than the user limit may cause Vim to be terminated.
 # if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT)
     {
 	struct rlimit	rlp;
@@ -582,14 +581,14 @@
 {
     int		old_tmode;
 #ifdef FEAT_MZSCHEME
-    long	total = msec; /* remember original value */
+    long	total = msec; // remember original value
 #endif
 
     if (ignoreinput)
     {
-	/* Go to cooked mode without echo, to allow SIGINT interrupting us
-	 * here.  But we don't want QUIT to kill us (CTRL-\ used in a
-	 * shell may produce SIGQUIT). */
+	// Go to cooked mode without echo, to allow SIGINT interrupting us
+	// here.  But we don't want QUIT to kill us (CTRL-\ used in a
+	// shell may produce SIGQUIT).
 	in_mch_delay = TRUE;
 	old_tmode = curr_tmode;
 	if (curr_tmode == TMODE_RAW)
@@ -603,7 +602,7 @@
 #ifdef FEAT_MZSCHEME
 	do
 	{
-	    /* if total is large enough, wait by portions in p_mzq */
+	    // if total is large enough, wait by portions in p_mzq
 	    if (total > p_mzq)
 		msec = p_mzq;
 	    else
@@ -641,9 +640,9 @@
 	     */
 	    select(0, NULL, NULL, NULL, &tv);
 	}
-#  endif /* HAVE_SELECT */
-# endif /* HAVE_NANOSLEEP */
-#endif /* HAVE_USLEEP */
+#  endif // HAVE_SELECT
+# endif // HAVE_NANOSLEEP
+#endif // HAVE_USLEEP
 #ifdef FEAT_MZSCHEME
 	}
 	while (total > 0);
@@ -702,8 +701,8 @@
     int			i;
     long		lim;
 
-    /* Set the stack limit to 15/16 of the allowable size.  Skip this when the
-     * limit doesn't fit in a long (rlim_cur might be "long long"). */
+    // Set the stack limit to 15/16 of the allowable size.  Skip this when the
+    // limit doesn't fit in a long (rlim_cur might be "long long").
     if (getrlimit(RLIMIT_STACK, &rlp) == 0
 	    && rlp.rlim_cur < ((rlim_t)1 << (sizeof(long_u) * 8 - 1))
 #  ifdef RLIM_INFINITY
@@ -717,8 +716,8 @@
 	    pthread_attr_t  attr;
 	    size_t	    size;
 
-	    /* On FreeBSD the initial thread always has a fixed stack size, no
-	     * matter what the limits are set to.  Normally it's 1 Mbyte. */
+	    // On FreeBSD the initial thread always has a fixed stack size, no
+	    // matter what the limits are set to.  Normally it's 1 Mbyte.
 	    pthread_attr_init(&attr);
 	    if (pthread_attr_get_np(pthread_self(), &attr) == 0)
 	    {
@@ -733,14 +732,14 @@
 	{
 	    stack_limit = (char *)((long)&i - (lim / 16L * 15L));
 	    if (stack_limit >= (char *)&i)
-		/* overflow, set to 1/16 of current stack position */
+		// overflow, set to 1/16 of current stack position
 		stack_limit = (char *)((long)&i / 16L);
 	}
 	else
 	{
 	    stack_limit = (char *)((long)&i + (lim / 16L * 15L));
 	    if (stack_limit <= (char *)&i)
-		stack_limit = NULL;	/* overflow */
+		stack_limit = NULL;	// overflow
 	}
     }
 }
@@ -775,13 +774,13 @@
  */
 
 #ifndef SIGSTKSZ
-# define SIGSTKSZ 8000    /* just a guess of how much stack is needed... */
+# define SIGSTKSZ 8000    // just a guess of how much stack is needed...
 #endif
 
 # ifdef HAVE_SIGALTSTACK
-static stack_t sigstk;			/* for sigaltstack() */
+static stack_t sigstk;			// for sigaltstack()
 # else
-static struct sigstack sigstk;		/* for sigstack() */
+static struct sigstack sigstk;		// for sigstack()
 # endif
 
 static char *signal_stack;
@@ -820,7 +819,7 @@
     static RETSIGTYPE
 sig_winch SIGDEFARG(sigarg)
 {
-    /* this is not required on all systems, but it doesn't hurt anybody */
+    // this is not required on all systems, but it doesn't hurt anybody
     signal(SIGWINCH, (RETSIGTYPE (*)())sig_winch);
     do_resize = TRUE;
     SIGRETURN;
@@ -831,7 +830,7 @@
     static RETSIGTYPE
 catch_sigint SIGDEFARG(sigarg)
 {
-    /* this is not required on all systems, but it doesn't hurt anybody */
+    // this is not required on all systems, but it doesn't hurt anybody
     signal(SIGINT, (RETSIGTYPE (*)())catch_sigint);
     got_int = TRUE;
     SIGRETURN;
@@ -842,7 +841,7 @@
     static RETSIGTYPE
 catch_sigpwr SIGDEFARG(sigarg)
 {
-    /* this is not required on all systems, but it doesn't hurt anybody */
+    // this is not required on all systems, but it doesn't hurt anybody
     signal(SIGPWR, (RETSIGTYPE (*)())catch_sigpwr);
     /*
      * I'm not sure we get the SIGPWR signal when the system is really going
@@ -861,7 +860,7 @@
     static RETSIGTYPE
 sig_alarm SIGDEFARG(sigarg)
 {
-    /* doesn't do anything, just to break a system call */
+    // doesn't do anything, just to break a system call
     sig_alarm_called = TRUE;
     SIGRETURN;
 }
@@ -944,9 +943,9 @@
     static RETSIGTYPE
 deathtrap SIGDEFARG(sigarg)
 {
-    static int	entered = 0;	    /* count the number of times we got here.
-				       Note: when memory has been corrupted
-				       this may get an arbitrary value! */
+    static int	entered = 0;	    // count the number of times we got here.
+				    // Note: when memory has been corrupted
+				    // this may get an arbitrary value!
 #ifdef SIGHASARG
     int		i;
 #endif
@@ -962,24 +961,24 @@
 # if defined(SIGHASARG)
 	lc_signal = sigarg;
 # endif
-	lc_active = FALSE;	/* don't jump again */
+	lc_active = FALSE;	// don't jump again
 	LONGJMP(lc_jump_env, 1);
-	/* NOTREACHED */
+	// NOTREACHED
     }
 #endif
 
 #ifdef SIGHASARG
 # ifdef SIGQUIT
-    /* While in mch_delay() we go to cooked mode to allow a CTRL-C to
-     * interrupt us.  But in cooked mode we may also get SIGQUIT, e.g., when
-     * pressing CTRL-\, but we don't want Vim to exit then. */
+    // While in mch_delay() we go to cooked mode to allow a CTRL-C to
+    // interrupt us.  But in cooked mode we may also get SIGQUIT, e.g., when
+    // pressing CTRL-\, but we don't want Vim to exit then.
     if (in_mch_delay && sigarg == SIGQUIT)
 	SIGRETURN;
 # endif
 
-    /* When SIGHUP, SIGQUIT, etc. are blocked: postpone the effect and return
-     * here.  This avoids that a non-reentrant function is interrupted, e.g.,
-     * free().  Calling free() again may then cause a crash. */
+    // When SIGHUP, SIGQUIT, etc. are blocked: postpone the effect and return
+    // here.  This avoids that a non-reentrant function is interrupted, e.g.,
+    // free().  Calling free() again may then cause a crash.
     if (entered == 0
 	    && (0
 # ifdef SIGHUP
@@ -1005,29 +1004,29 @@
 	SIGRETURN;
 #endif
 
-    /* Remember how often we have been called. */
+    // Remember how often we have been called.
     ++entered;
 
-    /* Executing autocommands is likely to use more stack space than we have
-     * available in the signal stack. */
+    // Executing autocommands is likely to use more stack space than we have
+    // available in the signal stack.
     block_autocmds();
 
 #ifdef FEAT_EVAL
-    /* Set the v:dying variable. */
+    // Set the v:dying variable.
     set_vim_var_nr(VV_DYING, (long)entered);
 #endif
     v_dying = entered;
 
 #ifdef HAVE_STACK_LIMIT
-    /* Since we are now using the signal stack, need to reset the stack
-     * limit.  Otherwise using a regexp will fail. */
+    // Since we are now using the signal stack, need to reset the stack
+    // limit.  Otherwise using a regexp will fail.
     get_stack_limit();
 #endif
 
 #if 0
-    /* This is for opening gdb the moment Vim crashes.
-     * You need to manually adjust the file name and Vim executable name.
-     * Suggested by SungHyun Nam. */
+    // This is for opening gdb the moment Vim crashes.
+    // You need to manually adjust the file name and Vim executable name.
+    // Suggested by SungHyun Nam.
     {
 # define VI_GDB_FILE "/tmp/vimgdb"
 # define VIM_NAME "/usr/bin/vim"
@@ -1048,15 +1047,15 @@
 #endif
 
 #ifdef SIGHASARG
-    /* try to find the name of this signal */
+    // try to find the name of this signal
     for (i = 0; signal_info[i].sig != -1; i++)
 	if (sigarg == signal_info[i].sig)
 	    break;
     deadly_signal = sigarg;
 #endif
 
-    full_screen = FALSE;	/* don't write message to the GUI, it might be
-				 * part of the problem... */
+    full_screen = FALSE;	// don't write message to the GUI, it might be
+				// part of the problem...
     /*
      * If something goes wrong after entering here, we may get here again.
      * When this happens, give a message and try to exit nicely (resetting the
@@ -1068,7 +1067,7 @@
      */
     if (entered >= 3)
     {
-	reset_signals();	/* don't catch any signals anymore */
+	reset_signals();	// don't catch any signals anymore
 	may_core_dump();
 	if (entered >= 4)
 	    _exit(8);
@@ -1076,13 +1075,13 @@
     }
     if (entered == 2)
     {
-	/* No translation, it may call malloc(). */
+	// No translation, it may call malloc().
 	OUT_STR("Vim: Double signal, exiting\n");
 	out_flush();
 	getout(1);
     }
 
-    /* No translation, it may call malloc(). */
+    // No translation, it may call malloc().
 #ifdef SIGHASARG
     sprintf((char *)IObuff, "Vim: Caught deadly signal %s\n",
 							 signal_info[i].name);
@@ -1090,11 +1089,11 @@
     sprintf((char *)IObuff, "Vim: Caught deadly signal\n");
 #endif
 
-    /* Preserve files and exit.  This sets the really_exiting flag to prevent
-     * calling free(). */
+    // Preserve files and exit.  This sets the really_exiting flag to prevent
+    // calling free().
     preserve_exit();
 
-    /* NOTREACHED */
+    // NOTREACHED
 
 #ifdef NBDEBUG
     reset_signals();
@@ -1238,13 +1237,13 @@
     void
 mch_suspend(void)
 {
-    /* BeOS does have SIGTSTP, but it doesn't work. */
+    // BeOS does have SIGTSTP, but it doesn't work.
 #if defined(SIGTSTP) && !defined(__BEOS__)
     in_mch_suspend = TRUE;
 
-    out_flush();	    /* needed to make cursor visible on some systems */
+    out_flush();	    // needed to make cursor visible on some systems
     settmode(TMODE_COOK);
-    out_flush();	    /* needed to disable mouse on some systems */
+    out_flush();	    // needed to disable mouse on some systems
 
 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
     loose_clipboard();
@@ -1253,7 +1252,7 @@
     sigcont_received = FALSE;
 # endif
 
-    kill(0, SIGTSTP);	    /* send ourselves a STOP signal */
+    kill(0, SIGTSTP);	    // send ourselves a STOP signal
 
 # if defined(SIGCONT)
     /*
@@ -1374,7 +1373,7 @@
 {
     catch_signals(SIG_DFL, SIG_DFL);
 #if defined(SIGCONT)
-    /* SIGCONT isn't in the list, because its default action is ignore */
+    // SIGCONT isn't in the list, because its default action is ignore
     signal(SIGCONT, SIG_DFL);
 #endif
 }
@@ -1392,15 +1391,15 @@
 #if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
 	    struct sigaction sa;
 
-	    /* Setup to use the alternate stack for the signal function. */
+	    // Setup to use the alternate stack for the signal function.
 	    sa.sa_handler = func_deadly;
 	    sigemptyset(&sa.sa_mask);
 # if defined(__linux__) && defined(_REENTRANT)
-	    /* On Linux, with glibc compiled for kernel 2.2, there is a bug in
-	     * thread handling in combination with using the alternate stack:
-	     * pthread library functions try to use the stack pointer to
-	     * identify the current thread, causing a SEGV signal, which
-	     * recursively calls deathtrap() and hangs. */
+	    // On Linux, with glibc compiled for kernel 2.2, there is a bug in
+	    // thread handling in combination with using the alternate stack:
+	    // pthread library functions try to use the stack pointer to
+	    // identify the current thread, causing a SEGV signal, which
+	    // recursively calls deathtrap() and hangs.
 	    sa.sa_flags = 0;
 # else
 	    sa.sa_flags = SA_ONSTACK;
@@ -1410,7 +1409,7 @@
 # if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGVEC)
 	    struct sigvec sv;
 
-	    /* Setup to use the alternate stack for the signal function. */
+	    // Setup to use the alternate stack for the signal function.
 	    sv.sv_handler = func_deadly;
 	    sv.sv_mask = 0;
 	    sv.sv_flags = SV_ONSTACK;
@@ -1437,7 +1436,7 @@
 	sigaddset(&newset, signal_info[i].sig);
 
 # if defined(SIGCONT)
-    /* SIGCONT isn't in the list, because its default action is ignore */
+    // SIGCONT isn't in the list, because its default action is ignore
     sigaddset(&newset, SIGCONT);
 # endif
 
@@ -1480,12 +1479,12 @@
 			     break;
 
 	default:	     if (!blocked)
-				 return TRUE;	/* exit! */
+				 return TRUE;	// exit!
 			     got_signal = sig;
 #ifdef SIGPWR
 			     if (sig != SIGPWR)
 #endif
-				 got_int = TRUE;    /* break any loops */
+				 got_int = TRUE;    // break any loops
 			     break;
     }
     return FALSE;
@@ -1545,12 +1544,12 @@
     XGetErrorText(dpy, error_event->error_code, (char *)IObuff, IOSIZE);
     STRCAT(IObuff, _("\nVim: Got X error\n"));
 
-    /* We cannot print a message and continue, because no X calls are allowed
-     * here (causes my system to hang).  Silently continuing might be an
-     * alternative... */
-    preserve_exit();		    /* preserve files and exit */
+    // We cannot print a message and continue, because no X calls are allowed
+    // here (causes my system to hang).  Silently continuing might be an
+    // alternative...
+    preserve_exit();		    // preserve files and exit
 
-    return 0;		/* NOTREACHED */
+    return 0;		// NOTREACHED
 }
 
 /*
@@ -1603,10 +1602,10 @@
     static int
 x_IOerror_check(Display *dpy UNUSED)
 {
-    /* This function should not return, it causes exit().  Longjump instead. */
+    // This function should not return, it causes exit().  Longjump instead.
     LONGJMP(lc_jump_env, 1);
 #  if defined(VMS) || defined(__CYGWIN__)
-    return 0;  /* avoid the compiler complains about missing return value */
+    return 0;  // avoid the compiler complains about missing return value
 #  endif
 }
 # endif
@@ -1625,10 +1624,10 @@
     x11_display = NULL;
     xterm_Shell = (Widget)0;
 
-    /* This function should not return, it causes exit().  Longjump instead. */
+    // This function should not return, it causes exit().  Longjump instead.
     LONGJMP(x_jump_env, 1);
 # if defined(VMS) || defined(__CYGWIN__)
-    return 0;  /* avoid the compiler complains about missing return value */
+    return 0;  // avoid the compiler complains about missing return value
 # endif
 }
 
@@ -1646,12 +1645,12 @@
 	--xterm_dpy_retry_count;
 
 # ifndef LESSTIF_VERSION
-	/* This has been reported to avoid Vim getting stuck. */
+	// This has been reported to avoid Vim getting stuck.
 	if (app_context != (XtAppContext)NULL)
 	{
 	    XtDestroyApplicationContext(app_context);
 	    app_context = (XtAppContext)NULL;
-	    x11_display = NULL; /* freed by XtDestroyApplicationContext() */
+	    x11_display = NULL; // freed by XtDestroyApplicationContext()
 	}
 # endif
 
@@ -1723,16 +1722,16 @@
 {
     char	    *winid;
     static int	    result = -1;
-#define XD_NONE	 0	/* x11_display not set here */
-#define XD_HERE	 1	/* x11_display opened here */
-#define XD_GUI	 2	/* x11_display used from gui.dpy */
-#define XD_XTERM 3	/* x11_display used from xterm_dpy */
+#define XD_NONE	 0	// x11_display not set here
+#define XD_HERE	 1	// x11_display opened here
+#define XD_GUI	 2	// x11_display used from gui.dpy
+#define XD_XTERM 3	// x11_display used from xterm_dpy
     static int	    x11_display_from = XD_NONE;
     static int	    did_set_error_handler = FALSE;
 
     if (!did_set_error_handler)
     {
-	/* X just exits if it finds an error otherwise! */
+	// X just exits if it finds an error otherwise!
 	(void)XSetErrorHandler(x_error_handler);
 	did_set_error_handler = TRUE;
     }
@@ -1759,14 +1758,14 @@
     }
     else if (x11_display_from == XD_GUI)
     {
-	/* GUI must have stopped somehow, clear x11_display */
+	// GUI must have stopped somehow, clear x11_display
 	x11_window = 0;
 	x11_display = NULL;
 	x11_display_from = XD_NONE;
     }
 #endif
 
-    /* When started with the "-X" argument, don't try connecting. */
+    // When started with the "-X" argument, don't try connecting.
     if (!x_connect_to_server())
 	return FAIL;
 
@@ -1786,8 +1785,8 @@
 
     if (xterm_dpy != NULL && x11_window != 0)
     {
-	/* We may have checked it already, but Gnome terminal can move us to
-	 * another window, so we need to check every time. */
+	// We may have checked it already, but Gnome terminal can move us to
+	// another window, so we need to check every time.
 	if (x11_display_from != XD_XTERM)
 	{
 	    /*
@@ -1801,7 +1800,7 @@
 	}
 	if (test_x11_window(x11_display) == FAIL)
 	{
-	    /* probably bad $WINDOWID */
+	    // probably bad $WINDOWID
 	    x11_window = 0;
 	    x11_display = NULL;
 	    x11_display_from = XD_NONE;
@@ -1814,8 +1813,8 @@
     if (x11_window == 0 || x11_display == NULL)
 	result = -1;
 
-    if (result != -1)	    /* Have already been here and set this */
-	return result;	    /* Don't do all these X calls again */
+    if (result != -1)	    // Have already been here and set this
+	return result;	    // Don't do all these X calls again
 
     if (x11_window != 0 && x11_display == NULL)
     {
@@ -1859,7 +1858,7 @@
 # endif
 	    if (test_x11_window(x11_display) == FAIL)
 	    {
-		/* Maybe window id is bad */
+		// Maybe window id is bad
 		x11_window = 0;
 		XCloseDisplay(x11_display);
 		x11_display = NULL;
@@ -1897,7 +1896,7 @@
 
     retval = get_x11_thing(FALSE, test_only);
 
-    /* could not get old icon, use terminal name */
+    // could not get old icon, use terminal name
     if (oldicon == NULL && !test_only)
     {
 	if (STRNCMP(T_NAME, "builtin_", 8) == 0)
@@ -1911,7 +1910,7 @@
 
     static int
 get_x11_thing(
-    int		get_title,	/* get title string */
+    int		get_title,	// get title string
     int		test_only)
 {
     XTextProperty	text_prop;
@@ -1920,7 +1919,7 @@
 
     if (get_x11_windis() == OK)
     {
-	/* Get window/icon name if any */
+	// Get window/icon name if any
 	if (get_title)
 	    status = XGetWMName(x11_display, x11_window, &text_prop);
 	else
@@ -1932,9 +1931,9 @@
 	 * keep traversing up the tree until a window with a title/icon is
 	 * found.
 	 */
-	/* Previously this was only done for xterm and alikes.  I don't see a
-	 * reason why it would fail for other terminal emulators.
-	 * if (term_is_xterm) */
+	// Previously this was only done for xterm and alikes.  I don't see a
+	// reason why it would fail for other terminal emulators.
+	// if (term_is_xterm)
 	{
 	    Window	    root;
 	    Window	    parent;
@@ -2003,10 +2002,10 @@
     return retval;
 }
 
-/* Xutf8 functions are not available on older systems. Note that on some
- * systems X_HAVE_UTF8_STRING may be defined in a header file but
- * Xutf8SetWMProperties() is not in the X11 library.  Configure checks for
- * that and defines HAVE_XUTF8SETWMPROPERTIES. */
+// Xutf8 functions are not available on older systems. Note that on some
+// systems X_HAVE_UTF8_STRING may be defined in a header file but
+// Xutf8SetWMProperties() is not in the X11 library.  Configure checks for
+// that and defines HAVE_XUTF8SETWMPROPERTIES.
 #if defined(X_HAVE_UTF8_STRING)
 # if X_HAVE_UTF8_STRING && HAVE_XUTF8SETWMPROPERTIES
 #  define USE_UTF8_STRING
@@ -2021,10 +2020,9 @@
     static void
 set_x11_title(char_u *title)
 {
-	/* XmbSetWMProperties() and Xutf8SetWMProperties() should use a STRING
-	 * when possible, COMPOUND_TEXT otherwise.  COMPOUND_TEXT isn't
-	 * supported everywhere and STRING doesn't work for multi-byte titles.
-	 */
+	// XmbSetWMProperties() and Xutf8SetWMProperties() should use a STRING
+	// when possible, COMPOUND_TEXT otherwise.  COMPOUND_TEXT isn't
+	// supported everywhere and STRING doesn't work for multi-byte titles.
 #ifdef USE_UTF8_STRING
     if (enc_utf8)
 	Xutf8SetWMProperties(x11_display, x11_window, (const char *)title,
@@ -2040,7 +2038,7 @@
 	XTextProperty	text_prop;
 	char		*c_title = (char *)title;
 
-	/* directly from example 3-18 "basicwin" of Xlib Programming Manual */
+	// directly from example 3-18 "basicwin" of Xlib Programming Manual
 	(void)XStringListToTextProperty(&c_title, 1, &text_prop);
 	XSetWMProperties(x11_display, x11_window, &text_prop,
 					     NULL, NULL, 0, NULL, NULL, NULL);
@@ -2060,7 +2058,7 @@
     static void
 set_x11_icon(char_u *icon)
 {
-    /* See above for comments about using X*SetWMProperties(). */
+    // See above for comments about using X*SetWMProperties().
 #ifdef USE_UTF8_STRING
     if (enc_utf8)
 	Xutf8SetWMProperties(x11_display, x11_window, NULL, (const char *)icon,
@@ -2087,7 +2085,7 @@
     XFlush(x11_display);
 }
 
-#else  /* FEAT_X11 */
+#else  // FEAT_X11
 
     static int
 get_x11_title(int test_only UNUSED)
@@ -2108,7 +2106,7 @@
     return FALSE;
 }
 
-#endif /* FEAT_X11 */
+#endif // FEAT_X11
 
     int
 mch_can_restore_title(void)
@@ -2131,13 +2129,13 @@
     int		type = 0;
     static int	recursive = 0;
 
-    if (T_NAME == NULL)	    /* no terminal name (yet) */
+    if (T_NAME == NULL)	    // no terminal name (yet)
 	return;
-    if (title == NULL && icon == NULL)	    /* nothing to do */
+    if (title == NULL && icon == NULL)	    // nothing to do
 	return;
 
-    /* When one of the X11 functions causes a deadly signal, we get here again
-     * recursively.  Avoid hanging then (something is probably locked). */
+    // When one of the X11 functions causes a deadly signal, we get here again
+    // recursively.  Avoid hanging then (something is probably locked).
     if (recursive)
 	return;
     ++recursive;
@@ -2170,17 +2168,17 @@
 #ifdef FEAT_GUI
 		&& !gui.in_use
 #endif
-		)		/* first call but not in GUI, save title */
+		)		// first call but not in GUI, save title
 	    (void)get_x11_title(FALSE);
 
-	if (*T_TS != NUL)		/* it's OK if t_fs is empty */
+	if (*T_TS != NUL)		// it's OK if t_fs is empty
 	    term_settitle(title);
 #ifdef FEAT_X11
 	else
 # ifdef FEAT_GUI_GTK
-	if (!gui.in_use)		/* don't do this if GTK+ is running */
+	if (!gui.in_use)		// don't do this if GTK+ is running
 # endif
-	    set_x11_title(title);		/* x11 */
+	    set_x11_title(title);		// x11
 #endif
 #if defined(FEAT_GUI_GTK) \
 	|| defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
@@ -2196,7 +2194,7 @@
 #ifdef FEAT_GUI
 		&& !gui.in_use
 #endif
-		)		/* first call, save icon */
+		)		// first call, save icon
 	    get_x11_icon(FALSE);
 
 	if (*T_CIS != NUL)
@@ -2209,9 +2207,9 @@
 #ifdef FEAT_X11
 	else
 # ifdef FEAT_GUI_GTK
-	if (!gui.in_use)		/* don't do this if GTK+ is running */
+	if (!gui.in_use)		// don't do this if GTK+ is running
 # endif
-	    set_x11_icon(icon);			/* x11 */
+	    set_x11_icon(icon);			// x11
 #endif
 	did_set_icon = TRUE;
     }
@@ -2230,7 +2228,7 @@
 {
     int	do_push_pop = unix_did_set_title || did_set_icon;
 
-    /* only restore the title or icon when it has been set */
+    // only restore the title or icon when it has been set
     mch_settitle(((which & SAVE_RESTORE_TITLE) && unix_did_set_title) ?
 			(oldtitle ? oldtitle : p_titleold) : NULL,
 	       ((which & SAVE_RESTORE_ICON) && did_set_icon) ? oldicon : NULL);
@@ -2243,7 +2241,7 @@
     }
 }
 
-#endif /* FEAT_TITLE */
+#endif // FEAT_TITLE
 
 /*
  * Return TRUE if "name" looks like some xterm name.
@@ -2316,8 +2314,8 @@
 vim_is_vt300(char_u *name)
 {
     if (name == NULL)
-	return FALSE;	       /* actually all ANSI comp. terminals should be here  */
-    /* catch VT100 - VT5xx */
+	return FALSE;	       // actually all ANSI comp. terminals should be here
+    // catch VT100 - VT5xx
     return ((STRNICMP(name, "vt", 2) == 0
 		&& vim_strchr((char_u *)"12345", name[2]) != NULL)
 	    || STRCMP(name, "builtin_vt320") == 0);
@@ -2373,8 +2371,8 @@
 	return OK;
     }
 #endif
-    sprintf((char *)s, "%d", (int)uid);	    /* assumes s is long enough */
-    return FAIL;			    /* a number is not a name */
+    sprintf((char *)s, "%d", (int)uid);	    // assumes s is long enough
+    return FAIL;			    // a number is not a name
 }
 
 /*
@@ -2392,7 +2390,7 @@
     else
 	vim_strncpy(s, (char_u *)vutsname.nodename, len - 1);
 }
-#else /* HAVE_SYS_UTSNAME_H */
+#else // HAVE_SYS_UTSNAME_H
 
 # ifdef HAVE_SYS_SYSTEMINFO_H
 #  define gethostname(nam, len) sysinfo(SI_HOSTNAME, nam, len)
@@ -2406,9 +2404,9 @@
 # else
     gethostname((char *)s, len);
 # endif
-    s[len - 1] = NUL;	/* make sure it's terminated */
+    s[len - 1] = NUL;	// make sure it's terminated
 }
-#endif /* HAVE_SYS_UTSNAME_H */
+#endif // HAVE_SYS_UTSNAME_H
 
 /*
  * return process ID
@@ -2474,19 +2472,19 @@
     char_u	*fname,
     char_u	*buf,
     int		len,
-    int		force)		/* also expand when already absolute path */
+    int		force)		// also expand when already absolute path
 {
     int		l;
 #ifdef HAVE_FCHDIR
     int		fd = -1;
-    static int	dont_fchdir = FALSE;	/* TRUE when fchdir() doesn't work */
+    static int	dont_fchdir = FALSE;	// TRUE when fchdir() doesn't work
 #endif
     char_u	olddir[MAXPATHL];
     char_u	*p;
     int		retval = OK;
 #ifdef __CYGWIN__
-    char_u	posix_fname[MAXPATHL];	/* Cygwin docs mention MAX_PATH, but
-					   it's not always defined */
+    char_u	posix_fname[MAXPATHL];	// Cygwin docs mention MAX_PATH, but
+					// it's not always defined
 #endif
 
 #ifdef VMS
@@ -2498,8 +2496,8 @@
      * This helps for when "/etc/hosts" is a symlink to "c:/something/hosts".
      */
 # if CYGWIN_VERSION_DLL_MAJOR >= 1007
-    /* Use CCP_RELATIVE to avoid that it sometimes returns a path that ends in
-     * a forward slash. */
+    // Use CCP_RELATIVE to avoid that it sometimes returns a path that ends in
+    // a forward slash.
     cygwin_conv_path(CCP_WIN_A_TO_POSIX | CCP_RELATIVE,
 		     fname, posix_fname, MAXPATHL);
 # else
@@ -2508,8 +2506,8 @@
     fname = posix_fname;
 #endif
 
-    /* Expand it if forced or not an absolute path.
-     * Do not do it for "/file", the result is always "/". */
+    // Expand it if forced or not an absolute path.
+    // Do not do it for "/file", the result is always "/".
     if ((force || !mch_isFullName(fname))
 	    && ((p = vim_strrchr(fname, '/')) == NULL || p != fname))
     {
@@ -2533,13 +2531,13 @@
 		{
 		    close(fd);
 		    fd = -1;
-		    dont_fchdir = TRUE;	    /* don't try again */
+		    dont_fchdir = TRUE;	    // don't try again
 		}
 	    }
 #endif
 
-	    /* Only change directory when we are sure we can return to where
-	     * we are now.  After doing "su" chdir(".") might not work. */
+	    // Only change directory when we are sure we can return to where
+	    // we are now.  After doing "su" chdir(".") might not work.
 	    if (
 #ifdef HAVE_FCHDIR
 		fd < 0 &&
@@ -2547,14 +2545,14 @@
 			(mch_dirname(olddir, MAXPATHL) == FAIL
 					   || mch_chdir((char *)olddir) != 0))
 	    {
-		p = NULL;	/* can't get current dir: don't chdir */
+		p = NULL;	// can't get current dir: don't chdir
 		retval = FAIL;
 	    }
 	    else
 	    {
-		/* The directory is copied into buf[], to be able to remove
-		 * the file name without changing it (could be a string in
-		 * read-only memory) */
+		// The directory is copied into buf[], to be able to remove
+		// the file name without changing it (could be a string in
+		// read-only memory)
 		if (p - fname >= len)
 		    retval = FAIL;
 		else
@@ -2596,7 +2594,7 @@
 
 	l = STRLEN(buf);
 	if (l >= len - 1)
-	    retval = FAIL; /* no space for trailing "/" */
+	    retval = FAIL; // no space for trailing "/"
 #ifndef VMS
 	else if (l > 0 && buf[l - 1] != '/' && *fname != NUL
 						   && STRCMP(fname, ".") != 0)
@@ -2604,11 +2602,11 @@
 #endif
     }
 
-    /* Catch file names which are too long. */
+    // Catch file names which are too long.
     if (retval == FAIL || (int)(STRLEN(buf) + STRLEN(fname)) >= len)
 	return FAIL;
 
-    /* Do not append ".", "/dir/." is equal to "/dir". */
+    // Do not append ".", "/dir/." is equal to "/dir".
     if (STRCMP(fname, ".") != 0)
 	STRCAT(buf, fname);
 
@@ -2640,7 +2638,7 @@
     void
 fname_case(
     char_u	*name,
-    int		len UNUSED)  /* buffer size, only used when name gets longer */
+    int		len UNUSED)  // buffer size, only used when name gets longer
 {
     struct stat st;
     char_u	*slash, *tail;
@@ -2649,7 +2647,7 @@
 
     if (mch_lstat((char *)name, &st) >= 0)
     {
-	/* Open the directory where the file is located. */
+	// Open the directory where the file is located.
 	slash = vim_strrchr(name, '/');
 	if (slash == NULL)
 	{
@@ -2668,15 +2666,15 @@
 	{
 	    while ((dp = readdir(dirp)) != NULL)
 	    {
-		/* Only accept names that differ in case and are the same byte
-		 * length. TODO: accept different length name. */
+		// Only accept names that differ in case and are the same byte
+		// length. TODO: accept different length name.
 		if (STRICMP(tail, dp->d_name) == 0
 			&& STRLEN(tail) == STRLEN(dp->d_name))
 		{
 		    char_u	newname[MAXPATHL + 1];
 		    struct stat st2;
 
-		    /* Verify the inode is equal. */
+		    // Verify the inode is equal.
 		    vim_strncpy(newname, name, MAXPATHL);
 		    vim_strncpy(newname + (tail - name), (char_u *)dp->d_name,
 						    MAXPATHL - (tail - name));
@@ -2705,7 +2703,7 @@
 {
     struct stat statb;
 
-    /* Keep the #ifdef outside of stat(), it may be a macro. */
+    // Keep the #ifdef outside of stat(), it may be a macro.
 #ifdef VMS
     if (stat((char *)vms_fixfilename(name), &statb))
 #else
@@ -2713,8 +2711,8 @@
 #endif
 	return -1;
 #ifdef __INTERIX
-    /* The top bit makes the value negative, which means the file doesn't
-     * exist.  Remove the bit, we don't use it. */
+    // The top bit makes the value negative, which means the file doesn't
+    // exist.  Remove the bit, we don't use it.
     return statb.st_mode & ~S_ADDACE;
 #else
     return statb.st_mode;
@@ -2784,9 +2782,9 @@
 
 	if (getfilecon((char *)from_file, &from_context) < 0)
 	{
-	    /* If the filesystem doesn't support extended attributes,
-	       the original had no special security context and the
-	       target cannot have one either.  */
+	    // If the filesystem doesn't support extended attributes,
+	    // the original had no special security context and the
+	    // target cannot have one either.
 	    if (errno == EOPNOTSUPP)
 		return;
 
@@ -2816,7 +2814,7 @@
 	freecon(from_context);
     }
 }
-#endif /* HAVE_SELINUX */
+#endif // HAVE_SELINUX
 
 #if defined(HAVE_SMACK) && !defined(PROTO)
 /*
@@ -2844,14 +2842,14 @@
     for (index = 0 ; index < (int)(sizeof(smack_copied_attributes)
 			      / sizeof(smack_copied_attributes)[0]) ; index++)
     {
-	/* get the name of the attribute to copy */
+	// get the name of the attribute to copy
 	name = smack_copied_attributes[index];
 
-	/* get the value of the attribute in buffer */
+	// get the value of the attribute in buffer
 	size = getxattr((char*)from_file, name, buffer, sizeof(buffer));
 	if (size >= 0)
 	{
-	    /* copy the attribute value of buffer */
+	    // copy the attribute value of buffer
 	    ret = setxattr((char*)to_file, name, buffer, (size_t)size, 0);
 	    if (ret < 0)
 	    {
@@ -2864,35 +2862,35 @@
 	}
 	else
 	{
-	    /* what reason of not having the attribute value? */
+	    // what reason of not having the attribute value?
 	    switch (errno)
 	    {
 		case ENOTSUP:
-		    /* extended attributes aren't supported or enabled */
-		    /* should a message be echoed? not sure... */
-		    return; /* leave because it isn't useful to continue */
+		    // extended attributes aren't supported or enabled
+		    // should a message be echoed? not sure...
+		    return; // leave because it isn't useful to continue
 
 		case ERANGE:
 		default:
-		    /* no enough size OR unexpected error */
+		    // no enough size OR unexpected error
 		     vim_snprintf((char *)IObuff, IOSIZE,
 			    _("Could not get security context %s for %s. Removing it!"),
 			    name, from_file);
 		    msg_puts((char *)IObuff);
 		    msg_putchar('\n');
-		    /* FALLTHROUGH to remove the attribute */
+		    // FALLTHROUGH to remove the attribute
 
 		case ENODATA:
-		    /* no attribute of this name */
+		    // no attribute of this name
 		    ret = removexattr((char*)to_file, name);
-		    /* Silently ignore errors, apparently this happens when
-		     * smack is not actually being used. */
+		    // Silently ignore errors, apparently this happens when
+		    // smack is not actually being used.
 		    break;
 	    }
 	}
     }
 }
-#endif /* HAVE_SMACK */
+#endif // HAVE_SMACK
 
 /*
  * Return a pointer to the ACL of file "fname" in allocated memory.
@@ -2955,10 +2953,10 @@
 	}
     }
     ret = (vim_acl_T)aclent;
-#endif /* HAVE_AIX_ACL */
-#endif /* HAVE_SOLARIS_ACL */
-#endif /* HAVE_SOLARIS_ZFS_ACL */
-#endif /* HAVE_POSIX_ACL */
+#endif // HAVE_AIX_ACL
+#endif // HAVE_SOLARIS_ACL
+#endif // HAVE_SOLARIS_ZFS_ACL
+#endif // HAVE_POSIX_ACL
     return ret;
 }
 
@@ -2982,10 +2980,10 @@
 #else
 #ifdef HAVE_AIX_ACL
     chacl((char *)fname, aclent, ((struct acl *)aclent)->acl_len);
-#endif /* HAVE_AIX_ACL */
-#endif /* HAVE_SOLARIS_ACL */
-#endif /* HAVE_SOLARIS_ZFS_ACL */
-#endif /* HAVE_POSIX_ACL */
+#endif // HAVE_AIX_ACL
+#endif // HAVE_SOLARIS_ACL
+#endif // HAVE_SOLARIS_ZFS_ACL
+#endif // HAVE_POSIX_ACL
 }
 
     void
@@ -3005,10 +3003,10 @@
 #else
 #ifdef HAVE_AIX_ACL
     free(aclent);
-#endif /* HAVE_AIX_ACL */
-#endif /* HAVE_SOLARIS_ACL */
-#endif /* HAVE_SOLARIS_ZFS_ACL */
-#endif /* HAVE_POSIX_ACL */
+#endif // HAVE_AIX_ACL
+#endif // HAVE_SOLARIS_ACL
+#endif // HAVE_SOLARIS_ZFS_ACL
+#endif // HAVE_POSIX_ACL
 }
 #endif
 
@@ -3018,7 +3016,7 @@
     void
 mch_hide(char_u *name UNUSED)
 {
-    /* can't hide a file */
+    // can't hide a file
 }
 
 /*
@@ -3031,7 +3029,7 @@
 {
     struct stat statb;
 
-    if (*name == NUL)	    /* Some stat()s don't flag "" as an error. */
+    if (*name == NUL)	    // Some stat()s don't flag "" as an error.
 	return FALSE;
     if (stat((char *)name, &statb))
 	return FALSE;
@@ -3048,7 +3046,7 @@
 {
     struct stat statb;
 
-    if (*name == NUL)	    /* Some stat()s don't flag "" as an error. */
+    if (*name == NUL)	    // Some stat()s don't flag "" as an error.
 	return FALSE;
     if (mch_lstat((char *)name, &statb))
 	return FALSE;
@@ -3066,14 +3064,13 @@
     if (stat((char *)name, &st))
 	return 0;
 #ifdef VMS
-    /* Like on Unix system file can have executable rights but not necessarily
-     * be an executable, but on Unix is not a default for an ordinary file to
-     * have an executable flag - on VMS it is in most cases.
-     * Therefore, this check does not have any sense - let keep us to the
-     * conventions instead:
-     * *.COM and *.EXE files are the executables - the rest are not. This is
-     * not ideal but better then it was.
-     */
+    // Like on Unix system file can have executable rights but not necessarily
+    // be an executable, but on Unix is not a default for an ordinary file to
+    // have an executable flag - on VMS it is in most cases.
+    // Therefore, this check does not have any sense - let keep us to the
+    // conventions instead:
+    // *.COM and *.EXE files are the executables - the rest are not. This is
+    // not ideal but better then it was.
     int vms_executable = 0;
     if (S_ISREG(st.st_mode) && mch_access((char *)name, X_OK) == 0)
     {
@@ -3099,12 +3096,12 @@
     char_u	*p, *e;
     int		retval;
 
-    /* When "use_path" is false and if it's an absolute or relative path don't
-     * need to use $PATH. */
+    // When "use_path" is false and if it's an absolute or relative path don't
+    // need to use $PATH.
     if (!use_path || gettail(name) != name)
     {
-	/* There must be a path separator, files in the current directory
-	 * can't be executed. */
+	// There must be a path separator, files in the current directory
+	// can't be executed.
 	if ((use_path || gettail(name) != name) && executable_file(name))
 	{
 	    if (path != NULL)
@@ -3135,7 +3132,7 @@
 	e = (char_u *)strchr((char *)p, ':');
 	if (e == NULL)
 	    e = p + STRLEN(p);
-	if (e - p <= 1)		/* empty entry means current dir */
+	if (e - p <= 1)		// empty entry means current dir
 	    STRCPY(buf, "./");
 	else
 	{
@@ -3180,9 +3177,9 @@
 	return NODE_NORMAL;
     if (S_ISREG(st.st_mode) || S_ISDIR(st.st_mode))
 	return NODE_NORMAL;
-    if (S_ISBLK(st.st_mode))	/* block device isn't writable */
+    if (S_ISBLK(st.st_mode))	// block device isn't writable
 	return NODE_OTHER;
-    /* Everything else is writable? */
+    // Everything else is writable?
     return NODE_WRITABLE;
 }
 
@@ -3226,14 +3223,14 @@
     if (xterm_Shell != (Widget)0)
 	XtDestroyWidget(xterm_Shell);
 #  ifndef LESSTIF_VERSION
-    /* Lesstif crashes here, lose some memory */
+    // Lesstif crashes here, lose some memory
     if (xterm_dpy != NULL)
 	XtCloseDisplay(xterm_dpy);
     if (app_context != (XtAppContext)NULL)
     {
 	XtDestroyApplicationContext(app_context);
 #   ifdef FEAT_X11
-	x11_display = NULL; /* freed by XtDestroyApplicationContext() */
+	x11_display = NULL; // freed by XtDestroyApplicationContext()
 #   endif
     }
 #  endif
@@ -3279,9 +3276,9 @@
     }
     else
     {
-	restore_cterm_colors();		/* get original colors back */
-	msg_clr_eos_force();		/* clear the rest of the display */
-	windgoto((int)Rows - 1, 0);	/* may have moved the cursor */
+	restore_cterm_colors();		// get original colors back
+	msg_clr_eos_force();		// clear the rest of the display
+	windgoto((int)Rows - 1, 0);	// may have moved the cursor
     }
 }
 
@@ -3313,8 +3310,8 @@
 	if (swapping_screen() && !newline_on_exit)
 	    exit_scroll();
 
-	/* Stop termcap: May need to check for T_CRV response, which
-	 * requires RAW mode. */
+	// Stop termcap: May need to check for T_CRV response, which
+	// requires RAW mode.
 	stoptermcap();
 
 	/*
@@ -3324,13 +3321,13 @@
 	if (!swapping_screen() || newline_on_exit)
 	    exit_scroll();
 
-	/* Cursor may have been switched off without calling starttermcap()
-	 * when doing "vim -u vimrc" and vimrc contains ":q". */
+	// Cursor may have been switched off without calling starttermcap()
+	// when doing "vim -u vimrc" and vimrc contains ":q".
 	if (full_screen)
 	    cursor_on();
     }
     out_flush();
-    ml_close_all(TRUE);		/* remove all memfiles */
+    ml_close_all(TRUE);		// remove all memfiles
     may_core_dump();
 #ifdef FEAT_GUI
     if (gui.in_use)
@@ -3342,8 +3339,8 @@
 #endif
 
 #ifdef __QNX__
-    /* A core dump won't be created if the signal handler
-     * doesn't return, so we can't call exit() */
+    // A core dump won't be created if the signal handler
+    // doesn't return, so we can't call exit()
     if (deadly_signal != 0)
 	return;
 #endif
@@ -3365,7 +3362,7 @@
     if (deadly_signal != 0)
     {
 	signal(deadly_signal, SIG_DFL);
-	kill(getpid(), deadly_signal);	/* Die using the signal we caught */
+	kill(getpid(), deadly_signal);	// Die using the signal we caught
     }
 }
 
@@ -3452,8 +3449,8 @@
 	tnew.c_iflag &= ~ICRNL;
 	tnew.c_lflag &= ~(ICANON | ECHO | ISIG | ECHOE
 # if defined(IEXTEN) && !defined(__MINT__)
-		    | IEXTEN	    /* IEXTEN enables typing ^V on SOLARIS */
-				    /* but it breaks function keys on MINT */
+		    | IEXTEN	    // IEXTEN enables typing ^V on SOLARIS
+				    // but it breaks function keys on MINT
 # endif
 				);
 # ifdef ONLCR
@@ -3474,19 +3471,19 @@
     }
     else if (tmode == TMODE_SLEEP)
     {
-	/* Also reset ICANON here, otherwise on Solaris select() won't see
-	 * typeahead characters. */
+	// Also reset ICANON here, otherwise on Solaris select() won't see
+	// typeahead characters.
 	tnew.c_lflag &= ~(ICANON | ECHO);
-	tnew.c_cc[VMIN] = 1;		/* return after 1 char */
-	tnew.c_cc[VTIME] = 0;		/* don't wait */
+	tnew.c_cc[VMIN] = 1;		// return after 1 char
+	tnew.c_cc[VTIME] = 0;		// don't wait
     }
 
 # if defined(HAVE_TERMIOS_H)
     {
 	int	n = 10;
 
-	/* A signal may cause tcsetattr() to fail (e.g., SIGCONT).  Retry a
-	 * few times. */
+	// A signal may cause tcsetattr() to fail (e.g., SIGCONT).  Retry a
+	// few times.
 	while (tcsetattr(read_cmd_fd, TCSANOW, &tnew) == -1
 						   && errno == EINTR && n > 0)
 	    --n;
@@ -3500,7 +3497,7 @@
      * for "old" tty systems
      */
 # ifndef TIOCSETN
-#  define TIOCSETN TIOCSETP	/* for hpux 9.0 */
+#  define TIOCSETN TIOCSETP	// for hpux 9.0
 # endif
     static struct sgttyb ttybold;
 	   struct sgttyb ttybnew;
@@ -3547,7 +3544,7 @@
 	buf[1] = NUL;
 	add_termcode((char_u *)"kb", buf, FALSE);
 
-	/* If <BS> and <DEL> are now the same, redefine <DEL>. */
+	// If <BS> and <DEL> are now the same, redefine <DEL>.
 	p = find_termcode((char_u *)"kD");
 	if (p != NULL && p[0] == buf[0] && p[1] == buf[1])
 	    do_fixdel(NULL);
@@ -3583,7 +3580,7 @@
 	return OK;
     }
 #else
-    /* for "old" tty systems */
+    // for "old" tty systems
     struct sgttyb keys;
 
     if (mch_tcgetattr(fd, &keys) != -1)
@@ -3598,7 +3595,7 @@
     return FAIL;
 }
 
-#endif /* VMS  */
+#endif // VMS
 
 static int	mouse_ison = FALSE;
 
@@ -3625,7 +3622,7 @@
 	    && p_bevalterm == bevalterm_ison
 #endif
 	    )
-	/* return quickly if nothing to do */
+	// return quickly if nothing to do
 	return;
 
     xterm_mouse_vers = use_xterm_mouse();
@@ -3643,7 +3640,7 @@
 
     if (ttym_flags == TTYM_SGR)
     {
-	/* SGR mode supports columns above 223 */
+	// SGR mode supports columns above 223
 	out_str_nf((char_u *)
 		   (on
 		   ? IF_EB("\033[?1006h", ESC_STR "[?1006h")
@@ -3656,7 +3653,7 @@
     {
 	bevalterm_ison = (p_bevalterm && on);
 	if (xterm_mouse_vers > 1 && !bevalterm_ison)
-	    /* disable mouse movement events, enabling is below */
+	    // disable mouse movement events, enabling is below
 	    out_str_nf((char_u *)
 			(IF_EB("\033[?1003l", ESC_STR "[?1003l")));
     }
@@ -3664,7 +3661,7 @@
 
     if (xterm_mouse_vers > 0)
     {
-	if (on)	/* enable mouse events, use mouse tracking if available */
+	if (on)	// enable mouse events, use mouse tracking if available
 	    out_str_nf((char_u *)
 		       (xterm_mouse_vers > 1
 			? (
@@ -3674,7 +3671,7 @@
 #endif
 			      IF_EB("\033[?1002h", ESC_STR "[?1002h"))
 			: IF_EB("\033[?1000h", ESC_STR "[?1000h")));
-	else	/* disable mouse events, could probably always send the same */
+	else	// disable mouse events, could probably always send the same
 	    out_str_nf((char_u *)
 		       (xterm_mouse_vers > 1
 			? IF_EB("\033[?1002l", ESC_STR "[?1002l")
@@ -3685,9 +3682,9 @@
 #ifdef FEAT_MOUSE_DEC
     else if (ttym_flags == TTYM_DEC)
     {
-	if (on)	/* enable mouse events */
+	if (on)	// enable mouse events
 	    out_str_nf((char_u *)"\033[1;2'z\033[1;3'{");
-	else	/* disable mouse events */
+	else	// disable mouse events
 	    out_str_nf((char_u *)"\033['z");
 	mouse_ison = on;
     }
@@ -3730,23 +3727,22 @@
     {
 	if (on)
 	{
-	    /* D - Enable Mouse up/down messages
-	     * L - Enable Left Button Reporting
-	     * M - Enable Middle Button Reporting
-	     * R - Enable Right Button Reporting
-	     * K - Enable SHIFT and CTRL key Reporting
-	     * + - Enable Advanced messaging of mouse moves and up/down messages
-	     * Q - Quiet No Ack
-	     * # - Numeric value of mouse pointer required
-	     *	  0 = Multiview 2000 cursor, used as standard
-	     *	  1 = Windows Arrow
-	     *	  2 = Windows I Beam
-	     *	  3 = Windows Hour Glass
-	     *	  4 = Windows Cross Hair
-	     *	  5 = Windows UP Arrow
-	     */
+	    // D - Enable Mouse up/down messages
+	    // L - Enable Left Button Reporting
+	    // M - Enable Middle Button Reporting
+	    // R - Enable Right Button Reporting
+	    // K - Enable SHIFT and CTRL key Reporting
+	    // + - Enable Advanced messaging of mouse moves and up/down messages
+	    // Q - Quiet No Ack
+	    // # - Numeric value of mouse pointer required
+	    //	  0 = Multiview 2000 cursor, used as standard
+	    //	  1 = Windows Arrow
+	    //	  2 = Windows I Beam
+	    //	  3 = Windows Hour Glass
+	    //	  4 = Windows Cross Hair
+	    //	  5 = Windows UP Arrow
 # ifdef JSBTERM_MOUSE_NONADVANCED
-	    /* Disables full feedback of pointer movements */
+	    // Disables full feedback of pointer movements
 	    out_str_nf((char_u *)IF_EB("\033[0~ZwLMRK1Q\033\\",
 					 ESC_STR "[0~ZwLMRK1Q" ESC_STR "\\"));
 # else
@@ -3766,7 +3762,7 @@
 #ifdef FEAT_MOUSE_PTERM
     else
     {
-	/* 1 = button press, 6 = release, 7 = drag, 1h...9l = right button */
+	// 1 = button press, 6 = release, 7 = drag, 1h...9l = right button
 	if (on)
 	    out_str_nf("\033[>1h\033[>6h\033[>7h\033[>1h\033[>9l");
 	else
@@ -3808,8 +3804,8 @@
 		    : IF_EB("\033[M", ESC_STR "[M")));
 	if (*p_mouse != NUL)
 	{
-	    /* force mouse off and maybe on to send possibly new mouse
-	     * activation sequence to the xterm, with(out) drag tracing. */
+	    // force mouse off and maybe on to send possibly new mouse
+	    // activation sequence to the xterm, with(out) drag tracing.
 	    mch_setmouse(FALSE);
 	    setmouse();
 	}
@@ -3840,7 +3836,7 @@
 # endif
 
 # ifdef FEAT_MOUSE_JSB
-    /* Conflicts with xterm mouse: "\033[" and "\033[M" ??? */
+    // Conflicts with xterm mouse: "\033[" and "\033[M" ???
     if (!use_xterm_mouse()
 #  ifdef FEAT_GUI
 	    && !gui.in_use
@@ -3853,8 +3849,8 @@
 # endif
 
 # ifdef FEAT_MOUSE_NET
-    /* There is no conflict, but one may type "ESC }" from Insert mode.  Don't
-     * define it in the GUI or when using an xterm. */
+    // There is no conflict, but one may type "ESC }" from Insert mode.  Don't
+    // define it in the GUI or when using an xterm.
     if (!use_xterm_mouse()
 #  ifdef FEAT_GUI
 	    && !gui.in_use
@@ -3867,7 +3863,7 @@
 # endif
 
 # ifdef FEAT_MOUSE_DEC
-    /* Conflicts with xterm mouse: "\033[" and "\033[M" */
+    // Conflicts with xterm mouse: "\033[" and "\033[M"
     if (!use_xterm_mouse()
 #  ifdef FEAT_GUI
 	    && !gui.in_use
@@ -3879,7 +3875,7 @@
 	del_mouse_termcode(KS_DEC_MOUSE);
 # endif
 # ifdef FEAT_MOUSE_PTERM
-    /* same conflict as the dec mouse */
+    // same conflict as the dec mouse
     if (!use_xterm_mouse()
 #  ifdef FEAT_GUI
 	    && !gui.in_use
@@ -3975,7 +3971,7 @@
 	struct winsize	ws;
 	int fd = 1;
 
-	/* When stdout is not a tty, use stdin for the ioctl(). */
+	// When stdout is not a tty, use stdin for the ioctl().
 	if (!isatty(fd) && isatty(read_cmd_fd))
 	    fd = read_cmd_fd;
 	if (ioctl(fd, TIOCGWINSZ, &ws) == 0)
@@ -3984,13 +3980,13 @@
 	    rows = ws.ws_row;
 	}
     }
-# else /* TIOCGWINSZ */
+# else // TIOCGWINSZ
 #  ifdef TIOCGSIZE
     {
 	struct ttysize	ts;
 	int fd = 1;
 
-	/* When stdout is not a tty, use stdin for the ioctl(). */
+	// When stdout is not a tty, use stdin for the ioctl().
 	if (!isatty(fd) && isatty(read_cmd_fd))
 	    fd = read_cmd_fd;
 	if (ioctl(fd, TIOCGSIZE, &ts) == 0)
@@ -3999,8 +3995,8 @@
 	    rows = ts.ts_lines;
 	}
     }
-#  endif /* TIOCGSIZE */
-# endif /* TIOCGWINSZ */
+#  endif // TIOCGSIZE
+# endif // TIOCGWINSZ
 
     /*
      * 2. get size from environment
@@ -4089,11 +4085,11 @@
 	 */
 	term_set_winsize((int)Rows, (int)Columns);
 	out_flush();
-	screen_start();			/* don't know where cursor is now */
+	screen_start();			// don't know where cursor is now
     }
 }
 
-#endif /* VMS */
+#endif // VMS
 
 /*
  * Rows and/or Columns has changed.
@@ -4101,7 +4097,7 @@
     void
 mch_new_shellsize(void)
 {
-    /* Nothing to do. */
+    // Nothing to do.
 }
 
 /*
@@ -4116,10 +4112,10 @@
 
     while (wait_pid != child)
     {
-	/* When compiled with Python threads are probably used, in which case
-	 * wait() sometimes hangs for no obvious reason.  Use waitpid()
-	 * instead and loop (like the GUI). Also needed for other interfaces,
-	 * they might call system(). */
+	// When compiled with Python threads are probably used, in which case
+	// wait() sometimes hangs for no obvious reason.  Use waitpid()
+	// instead and loop (like the GUI). Also needed for other interfaces,
+	// they might call system().
 # ifdef __NeXT__
 	wait_pid = wait4(child, status, WNOHANG, (struct rusage *)0);
 # else
@@ -4127,7 +4123,7 @@
 # endif
 	if (wait_pid == 0)
 	{
-	    /* Wait for 1 to 10 msec before trying again. */
+	    // Wait for 1 to 10 msec before trying again.
 	    mch_delay(delay_msec, TRUE);
 	    if (++delay_msec > 10)
 		delay_msec = 10;
@@ -4255,9 +4251,9 @@
     *pty_master_fd = mch_openpty(&tty_name);	    // open pty
     if (*pty_master_fd >= 0)
     {
-	/* Leaving out O_NOCTTY may lead to waitpid() always returning
-	 * 0 on Mac OS X 10.7 thereby causing freezes. Let's assume
-	 * adding O_NOCTTY always works when defined. */
+	// Leaving out O_NOCTTY may lead to waitpid() always returning
+	// 0 on Mac OS X 10.7 thereby causing freezes. Let's assume
+	// adding O_NOCTTY always works when defined.
 #ifdef O_NOCTTY
 	*pty_slave_fd = open(tty_name, O_RDWR | O_NOCTTY | O_EXTRA, 0);
 #else
@@ -4301,6 +4297,11 @@
 
 #if !defined(USE_SYSTEM) || defined(FEAT_TERMINAL) || defined(PROTO)
 
+/*
+ * Parse "cmd" and return the result in "argvp" which is an allocated array of
+ * pointers, the last one is NULL.
+ * The "sh_tofree" and "shcf_tofree" must be later freed by the caller.
+ */
     int
 unix_build_argv(
 	char_u *cmd,
@@ -4312,7 +4313,7 @@
     int		argc;
 
     *sh_tofree = vim_strsave(p_sh);
-    if (*sh_tofree == NULL)		/* out of memory */
+    if (*sh_tofree == NULL)		// out of memory
 	return FAIL;
 
     if (mch_parse_cmd(*sh_tofree, TRUE, &argv, &argc) == FAIL)
@@ -4327,10 +4328,10 @@
 	if (extra_shell_arg != NULL)
 	    argv[argc++] = (char *)extra_shell_arg;
 
-	/* Break 'shellcmdflag' into white separated parts.  This doesn't
-	 * handle quoted strings, they are very unlikely to appear. */
+	// Break 'shellcmdflag' into white separated parts.  This doesn't
+	// handle quoted strings, they are very unlikely to appear.
 	*shcf_tofree = alloc(STRLEN(p_shcf) + 1);
-	if (*shcf_tofree == NULL)    /* out of memory */
+	if (*shcf_tofree == NULL)    // out of memory
 	    return FAIL;
 	s = *shcf_tofree;
 	p = p_shcf;
@@ -4357,7 +4358,7 @@
     static int
 mch_call_shell_terminal(
     char_u	*cmd,
-    int		options UNUSED)	/* SHELL_*, see vim.h */
+    int		options UNUSED)	// SHELL_*, see vim.h
 {
     jobopt_T	opt;
     char	**argv = NULL;
@@ -4367,7 +4368,7 @@
     buf_T	*buf;
     job_T	*job;
     aco_save_T	aco;
-    oparg_T	oa;		/* operator arguments */
+    oparg_T	oa;		// operator arguments
 
     if (unix_build_argv(cmd, &argv, &tofree1, &tofree2) == FAIL)
 	goto theend;
@@ -4381,7 +4382,7 @@
     job = term_getjob(buf->b_term);
     ++job->jv_refcount;
 
-    /* Find a window to make "buf" curbuf. */
+    // Find a window to make "buf" curbuf.
     aucmd_prepbuf(&aco, buf);
 
     clear_oparg(&oa);
@@ -4389,8 +4390,8 @@
     {
 	if (oa.op_type == OP_NOP && oa.regname == NUL && !VIsual_active)
 	{
-	    /* If terminal_loop() returns OK we got a key that is handled
-	     * in Normal model. We don't do redrawing anyway. */
+	    // If terminal_loop() returns OK we got a key that is handled
+	    // in Normal model. We don't do redrawing anyway.
 	    if (terminal_loop(TRUE) == OK)
 		normal_cmd(&oa, TRUE);
 	}
@@ -4402,7 +4403,7 @@
 
     job_unref(job);
 
-    /* restore curwin/curbuf and a few other things */
+    // restore curwin/curbuf and a few other things
     aucmd_restbuf(&aco);
 
     wait_return(TRUE);
@@ -4423,20 +4424,20 @@
     static int
 mch_call_shell_system(
     char_u	*cmd,
-    int		options)	/* SHELL_*, see vim.h */
+    int		options)	// SHELL_*, see vim.h
 {
 #ifdef VMS
     char	*ifn = NULL;
     char	*ofn = NULL;
 #endif
     int		tmode = cur_tmode;
-    char_u	*newcmd;	/* only needed for unix */
+    char_u	*newcmd;	// only needed for unix
     int		x;
 
     out_flush();
 
     if (options & SHELL_COOKED)
-	settmode(TMODE_COOK);	    /* set to normal mode */
+	settmode(TMODE_COOK);	    // set to normal mode
 
 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
     save_clipboard();
@@ -4455,7 +4456,7 @@
 	    char *p;
 
 	    *ifn++ = '\0';
-	    p = strchr(ifn,' '); /* chop off any trailing spaces */
+	    p = strchr(ifn,' '); // chop off any trailing spaces
 	    if (p)
 		*p = '\0';
 	}
@@ -4495,7 +4496,7 @@
     }
 
     if (tmode == TMODE_RAW)
-	settmode(TMODE_RAW);	/* set to raw mode */
+	settmode(TMODE_RAW);	// set to raw mode
 # ifdef FEAT_TITLE
     resettitle();
 # endif
@@ -4505,11 +4506,11 @@
     return x;
 }
 
-#else /* USE_SYSTEM */
+#else // USE_SYSTEM
 
-# define EXEC_FAILED 122    /* Exit code when shell didn't execute.  Don't use
-			       127, some shells use that already */
-# define OPEN_NULL_FAILED 123 /* Exit code if /dev/null can't be opened */
+# define EXEC_FAILED 122    // Exit code when shell didn't execute.  Don't use
+			    // 127, some shells use that already
+# define OPEN_NULL_FAILED 123 // Exit code if /dev/null can't be opened
 
 /*
  * Don't use system(), use fork()/exec().
@@ -4517,7 +4518,7 @@
     static int
 mch_call_shell_fork(
     char_u	*cmd,
-    int		options)	/* SHELL_*, see vim.h */
+    int		options)	// SHELL_*, see vim.h
 {
     int		tmode = cur_tmode;
     pid_t	pid;
@@ -4533,18 +4534,18 @@
     char_u	*tofree1 = NULL;
     char_u	*tofree2 = NULL;
     int		i;
-    int		pty_master_fd = -1;	    /* for pty's */
+    int		pty_master_fd = -1;	    // for pty's
 # ifdef FEAT_GUI
     int		pty_slave_fd = -1;
 # endif
-    int		fd_toshell[2];		/* for pipes */
+    int		fd_toshell[2];		// for pipes
     int		fd_fromshell[2];
     int		pipe_error = FALSE;
-    int		did_settmode = FALSE;	/* settmode(TMODE_RAW) called */
+    int		did_settmode = FALSE;	// settmode(TMODE_RAW) called
 
     out_flush();
     if (options & SHELL_COOKED)
-	settmode(TMODE_COOK);		/* set to normal mode */
+	settmode(TMODE_COOK);		// set to normal mode
 
     if (unix_build_argv(cmd, &argv, &tofree1, &tofree2) == FAIL)
 	goto error;
@@ -4575,10 +4576,10 @@
 # endif
 	{
 	    pipe_error = (pipe(fd_toshell) < 0);
-	    if (!pipe_error)			    /* pipe create OK */
+	    if (!pipe_error)			    // pipe create OK
 	    {
 		pipe_error = (pipe(fd_fromshell) < 0);
-		if (pipe_error)			    /* pipe create failed */
+		if (pipe_error)			    // pipe create failed
 		{
 		    close(fd_toshell[0]);
 		    close(fd_toshell[1]);
@@ -4592,7 +4593,7 @@
 	}
     }
 
-    if (!pipe_error)			/* pty or pipe opened or not used */
+    if (!pipe_error)			// pty or pipe opened or not used
     {
 	SIGSET_DECL(curset)
 
@@ -4601,7 +4602,7 @@
 # endif
 
 	BLOCK_SIGNALS(&curset);
-	pid = fork();	/* maybe we should use vfork() */
+	pid = fork();	// maybe we should use vfork()
 	if (pid == -1)
 	{
 	    UNBLOCK_SIGNALS(&curset);
@@ -4614,12 +4615,12 @@
 		    )
 	    {
 # ifdef FEAT_GUI
-		if (pty_master_fd >= 0)		/* close the pseudo tty */
+		if (pty_master_fd >= 0)		// close the pseudo tty
 		{
 		    close(pty_master_fd);
 		    close(pty_slave_fd);
 		}
-		else				/* close the pipes */
+		else				// close the pipes
 # endif
 		{
 		    close(fd_toshell[0]);
@@ -4629,14 +4630,14 @@
 		}
 	    }
 	}
-	else if (pid == 0)	/* child */
+	else if (pid == 0)	// child
 	{
-	    reset_signals();		/* handle signals normally */
+	    reset_signals();		// handle signals normally
 	    UNBLOCK_SIGNALS(&curset);
 
 # ifdef FEAT_JOB_CHANNEL
 	    if (ch_log_active())
-		/* close the log file in the child */
+		// close the log file in the child
 		ch_logfile((char_u *)"", (char_u *)"");
 # endif
 
@@ -4668,11 +4669,11 @@
 		 */
 		if (fd >= 0)
 		{
-		    vim_ignored = dup(fd); /* To replace stdin  (fd 0) */
-		    vim_ignored = dup(fd); /* To replace stdout (fd 1) */
-		    vim_ignored = dup(fd); /* To replace stderr (fd 2) */
+		    vim_ignored = dup(fd); // To replace stdin  (fd 0)
+		    vim_ignored = dup(fd); // To replace stdout (fd 1)
+		    vim_ignored = dup(fd); // To replace stderr (fd 2)
 
-		    /* Don't need this now that we've duplicated it */
+		    // Don't need this now that we've duplicated it
 		    close(fd);
 		}
 	    }
@@ -4684,18 +4685,17 @@
 	    {
 
 # ifdef HAVE_SETSID
-		/* Create our own process group, so that the child and all its
-		 * children can be kill()ed.  Don't do this when using pipes,
-		 * because stdin is not a tty, we would lose /dev/tty. */
+		// Create our own process group, so that the child and all its
+		// children can be kill()ed.  Don't do this when using pipes,
+		// because stdin is not a tty, we would lose /dev/tty.
 		if (p_stmp)
 		{
 		    (void)setsid();
 #  if defined(SIGHUP)
-		    /* When doing "!xterm&" and 'shell' is bash: the shell
-		     * will exit and send SIGHUP to all processes in its
-		     * group, killing the just started process.  Ignore SIGHUP
-		     * to avoid that. (suggested by Simon Schubert)
-		     */
+		    // When doing "!xterm&" and 'shell' is bash: the shell
+		    // will exit and send SIGHUP to all processes in its
+		    // group, killing the just started process.  Ignore SIGHUP
+		    // to avoid that. (suggested by Simon Schubert)
 		    signal(SIGHUP, SIG_IGN);
 #  endif
 		}
@@ -4703,12 +4703,12 @@
 # ifdef FEAT_GUI
 		if (pty_slave_fd >= 0)
 		{
-		    /* push stream discipline modules */
+		    // push stream discipline modules
 		    if (options & SHELL_COOKED)
 			setup_slavepty(pty_slave_fd);
 #  ifdef TIOCSCTTY
-		    /* Try to become controlling tty (probably doesn't work,
-		     * unless run by root) */
+		    // Try to become controlling tty (probably doesn't work,
+		    // unless run by root)
 		    ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL);
 #  endif
 		}
@@ -4723,9 +4723,9 @@
 # ifdef FEAT_GUI
 		if (pty_master_fd >= 0)
 		{
-		    close(pty_master_fd);   /* close master side of pty */
+		    close(pty_master_fd);   // close master side of pty
 
-		    /* set up stdin/stdout/stderr for the child */
+		    // set up stdin/stdout/stderr for the child
 		    close(0);
 		    vim_ignored = dup(pty_slave_fd);
 		    close(1);
@@ -4736,18 +4736,18 @@
 			vim_ignored = dup(pty_slave_fd);
 		    }
 
-		    close(pty_slave_fd);    /* has been dupped, close it now */
+		    close(pty_slave_fd);    // has been dupped, close it now
 		}
 		else
 # endif
 		{
-		    /* set up stdin for the child */
+		    // set up stdin for the child
 		    close(fd_toshell[1]);
 		    close(0);
 		    vim_ignored = dup(fd_toshell[0]);
 		    close(fd_toshell[0]);
 
-		    /* set up stdout for the child */
+		    // set up stdout for the child
 		    close(fd_fromshell[0]);
 		    close(1);
 		    vim_ignored = dup(fd_fromshell[1]);
@@ -4756,7 +4756,7 @@
 # ifdef FEAT_GUI
 		    if (gui.in_use)
 		    {
-			/* set up stderr for the child */
+			// set up stderr for the child
 			close(2);
 			vim_ignored = dup(1);
 		    }
@@ -4772,9 +4772,9 @@
 	     * to the X server (esp. with GTK, which uses atexit()).
 	     */
 	    execvp(argv[0], argv);
-	    _exit(EXEC_FAILED);	    /* exec failed, return failure code */
+	    _exit(EXEC_FAILED);	    // exec failed, return failure code
 	}
-	else			/* parent */
+	else			// parent
 	{
 	    /*
 	     * While child is running, ignore terminating signals.
@@ -4797,11 +4797,11 @@
 # endif
 	       )
 	    {
-# define BUFLEN 100		/* length for buffer, pseudo tty limit is 128 */
+# define BUFLEN 100		// length for buffer, pseudo tty limit is 128
 		char_u	    buffer[BUFLEN + 1];
-		int	    buffer_off = 0;	/* valid bytes in buffer[] */
-		char_u	    ta_buf[BUFLEN + 1];	/* TypeAHead */
-		int	    ta_len = 0;		/* valid bytes in ta_buf[] */
+		int	    buffer_off = 0;	// valid bytes in buffer[]
+		char_u	    ta_buf[BUFLEN + 1];	// TypeAHead
+		int	    ta_len = 0;		// valid bytes in ta_buf[]
 		int	    len;
 		int	    p_more_save;
 		int	    old_State;
@@ -4848,17 +4848,17 @@
 		p_more_save = p_more;
 		p_more = FALSE;
 		old_State = State;
-		State = EXTERNCMD;	/* don't redraw at window resize */
+		State = EXTERNCMD;	// don't redraw at window resize
 
 		if ((options & SHELL_WRITE) && toshell_fd >= 0)
 		{
-		    /* Fork a process that will write the lines to the
-		     * external program. */
+		    // Fork a process that will write the lines to the
+		    // external program.
 		    if ((wpid = fork()) == -1)
 		    {
 			msg_puts(_("\nCannot fork\n"));
 		    }
-		    else if (wpid == 0) /* child */
+		    else if (wpid == 0) // child
 		    {
 			linenr_T    lnum = curbuf->b_op_start.lnum;
 			int	    written = 0;
@@ -4872,7 +4872,7 @@
 			    if (l == 0)
 				len = 0;
 			    else if (lp[written] == NL)
-				/* NL -> NUL translation */
+				// NL -> NUL translation
 				len = write(toshell_fd, "", (size_t)1);
 			    else
 			    {
@@ -4884,8 +4884,8 @@
 			    }
 			    if (len == (int)l)
 			    {
-				/* Finished a line, add a NL, unless this line
-				 * should not have one. */
+				// Finished a line, add a NL, unless this line
+				// should not have one.
 				if (lnum != curbuf->b_op_end.lnum
 					|| (!curbuf->b_p_bin
 					    && curbuf->b_p_fixeol)
@@ -4898,7 +4898,7 @@
 				++lnum;
 				if (lnum > curbuf->b_op_end.lnum)
 				{
-				    /* finished all the lines, close pipe */
+				    // finished all the lines, close pipe
 				    close(toshell_fd);
 				    toshell_fd = -1;
 				    break;
@@ -4911,7 +4911,7 @@
 			}
 			_exit(0);
 		    }
-		    else /* parent */
+		    else // parent
 		    {
 			close(toshell_fd);
 			toshell_fd = -1;
@@ -4955,8 +4955,8 @@
 		    {
 		      if (ta_len == 0)
 		      {
-			  /* Get extra characters when we don't have any.
-			   * Reset the counter and timer. */
+			  // Get extra characters when we don't have any.
+			  // Reset the counter and timer.
 			  noread_cnt = 0;
 # ifdef ELAPSED_FUNC
 			  ELAPSED_INIT(start_tv);
@@ -4986,7 +4986,7 @@
 			    }
 			}
 
-			/* replace K_BS by <BS> and K_DEL by <DEL> */
+			// replace K_BS by <BS> and K_DEL by <DEL>
 			for (i = ta_len; i < ta_len + len; ++i)
 			{
 			    if (ta_buf[i] == CSI && len - i > 2)
@@ -5059,8 +5059,8 @@
 
 		    if (got_int)
 		    {
-			/* CTRL-C sends a signal to the child, we ignore it
-			 * ourselves */
+			// CTRL-C sends a signal to the child, we ignore it
+			// ourselves
 #  ifdef HAVE_SETSID
 			kill(-pid, SIGINT);
 #  else
@@ -5086,14 +5086,14 @@
 			len = read_eintr(fromshell_fd, buffer
 				+ buffer_off, (size_t)(BUFLEN - buffer_off)
 				);
-			if (len <= 0)		    /* end of file or error */
+			if (len <= 0)		    // end of file or error
 			    goto finished;
 
 			noread_cnt = 0;
 			if (options & SHELL_READ)
 			{
-			    /* Do NUL -> NL translation, append NL separated
-			     * lines to the current buffer. */
+			    // Do NUL -> NL translation, append NL separated
+			    // lines to the current buffer.
 			    for (i = 0; i < len; ++i)
 			    {
 				if (buffer[i] == NL)
@@ -5112,20 +5112,20 @@
 			    len += buffer_off;
 			    buffer[len] = NUL;
 
-			    /* Check if the last character in buffer[] is
-			     * incomplete, keep these bytes for the next
-			     * round. */
+			    // Check if the last character in buffer[] is
+			    // incomplete, keep these bytes for the next
+			    // round.
 			    for (p = buffer; p < buffer + len; p += l)
 			    {
 				l = MB_CPTR2LEN(p);
 				if (l == 0)
-				    l = 1;  /* NUL byte? */
+				    l = 1;  // NUL byte?
 				else if (MB_BYTE2LEN(*p) != l)
 				    break;
 			    }
-			    if (p == buffer)	/* no complete character */
+			    if (p == buffer)	// no complete character
 			    {
-				/* avoid getting stuck at an illegal byte */
+				// avoid getting stuck at an illegal byte
 				if (len >= 12)
 				    ++p;
 				else
@@ -5163,9 +5163,9 @@
 			{
 			    long	msec = ELAPSED_FUNC(start_tv);
 
-			    /* Avoid that we keep looping here without
-			     * checking for a CTRL-C for a long time.  Don't
-			     * break out too often to avoid losing typeahead. */
+			    // Avoid that we keep looping here without
+			    // checking for a CTRL-C for a long time.  Don't
+			    // break out too often to avoid losing typeahead.
 			    if (msec > 2000)
 			    {
 				noread_cnt = 5;
@@ -5175,9 +5175,9 @@
 # endif
 		    }
 
-		    /* If we already detected the child has finished, continue
-		     * reading output for a short while.  Some text may be
-		     * buffered. */
+		    // If we already detected the child has finished, continue
+		    // reading output for a short while.  Some text may be
+		    // buffered.
 		    if (wait_pid == pid)
 		    {
 			if (noread_cnt < 5)
@@ -5197,17 +5197,17 @@
 		    if ((wait_pid == (pid_t)-1 && errno == ECHILD)
 			    || (wait_pid == pid && WIFEXITED(status)))
 		    {
-			/* Don't break the loop yet, try reading more
-			 * characters from "fromshell_fd" first.  When using
-			 * pipes there might still be something to read and
-			 * then we'll break the loop at the "break" above. */
+			// Don't break the loop yet, try reading more
+			// characters from "fromshell_fd" first.  When using
+			// pipes there might still be something to read and
+			// then we'll break the loop at the "break" above.
 			wait_pid = pid;
 		    }
 		    else
 			wait_pid = 0;
 
 # if defined(FEAT_XCLIPBOARD) && defined(FEAT_X11)
-		    /* Handle any X events, e.g. serving the clipboard. */
+		    // Handle any X events, e.g. serving the clipboard.
 		    clip_update();
 # endif
 		}
@@ -5218,7 +5218,7 @@
 		    if (ga.ga_len > 0)
 		    {
 			append_ga_line(&ga);
-			/* remember that the NL was missing */
+			// remember that the NL was missing
 			curbuf->b_no_eol_lnum = curwin->w_cursor.lnum;
 		    }
 		    else
@@ -5249,8 +5249,8 @@
 		{
 		    if (got_int)
 		    {
-			/* CTRL-C sends a signal to the child, we ignore it
-			 * ourselves */
+			// CTRL-C sends a signal to the child, we ignore it
+			// ourselves
 #  ifdef HAVE_SETSID
 			kill(-pid, SIGINT);
 #  else
@@ -5270,11 +5270,11 @@
 			break;
 		    }
 
-		    /* Handle any X events, e.g. serving the clipboard. */
+		    // Handle any X events, e.g. serving the clipboard.
 		    clip_update();
 
-		    /* Wait for 1 to 10 msec. 1 is faster but gives the child
-		     * less time. */
+		    // Wait for 1 to 10 msec. 1 is faster but gives the child
+		    // less time.
 		    mch_delay(delay_msec, TRUE);
 		    if (++delay_msec > 10)
 			delay_msec = 10;
@@ -5293,15 +5293,15 @@
 		wait_pid = wait4pid(pid, &status);
 
 # ifdef FEAT_GUI
-	    /* Close slave side of pty.  Only do this after the child has
-	     * exited, otherwise the child may hang when it tries to write on
-	     * the pty. */
+	    // Close slave side of pty.  Only do this after the child has
+	    // exited, otherwise the child may hang when it tries to write on
+	    // the pty.
 	    if (pty_master_fd >= 0)
 		close(pty_slave_fd);
 # endif
 
-	    /* Make sure the child that writes to the external program is
-	     * dead. */
+	    // Make sure the child that writes to the external program is
+	    // dead.
 	    if (wpid > 0)
 	    {
 		kill(wpid, SIGKILL);
@@ -5323,7 +5323,7 @@
 
 	    if (WIFEXITED(status))
 	    {
-		/* LINTED avoid "bitwise operation on signed value" */
+		// LINTED avoid "bitwise operation on signed value"
 		retval = WEXITSTATUS(status);
 		if (retval != 0 && !emsg_silent)
 		{
@@ -5349,7 +5349,7 @@
 error:
     if (!did_settmode)
 	if (tmode == TMODE_RAW)
-	    settmode(TMODE_RAW);	/* set to raw mode */
+	    settmode(TMODE_RAW);	// set to raw mode
 # ifdef FEAT_TITLE
     resettitle();
 # endif
@@ -5359,12 +5359,12 @@
 
     return retval;
 }
-#endif /* USE_SYSTEM */
+#endif // USE_SYSTEM
 
     int
 mch_call_shell(
     char_u	*cmd,
-    int		options)	/* SHELL_*, see vim.h */
+    int		options)	// SHELL_*, see vim.h
 {
 #if defined(FEAT_GUI) && defined(FEAT_TERMINAL)
     if (gui.in_use && vim_strchr(p_go, GO_TERMINAL) != NULL)
@@ -5382,9 +5382,9 @@
 mch_job_start(char **argv, job_T *job, jobopt_T *options, int is_terminal)
 {
     pid_t	pid;
-    int		fd_in[2] = {-1, -1};	/* for stdin */
-    int		fd_out[2] = {-1, -1};	/* for stdout */
-    int		fd_err[2] = {-1, -1};	/* for stderr */
+    int		fd_in[2] = {-1, -1};	// for stdin
+    int		fd_out[2] = {-1, -1};	// for stdout
+    int		fd_err[2] = {-1, -1};	// for stderr
     int		pty_master_fd = -1;
     int		pty_slave_fd = -1;
     channel_T	*channel = NULL;
@@ -5401,7 +5401,7 @@
     if (use_out_for_err && use_null_for_out)
 	use_null_for_err = TRUE;
 
-    /* default is to fail */
+    // default is to fail
     job->jv_status = JOB_FAILED;
 
     if (options->jo_pty
@@ -5411,8 +5411,8 @@
 	open_pty(&pty_master_fd, &pty_slave_fd,
 					    &job->jv_tty_out, &job->jv_tty_in);
 
-    /* TODO: without the channel feature connect the child to /dev/null? */
-    /* Open pipes for stdin, stdout, stderr. */
+    // TODO: without the channel feature connect the child to /dev/null?
+    // Open pipes for stdin, stdout, stderr.
     if (use_file_for_in)
     {
 	char_u *fname = options->jo_io_name[PART_IN];
@@ -5425,8 +5425,8 @@
 	}
     }
     else
-	/* When writing buffer lines to the input don't use the pty, so that
-	 * the pipe can be closed when all lines were written. */
+	// When writing buffer lines to the input don't use the pty, so that
+	// the pipe can be closed when all lines were written.
 	if (!use_null_for_in && (pty_master_fd < 0 || use_buffer_for_in)
 							    && pipe(fd_in) < 0)
 	    goto failed;
@@ -5478,10 +5478,10 @@
     }
 
     BLOCK_SIGNALS(&curset);
-    pid = fork();	/* maybe we should use vfork() */
+    pid = fork();	// maybe we should use vfork()
     if (pid == -1)
     {
-	/* failed to fork */
+	// failed to fork
 	UNBLOCK_SIGNALS(&curset);
 	goto failed;
     }
@@ -5490,20 +5490,20 @@
 	int	null_fd = -1;
 	int	stderr_works = TRUE;
 
-	/* child */
-	reset_signals();		/* handle signals normally */
+	// child
+	reset_signals();		// handle signals normally
 	UNBLOCK_SIGNALS(&curset);
 
 # ifdef FEAT_JOB_CHANNEL
 	if (ch_log_active())
-	    /* close the log file in the child */
+	    // close the log file in the child
 	    ch_logfile((char_u *)"", (char_u *)"");
 # endif
 
 # ifdef HAVE_SETSID
-	/* Create our own process group, so that the child and all its
-	 * children can be kill()ed.  Don't do this when using pipes,
-	 * because stdin is not a tty, we would lose /dev/tty. */
+	// Create our own process group, so that the child and all its
+	// children can be kill()ed.  Don't do this when using pipes,
+	// because stdin is not a tty, we would lose /dev/tty.
 	(void)setsid();
 # endif
 
@@ -5514,11 +5514,11 @@
 
 #ifdef FEAT_GUI
 	    if (term_is_gui(T_NAME))
-		/* In the GUI 'term' is not what we want, use $TERM. */
+		// In the GUI 'term' is not what we want, use $TERM.
 		term = getenv("TERM");
 #endif
-	    /* Use 'term' or $TERM if it starts with "xterm", otherwise fall
-	     * back to "xterm". */
+	    // Use 'term' or $TERM if it starts with "xterm", otherwise fall
+	    // back to "xterm".
 	    if (term == NULL || *term == NUL || STRNCMP(term, "xterm", 5) != 0)
 		term = "xterm";
 	    set_child_environment(
@@ -5559,16 +5559,16 @@
 
 	if (pty_slave_fd >= 0)
 	{
-	    /* push stream discipline modules */
+	    // push stream discipline modules
 	    setup_slavepty(pty_slave_fd);
 #  ifdef TIOCSCTTY
-	    /* Try to become controlling tty (probably doesn't work,
-	     * unless run by root) */
+	    // Try to become controlling tty (probably doesn't work,
+	    // unless run by root)
 	    ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL);
 #  endif
 	}
 
-	/* set up stdin for the child */
+	// set up stdin for the child
 	close(0);
 	if (use_null_for_in && null_fd >= 0)
 	    vim_ignored = dup(null_fd);
@@ -5577,7 +5577,7 @@
 	else
 	    vim_ignored = dup(fd_in[0]);
 
-	/* set up stderr for the child */
+	// set up stderr for the child
 	close(2);
 	if (use_null_for_err && null_fd >= 0)
 	{
@@ -5591,7 +5591,7 @@
 	else
 	    vim_ignored = dup(fd_err[1]);
 
-	/* set up stdout for the child */
+	// set up stdout for the child
 	close(1);
 	if (use_null_for_out && null_fd >= 0)
 	    vim_ignored = dup(null_fd);
@@ -5614,8 +5614,8 @@
 	    close(fd_err[1]);
 	if (pty_master_fd >= 0)
 	{
-	    close(pty_master_fd); /* not used in the child */
-	    close(pty_slave_fd);  /* was duped above */
+	    close(pty_master_fd); // not used in the child
+	    close(pty_slave_fd);  // was duped above
 	}
 
 	if (null_fd >= 0)
@@ -5624,28 +5624,28 @@
 	if (options->jo_cwd != NULL && mch_chdir((char *)options->jo_cwd) != 0)
 	    _exit(EXEC_FAILED);
 
-	/* See above for type of argv. */
+	// See above for type of argv.
 	execvp(argv[0], argv);
 
 	if (stderr_works)
 	    perror("executing job failed");
 # ifdef EXITFREE
-	/* calling free_all_mem() here causes problems. Ignore valgrind
-	 * reporting possibly leaked memory. */
+	// calling free_all_mem() here causes problems. Ignore valgrind
+	// reporting possibly leaked memory.
 # endif
-	_exit(EXEC_FAILED);	    /* exec failed, return failure code */
+	_exit(EXEC_FAILED);	    // exec failed, return failure code
     }
 
-    /* parent */
+    // parent
     UNBLOCK_SIGNALS(&curset);
 
     job->jv_pid = pid;
     job->jv_status = JOB_STARTED;
-    job->jv_channel = channel;  /* ch_refcount was set above */
+    job->jv_channel = channel;  // ch_refcount was set above
 
     if (pty_master_fd >= 0)
-	close(pty_slave_fd); /* not used in the parent */
-    /* close child stdin, stdout and stderr */
+	close(pty_slave_fd); // not used in the parent
+    // close child stdin, stdout and stderr
     if (fd_in[0] >= 0)
 	close(fd_in[0]);
     if (fd_out[1] >= 0)
@@ -5689,7 +5689,7 @@
 	    close(pty_master_fd);
     }
 
-    /* success! */
+    // success!
     return;
 
 failed:
@@ -5746,7 +5746,7 @@
 # endif
     if (wait_pid == -1)
     {
-	/* process must have exited */
+	// process must have exited
 	if (job->jv_status < JOB_ENDED)
 	    ch_log(job->jv_channel, "Job no longer exists: %s",
 							      strerror(errno));
@@ -5756,7 +5756,7 @@
 	return "run";
     if (WIFEXITED(status))
     {
-	/* LINTED avoid "bitwise operation on signed value" */
+	// LINTED avoid "bitwise operation on signed value"
 	job->jv_exitval = WEXITSTATUS(status);
 	if (job->jv_status < JOB_ENDED)
 	    ch_log(job->jv_channel, "Job exited with %d", job->jv_exitval);
@@ -5791,9 +5791,9 @@
     job_T	*job;
 
 # ifndef USE_SYSTEM
-    /* Do not do this when waiting for a shell command to finish, we would get
-     * the exit value here (and discard it), the exit value obtained there
-     * would then be wrong.  */
+    // Do not do this when waiting for a shell command to finish, we would get
+    // the exit value here (and discard it), the exit value obtained there
+    // would then be wrong.
     if (dont_check_job_ended > 0)
 	return NULL;
 # endif
@@ -5804,14 +5804,14 @@
     wait_pid = waitpid(-1, &status, WNOHANG);
 # endif
     if (wait_pid <= 0)
-	/* no process ended */
+	// no process ended
 	return NULL;
     for (job = job_list; job != NULL; job = job->jv_next)
     {
 	if (job->jv_pid == wait_pid)
 	{
 	    if (WIFEXITED(status))
-		/* LINTED avoid "bitwise operation on signed value" */
+		// LINTED avoid "bitwise operation on signed value"
 		job->jv_exitval = WEXITSTATUS(status);
 	    else if (WIFSIGNALED(status))
 	    {
@@ -5874,7 +5874,7 @@
     void
 mch_clear_job(job_T *job)
 {
-    /* call waitpid because child process may become zombie */
+    // call waitpid because child process may become zombie
 # ifdef __NeXT__
     (void)wait4(job->jv_pid, NULL, WNOHANG, (struct rusage *)0);
 # else
@@ -5903,11 +5903,11 @@
     if (job->jv_tty_out != NULL)
 	ch_log(channel, "using pty %s on fd %d",
 					       job->jv_tty_out, pty_master_fd);
-    job->jv_channel = channel;  /* ch_refcount was set by add_channel() */
+    job->jv_channel = channel;  // ch_refcount was set by add_channel()
     channel->ch_keep_open = TRUE;
 
-    /* Only set the pty_master_fd for stdout, do not duplicate it for stderr,
-     * it only needs to be read once. */
+    // Only set the pty_master_fd for stdout, do not duplicate it for stderr,
+    // it only needs to be read once.
     channel_set_pipes(channel, pty_master_fd, pty_master_fd, INVALID_FD);
     channel_set_job(channel, job, options);
     return OK;
@@ -5969,11 +5969,11 @@
 #endif
     int		avail;
 
-    if (!ignore_input && input_available())	    /* something in inbuf[] */
+    if (!ignore_input && input_available())	    // something in inbuf[]
 	return 1;
 
 #if defined(FEAT_MOUSE_DEC)
-    /* May need to query the mouse position. */
+    // May need to query the mouse position.
     if (WantQueryMouse)
     {
 	WantQueryMouse = FALSE;
@@ -6066,12 +6066,12 @@
 #if defined(FEAT_XCLIPBOARD) || defined(USE_XSMP) || defined(FEAT_MZSCHEME)
     static int	busy = FALSE;
 
-    /* May retry getting characters after an event was handled. */
+    // May retry getting characters after an event was handled.
 # define MAY_LOOP
 
 # ifdef ELAPSED_FUNC
-    /* Remember at what time we started, so that we know how much longer we
-     * should wait after being interrupted. */
+    // Remember at what time we started, so that we know how much longer we
+    // should wait after being interrupted.
     long	start_msec = msec;
     elapsed_T	start_tv;
 
@@ -6079,8 +6079,8 @@
 	ELAPSED_INIT(start_tv);
 # endif
 
-    /* Handle being called recursively.  This may happen for the session
-     * manager stuff, it may save the file, which does a breakcheck. */
+    // Handle being called recursively.  This may happen for the session
+    // manager stuff, it may save the file, which does a breakcheck.
     if (busy)
 	return 0;
 #endif
@@ -6090,13 +6090,13 @@
 #endif
     {
 #ifdef MAY_LOOP
-	int		finished = TRUE; /* default is to 'loop' just once */
+	int		finished = TRUE; // default is to 'loop' just once
 # ifdef FEAT_MZSCHEME
 	int		mzquantum_used = FALSE;
 # endif
 #endif
 #ifndef HAVE_SELECT
-			/* each channel may use in, out and err */
+			// each channel may use in, out and err
 	struct pollfd   fds[6 + 3 * MAX_OPEN_CHANNELS];
 	int		nfd;
 # ifdef FEAT_XCLIPBOARD
@@ -6114,7 +6114,7 @@
 	mzvim_check_threads();
 	if (mzthreads_allowed() && p_mzq > 0 && (msec < 0 || msec > p_mzq))
 	{
-	    towait = (int)p_mzq;    /* don't wait longer than 'mzquantum' */
+	    towait = (int)p_mzq;    // don't wait longer than 'mzquantum'
 	    mzquantum_used = TRUE;
 	}
 # endif
@@ -6164,16 +6164,16 @@
 
 # ifdef FEAT_MZSCHEME
 	if (ret == 0 && mzquantum_used)
-	    /* MzThreads scheduling is required and timeout occurred */
+	    // MzThreads scheduling is required and timeout occurred
 	    finished = FALSE;
 # endif
 
 # ifdef FEAT_XCLIPBOARD
 	if (xterm_Shell != (Widget)0 && (fds[xterm_idx].revents & POLLIN))
 	{
-	    xterm_update();      /* Maybe we should hand out clipboard */
+	    xterm_update();      // Maybe we should hand out clipboard
 	    if (--ret == 0 && !input_available())
-		/* Try again */
+		// Try again
 		finished = FALSE;
 	}
 # endif
@@ -6197,7 +6197,7 @@
 		xsmp_close();
 	    }
 	    if (--ret == 0)
-		finished = FALSE;	/* Try again */
+		finished = FALSE;	// Try again
 	}
 # endif
 #ifdef FEAT_JOB_CHANNEL
@@ -6206,7 +6206,7 @@
 	    channel_poll_check(ret, &fds);
 #endif
 
-#else /* HAVE_SELECT */
+#else // HAVE_SELECT
 
 	struct timeval  tv;
 	struct timeval	*tvp;
@@ -6220,7 +6220,7 @@
 	mzvim_check_threads();
 	if (mzthreads_allowed() && p_mzq > 0 && (msec < 0 || msec > p_mzq))
 	{
-	    towait = p_mzq;	/* don't wait longer than 'mzquantum' */
+	    towait = p_mzq;	// don't wait longer than 'mzquantum'
 	    mzquantum_used = TRUE;
 	}
 # endif
@@ -6243,7 +6243,7 @@
 	FD_ZERO(&efds);
 	FD_SET(fd, &rfds);
 # if !defined(__QNX__) && !defined(__CYGWIN32__)
-	/* For QNX select() always returns 1 if this is set.  Why? */
+	// For QNX select() always returns 1 if this is set.  Why?
 	FD_SET(fd, &efds);
 # endif
 	maxfd = fd;
@@ -6256,8 +6256,8 @@
 	    if (maxfd < ConnectionNumber(xterm_dpy))
 		maxfd = ConnectionNumber(xterm_dpy);
 
-	    /* An event may have already been read but not handled.  In
-	     * particularly, XFlush may cause this. */
+	    // An event may have already been read but not handled.  In
+	    // particularly, XFlush may cause this.
 	    xterm_update();
 	}
 # endif
@@ -6296,15 +6296,15 @@
 # ifdef EINTR
 	if (ret == -1 && errno == EINTR)
 	{
-	    /* Check whether window has been resized, EINTR may be caused by
-	     * SIGWINCH. */
+	    // Check whether window has been resized, EINTR may be caused by
+	    // SIGWINCH.
 	    if (do_resize)
 		handle_resize();
 
-	    /* Interrupted by a signal, need to try again.  We ignore msec
-	     * here, because we do want to check even after a timeout if
-	     * characters are available.  Needed for reading output of an
-	     * external command after the process has finished. */
+	    // Interrupted by a signal, need to try again.  We ignore msec
+	    // here, because we do want to check even after a timeout if
+	    // characters are available.  Needed for reading output of an
+	    // external command after the process has finished.
 	    goto select_eintr;
 	}
 # endif
@@ -6318,7 +6318,7 @@
 # endif
 # ifdef FEAT_MZSCHEME
 	if (ret == 0 && mzquantum_used)
-	    /* loop if MzThreads must be scheduled and timeout occurred */
+	    // loop if MzThreads must be scheduled and timeout occurred
 	    finished = FALSE;
 # endif
 
@@ -6326,12 +6326,12 @@
 	if (ret > 0 && xterm_Shell != (Widget)0
 		&& FD_ISSET(ConnectionNumber(xterm_dpy), &rfds))
 	{
-	    xterm_update();	      /* Maybe we should hand out clipboard */
-	    /* continue looping when we only got the X event and the input
-	     * buffer is empty */
+	    xterm_update();	      // Maybe we should hand out clipboard
+	    // continue looping when we only got the X event and the input
+	    // buffer is empty
 	    if (--ret == 0 && !input_available())
 	    {
-		/* Try again */
+		// Try again
 		finished = FALSE;
 	    }
 	}
@@ -6354,7 +6354,7 @@
 		    verb_msg(_("XSMP lost ICE connection"));
 		xsmp_close();
 		if (--ret == 0)
-		    finished = FALSE;   /* keep going if event was only one */
+		    finished = FALSE;   // keep going if event was only one
 	    }
 	    else if (FD_ISSET(xsmp_icefd, &rfds))
 	    {
@@ -6362,17 +6362,17 @@
 		xsmp_handle_requests();
 		busy = FALSE;
 		if (--ret == 0)
-		    finished = FALSE;   /* keep going if event was only one */
+		    finished = FALSE;   // keep going if event was only one
 	    }
 	}
 # endif
 #ifdef FEAT_JOB_CHANNEL
-	/* also call when ret == 0, we may be polling a keep-open channel */
+	// also call when ret == 0, we may be polling a keep-open channel
 	if (ret >= 0)
 	    ret = channel_select_check(ret, &rfds, &wfds);
 #endif
 
-#endif /* HAVE_SELECT */
+#endif // HAVE_SELECT
 
 #ifdef MAY_LOOP
 	if (finished || msec == 0)
@@ -6383,18 +6383,18 @@
 	    break;
 # endif
 
-	/* We're going to loop around again, find out for how long */
+	// We're going to loop around again, find out for how long
 	if (msec > 0)
 	{
 # ifdef ELAPSED_FUNC
-	    /* Compute remaining wait time. */
+	    // Compute remaining wait time.
 	    msec = start_msec - ELAPSED_FUNC(start_tv);
 # else
-	    /* Guess we got interrupted halfway. */
+	    // Guess we got interrupted halfway.
 	    msec = msec / 2;
 # endif
 	    if (msec <= 0)
-		break;	/* waited long enough */
+		break;	// waited long enough
 	}
 #endif
     }
@@ -6412,7 +6412,7 @@
 mch_expandpath(
     garray_T	*gap,
     char_u	*path,
-    int		flags)		/* EW_* flags */
+    int		flags)		// EW_* flags
 {
     return unix_expandpath(gap, path, 0, flags, FALSE);
 }
@@ -6445,7 +6445,7 @@
     char_u	 **pat,
     int		  *num_file,
     char_u	***file,
-    int		   flags)	/* EW_* flags */
+    int		   flags)	// EW_* flags
 {
     int		i;
     size_t	len;
@@ -6461,20 +6461,20 @@
     char_u	*command;
     FILE	*fd;
     char_u	*buffer;
-#define STYLE_ECHO	0	/* use "echo", the default */
-#define STYLE_GLOB	1	/* use "glob", for csh */
-#define STYLE_VIMGLOB	2	/* use "vimglob", for Posix sh */
-#define STYLE_PRINT	3	/* use "print -N", for zsh */
-#define STYLE_BT	4	/* `cmd` expansion, execute the pattern
-				 * directly */
+#define STYLE_ECHO	0	// use "echo", the default
+#define STYLE_GLOB	1	// use "glob", for csh
+#define STYLE_VIMGLOB	2	// use "vimglob", for Posix sh
+#define STYLE_PRINT	3	// use "print -N", for zsh
+#define STYLE_BT	4	// `cmd` expansion, execute the pattern
+				// directly
     int		shell_style = STYLE_ECHO;
     int		check_spaces;
     static int	did_find_nul = FALSE;
     int		ampersand = FALSE;
-		/* vimglob() function to define for Posix shell */
+		// vimglob() function to define for Posix shell
     static char *sh_vimglob_func = "vimglob() { while [ $# -ge 1 ]; do echo \"$1\"; shift; done }; vimglob >";
 
-    *num_file = 0;	/* default: no files found */
+    *num_file = 0;	// default: no files found
     *file = NULL;
 
     /*
@@ -6485,7 +6485,7 @@
 	return save_patterns(num_pat, pat, num_file, file);
 
 # ifdef HAVE_SANDBOX
-    /* Don't allow any shell command in the sandbox. */
+    // Don't allow any shell command in the sandbox.
     if (sandbox != 0 && check_secure())
 	return FAIL;
 # endif
@@ -6537,25 +6537,25 @@
 								"sh") != NULL)
 	shell_style = STYLE_VIMGLOB;
 
-    /* Compute the length of the command.  We need 2 extra bytes: for the
-     * optional '&' and for the NUL.
-     * Worst case: "unset nonomatch; print -N >" plus two is 29 */
+    // Compute the length of the command.  We need 2 extra bytes: for the
+    // optional '&' and for the NUL.
+    // Worst case: "unset nonomatch; print -N >" plus two is 29
     len = STRLEN(tempname) + 29;
     if (shell_style == STYLE_VIMGLOB)
 	len += STRLEN(sh_vimglob_func);
 
     for (i = 0; i < num_pat; ++i)
     {
-	/* Count the length of the patterns in the same way as they are put in
-	 * "command" below. */
+	// Count the length of the patterns in the same way as they are put in
+	// "command" below.
 #ifdef USE_SYSTEM
-	len += STRLEN(pat[i]) + 3;	/* add space and two quotes */
+	len += STRLEN(pat[i]) + 3;	// add space and two quotes
 #else
-	++len;				/* add space */
+	++len;				// add space
 	for (j = 0; pat[i][j] != NUL; ++j)
 	{
 	    if (vim_strchr(SHELL_SPECIAL, pat[i][j]) != NULL)
-		++len;		/* may add a backslash */
+		++len;		// may add a backslash
 	    ++len;
 	}
 #endif
@@ -6563,7 +6563,7 @@
     command = alloc(len);
     if (command == NULL)
     {
-	/* out of memory */
+	// out of memory
 	vim_free(tempname);
 	return FAIL;
     }
@@ -6578,14 +6578,14 @@
      */
     if (shell_style == STYLE_BT)
     {
-	/* change `command; command& ` to (command; command ) */
+	// change `command; command& ` to (command; command )
 	STRCPY(command, "(");
-	STRCAT(command, pat[0] + 1);		/* exclude first backtick */
+	STRCAT(command, pat[0] + 1);		// exclude first backtick
 	p = command + STRLEN(command) - 1;
-	*p-- = ')';				/* remove last backtick */
+	*p-- = ')';				// remove last backtick
 	while (p > command && VIM_ISWHITE(*p))
 	    --p;
-	if (*p == '&')				/* remove trailing '&' */
+	if (*p == '&')				// remove trailing '&'
 	{
 	    ampersand = TRUE;
 	    *p = ' ';
@@ -6613,9 +6613,9 @@
     if (shell_style != STYLE_BT)
 	for (i = 0; i < num_pat; ++i)
 	{
-	    /* When using system() always add extra quotes, because the shell
-	     * is started twice.  Otherwise put a backslash before special
-	     * characters, except inside ``. */
+	    // When using system() always add extra quotes, because the shell
+	    // is started twice.  Otherwise put a backslash before special
+	    // characters, except inside ``.
 #ifdef USE_SYSTEM
 	    STRCAT(command, " \"");
 	    STRCAT(command, pat[i]);
@@ -6631,9 +6631,9 @@
 		    intick = !intick;
 		else if (pat[i][j] == '\\' && pat[i][j + 1] != NUL)
 		{
-		    /* Remove a backslash, take char literally.  But keep
-		     * backslash inside backticks, before a special character
-		     * and before a backtick. */
+		    // Remove a backslash, take char literally.  But keep
+		    // backslash inside backticks, before a special character
+		    // and before a backtick.
 		    if (intick
 			  || vim_strchr(SHELL_SPECIAL, pat[i][j + 1]) != NULL
 			  || pat[i][j + 1] == '`')
@@ -6643,12 +6643,12 @@
 		else if (!intick
 			 && ((flags & EW_KEEPDOLLAR) == 0 || pat[i][j] != '$')
 			      && vim_strchr(SHELL_SPECIAL, pat[i][j]) != NULL)
-		    /* Put a backslash before a special character, but not
-		     * when inside ``. And not for $var when EW_KEEPDOLLAR is
-		     * set. */
+		    // Put a backslash before a special character, but not
+		    // when inside ``. And not for $var when EW_KEEPDOLLAR is
+		    // set.
 		    *p++ = '\\';
 
-		/* Copy one character. */
+		// Copy one character.
 		*p++ = pat[i][j];
 	    }
 	    *p = NUL;
@@ -6657,7 +6657,7 @@
     if (flags & EW_SILENT)
 	show_shell_mess = FALSE;
     if (ampersand)
-	STRCAT(command, "&");		/* put the '&' after the redirection */
+	STRCAT(command, "&");		// put the '&' after the redirection
 
     /*
      * Using zsh -G: If a pattern has no matches, it is just deleted from
@@ -6665,7 +6665,7 @@
      * expand any other pattern.
      */
     if (shell_style == STYLE_PRINT)
-	extra_shell_arg = (char_u *)"-G";   /* Use zsh NULL_GLOB option */
+	extra_shell_arg = (char_u *)"-G";   // Use zsh NULL_GLOB option
 
     /*
      * If we use -f then shell variables set in .cshrc won't get expanded.
@@ -6673,23 +6673,23 @@
      * in one of the patterns, otherwise we can still use the fast option.
      */
     else if (shell_style == STYLE_GLOB && !have_dollars(num_pat, pat))
-	extra_shell_arg = (char_u *)"-f";	/* Use csh fast option */
+	extra_shell_arg = (char_u *)"-f";	// Use csh fast option
 
     /*
      * execute the shell command
      */
     i = call_shell(command, SHELL_EXPAND | SHELL_SILENT);
 
-    /* When running in the background, give it some time to create the temp
-     * file, but don't wait for it to finish. */
+    // When running in the background, give it some time to create the temp
+    // file, but don't wait for it to finish.
     if (ampersand)
 	mch_delay(10L, TRUE);
 
-    extra_shell_arg = NULL;		/* cleanup */
+    extra_shell_arg = NULL;		// cleanup
     show_shell_mess = TRUE;
     vim_free(command);
 
-    if (i != 0)				/* mch_call_shell() failed */
+    if (i != 0)				// mch_call_shell() failed
     {
 	mch_remove(tempname);
 	vim_free(tempname);
@@ -6702,19 +6702,19 @@
 	if (!(flags & EW_SILENT))
 #endif
 	{
-	    redraw_later_clear();	/* probably messed up screen */
-	    msg_putchar('\n');		/* clear bottom line quickly */
-	    cmdline_row = Rows - 1;	/* continue on last line */
+	    redraw_later_clear();	// probably messed up screen
+	    msg_putchar('\n');		// clear bottom line quickly
+	    cmdline_row = Rows - 1;	// continue on last line
 #ifdef USE_SYSTEM
 	    if (!(flags & EW_SILENT))
 #endif
 	    {
 		msg(_(e_wildexpand));
-		msg_start();		/* don't overwrite this message */
+		msg_start();		// don't overwrite this message
 	    }
 	}
-	/* If a `cmd` expansion failed, don't list `cmd` as a match, even when
-	 * EW_NOTFOUND is given */
+	// If a `cmd` expansion failed, don't list `cmd` as a match, even when
+	// EW_NOTFOUND is given
 	if (shell_style == STYLE_BT)
 	    return FAIL;
 	goto notfound;
@@ -6726,26 +6726,26 @@
     fd = fopen((char *)tempname, READBIN);
     if (fd == NULL)
     {
-	/* Something went wrong, perhaps a file name with a special char. */
+	// Something went wrong, perhaps a file name with a special char.
 	if (!(flags & EW_SILENT))
 	{
 	    msg(_(e_wildexpand));
-	    msg_start();		/* don't overwrite this message */
+	    msg_start();		// don't overwrite this message
 	}
 	vim_free(tempname);
 	goto notfound;
     }
     fseek(fd, 0L, SEEK_END);
-    llen = ftell(fd);			/* get size of temp file */
+    llen = ftell(fd);			// get size of temp file
     fseek(fd, 0L, SEEK_SET);
     if (llen < 0)
-	/* just in case ftell() would fail */
+	// just in case ftell() would fail
 	buffer = NULL;
     else
 	buffer = alloc(llen + 1);
     if (buffer == NULL)
     {
-	/* out of memory */
+	// out of memory
 	mch_remove(tempname);
 	vim_free(tempname);
 	fclose(fd);
@@ -6757,7 +6757,7 @@
     mch_remove(tempname);
     if (i != (int)len)
     {
-	/* unexpected read error */
+	// unexpected read error
 	semsg(_(e_notread), tempname);
 	vim_free(tempname);
 	vim_free(buffer);
@@ -6766,7 +6766,7 @@
     vim_free(tempname);
 
 # ifdef __CYGWIN__
-    /* Translate <CR><NL> into <NL>.  Caution, buffer may contain NUL. */
+    // Translate <CR><NL> into <NL>.  Caution, buffer may contain NUL.
     p = buffer;
     for (i = 0; i < (int)len; ++i)
 	if (!(buffer[i] == CAR && buffer[i + 1] == NL))
@@ -6775,33 +6775,33 @@
 # endif
 
 
-    /* file names are separated with Space */
+    // file names are separated with Space
     if (shell_style == STYLE_ECHO)
     {
-	buffer[len] = '\n';		/* make sure the buffer ends in NL */
+	buffer[len] = '\n';		// make sure the buffer ends in NL
 	p = buffer;
-	for (i = 0; *p != '\n'; ++i)	/* count number of entries */
+	for (i = 0; *p != '\n'; ++i)	// count number of entries
 	{
 	    while (*p != ' ' && *p != '\n')
 		++p;
-	    p = skipwhite(p);		/* skip to next entry */
+	    p = skipwhite(p);		// skip to next entry
 	}
     }
-    /* file names are separated with NL */
+    // file names are separated with NL
     else if (shell_style == STYLE_BT || shell_style == STYLE_VIMGLOB)
     {
-	buffer[len] = NUL;		/* make sure the buffer ends in NUL */
+	buffer[len] = NUL;		// make sure the buffer ends in NUL
 	p = buffer;
-	for (i = 0; *p != NUL; ++i)	/* count number of entries */
+	for (i = 0; *p != NUL; ++i)	// count number of entries
 	{
 	    while (*p != '\n' && *p != NUL)
 		++p;
 	    if (*p != NUL)
 		++p;
-	    p = skipwhite(p);		/* skip leading white space */
+	    p = skipwhite(p);		// skip leading white space
 	}
     }
-    /* file names are separated with NUL */
+    // file names are separated with NUL
     else
     {
 	/*
@@ -6815,7 +6815,7 @@
 	check_spaces = FALSE;
 	if (shell_style == STYLE_PRINT && !did_find_nul)
 	{
-	    /* If there is a NUL, set did_find_nul, else set check_spaces */
+	    // If there is a NUL, set did_find_nul, else set check_spaces
 	    buffer[len] = NUL;
 	    if (len && (int)STRLEN(buffer) < (int)len)
 		did_find_nul = TRUE;
@@ -6833,13 +6833,13 @@
 	    buffer[len] = NUL;
 	i = 0;
 	for (p = buffer; p < buffer + len; ++p)
-	    if (*p == NUL || (*p == ' ' && check_spaces))   /* count entry */
+	    if (*p == NUL || (*p == ' ' && check_spaces))   // count entry
 	    {
 		++i;
 		*p = NUL;
 	    }
 	if (len)
-	    ++i;			/* count last entry */
+	    ++i;			// count last entry
     }
     if (i == 0)
     {
@@ -6855,7 +6855,7 @@
     *file = ALLOC_MULT(char_u *, i);
     if (*file == NULL)
     {
-	/* out of memory */
+	// out of memory
 	vim_free(buffer);
 	return FAIL;
     }
@@ -6867,26 +6867,26 @@
     for (i = 0; i < *num_file; ++i)
     {
 	(*file)[i] = p;
-	/* Space or NL separates */
+	// Space or NL separates
 	if (shell_style == STYLE_ECHO || shell_style == STYLE_BT
 					      || shell_style == STYLE_VIMGLOB)
 	{
 	    while (!(shell_style == STYLE_ECHO && *p == ' ')
 						   && *p != '\n' && *p != NUL)
 		++p;
-	    if (p == buffer + len)		/* last entry */
+	    if (p == buffer + len)		// last entry
 		*p = NUL;
 	    else
 	    {
 		*p++ = NUL;
-		p = skipwhite(p);		/* skip to next entry */
+		p = skipwhite(p);		// skip to next entry
 	    }
 	}
-	else		/* NUL separates */
+	else		// NUL separates
 	{
-	    while (*p && p < buffer + len)	/* skip entry */
+	    while (*p && p < buffer + len)	// skip entry
 		++p;
-	    ++p;				/* skip NUL */
+	    ++p;				// skip NUL
 	}
     }
 
@@ -6895,16 +6895,16 @@
      */
     for (j = 0, i = 0; i < *num_file; ++i)
     {
-	/* Require the files to exist.	Helps when using /bin/sh */
+	// Require the files to exist.	Helps when using /bin/sh
 	if (!(flags & EW_NOTFOUND) && mch_getperm((*file)[i]) < 0)
 	    continue;
 
-	/* check if this entry should be included */
+	// check if this entry should be included
 	dir = (mch_isdir((*file)[i]));
 	if ((dir && !(flags & EW_DIR)) || (!dir && !(flags & EW_FILE)))
 	    continue;
 
-	/* Skip files that are not executable if we check for that. */
+	// Skip files that are not executable if we check for that.
 	if (!dir && (flags & EW_EXEC)
 		    && !mch_can_exe((*file)[i], NULL, !(flags & EW_SHELLCMD)))
 	    continue;
@@ -6914,14 +6914,14 @@
 	{
 	    STRCPY(p, (*file)[i]);
 	    if (dir)
-		add_pathsep(p);	    /* add '/' to a directory name */
+		add_pathsep(p);	    // add '/' to a directory name
 	    (*file)[j++] = p;
 	}
     }
     vim_free(buffer);
     *num_file = j;
 
-    if (*num_file == 0)	    /* rejected all entries */
+    if (*num_file == 0)	    // rejected all entries
     {
 	VIM_CLEAR(*file);
 	goto notfound;
@@ -6935,7 +6935,7 @@
     return FAIL;
 }
 
-#endif /* VMS */
+#endif // VMS
 
     static int
 save_patterns(
@@ -6954,8 +6954,8 @@
     {
 	s = vim_strsave(pat[i]);
 	if (s != NULL)
-	    /* Be compatible with expand_filename(): halve the number of
-	     * backslashes. */
+	    // Be compatible with expand_filename(): halve the number of
+	    // backslashes.
 	    backslash_halve(s);
 	(*file)[i] = s;
     }
@@ -7045,15 +7045,15 @@
 {
     struct stat	    st;
 
-    if (stat(dest, &st) >= 0)	    /* fail if destination exists */
+    if (stat(dest, &st) >= 0)	    // fail if destination exists
 	return -1;
-    if (link(src, dest) != 0)	    /* link file to new name */
+    if (link(src, dest) != 0)	    // link file to new name
 	return -1;
-    if (mch_remove(src) == 0)	    /* delete link to old name */
+    if (mch_remove(src) == 0)	    // delete link to old name
 	return 0;
     return -1;
 }
-#endif /* !HAVE_RENAME */
+#endif // !HAVE_RENAME
 
 #if defined(FEAT_MOUSE_GPM) || defined(PROTO)
 /*
@@ -7063,32 +7063,31 @@
     static int
 gpm_open(void)
 {
-    static Gpm_Connect gpm_connect; /* Must it be kept till closing ? */
+    static Gpm_Connect gpm_connect; // Must it be kept till closing ?
 
     if (!gpm_flag)
     {
 	gpm_connect.eventMask = (GPM_UP | GPM_DRAG | GPM_DOWN);
 	gpm_connect.defaultMask = ~GPM_HARD;
-	/* Default handling for mouse move*/
-	gpm_connect.minMod = 0; /* Handle any modifier keys */
+	// Default handling for mouse move
+	gpm_connect.minMod = 0; // Handle any modifier keys
 	gpm_connect.maxMod = 0xffff;
 	if (Gpm_Open(&gpm_connect, 0) > 0)
 	{
-	    /* gpm library tries to handling TSTP causes
-	     * problems. Anyways, we close connection to Gpm whenever
-	     * we are going to suspend or starting an external process
-	     * so we shouldn't  have problem with this
-	     */
+	    // gpm library tries to handling TSTP causes
+	    // problems. Anyways, we close connection to Gpm whenever
+	    // we are going to suspend or starting an external process
+	    // so we shouldn't  have problem with this
 # ifdef SIGTSTP
 	    signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL);
 # endif
-	    return 1; /* succeed */
+	    return 1; // succeed
 	}
 	if (gpm_fd == -2)
-	    Gpm_Close(); /* We don't want to talk to xterm via gpm */
+	    Gpm_Close(); // We don't want to talk to xterm via gpm
 	return 0;
     }
-    return 1; /* already open */
+    return 1; // already open
 }
 
 /*
@@ -7130,7 +7129,7 @@
     Gpm_GetEvent(&gpm_event);
 
 #ifdef FEAT_GUI
-    /* Don't put events in the input queue now. */
+    // Don't put events in the input queue now.
     if (hold_gui_events)
 	return 0;
 #endif
@@ -7138,7 +7137,7 @@
     row = gpm_event.y - 1;
     col = gpm_event.x - 1;
 
-    string[0] = ESC; /* Our termcode */
+    string[0] = ESC; // Our termcode
     string[1] = 'M';
     string[2] = 'G';
     switch (GPM_BARE_EVENTS(gpm_event.type))
@@ -7162,8 +7161,8 @@
 		    break;
 		default:
 		    return 0;
-		    /*Don't know what to do. Can more than one button be
-		     * reported in one event? */
+		    // Don't know what to do. Can more than one button be
+		    // reported in one event?
 	    }
 	    string[3] = (char_u)(button | 0x20);
 	    SET_NUM_MOUSE_CLICKS(string[3], gpm_event.clicks + 1);
@@ -7175,13 +7174,12 @@
 	default:
 	    return 0;
     }
-    /*This code is based on gui_x11_mouse_cb in gui_x11.c */
+    // This code is based on gui_x11_mouse_cb in gui_x11.c
     gpm_modifiers = gpm_event.modifiers;
     vim_modifiers = 0x0;
-    /* I ignore capslock stats. Aren't we all just hate capslock mixing with
-     * Vim commands ? Besides, gpm_event.modifiers is unsigned char, and
-     * K_CAPSSHIFT is defined 8, so it probably isn't even reported
-     */
+    // I ignore capslock stats. Aren't we all just hate capslock mixing with
+    // Vim commands ? Besides, gpm_event.modifiers is unsigned char, and
+    // K_CAPSSHIFT is defined 8, so it probably isn't even reported
     if (gpm_modifiers & ((1 << KG_SHIFT) | (1 << KG_SHIFTR) | (1 << KG_SHIFTL)))
 	vim_modifiers |= MOUSE_SHIFT;
 
@@ -7195,7 +7193,7 @@
     add_to_input_buf(string, 6);
     return 6;
 }
-#endif /* FEAT_MOUSE_GPM */
+#endif // FEAT_MOUSE_GPM
 
 #ifdef FEAT_SYSMOUSE
 /*
@@ -7253,7 +7251,7 @@
     static int		oldbuttons = 0;
 
 #ifdef FEAT_GUI
-    /* Don't put events in the input queue now. */
+    // Don't put events in the input queue now.
     if (hold_gui_events)
 	return;
 #endif
@@ -7267,7 +7265,7 @@
 	row = mouse.u.data.y / video.vi_cheight;
 	col = mouse.u.data.x / video.vi_cwidth;
 	buttons = mouse.u.data.buttons;
-	string[0] = ESC; /* Our termcode */
+	string[0] = ESC; // Our termcode
 	string[1] = 'M';
 	string[2] = 'S';
 	if (oldbuttons == buttons && buttons != 0)
@@ -7302,7 +7300,7 @@
     }
     return;
 }
-#endif /* FEAT_SYSMOUSE */
+#endif // FEAT_SYSMOUSE
 
 #if defined(FEAT_LIBCALL) || defined(PROTO)
 typedef char_u * (*STRPROCSTR)(char_u *);
@@ -7318,9 +7316,9 @@
 mch_libcall(
     char_u	*libname,
     char_u	*funcname,
-    char_u	*argstring,	/* NULL when using a argint */
+    char_u	*argstring,	// NULL when using a argint
     int		argint,
-    char_u	**string_result,/* NULL when using number_result */
+    char_u	**string_result, // NULL when using number_result
     int		*number_result)
 {
 # if defined(USE_DLOPEN)
@@ -7339,7 +7337,7 @@
      * Get a handle to the DLL module.
      */
 # if defined(USE_DLOPEN)
-    /* First clear any error, it's not cleared by the dlopen() call. */
+    // First clear any error, it's not cleared by the dlopen() call.
     (void)dlerror();
 
     hinstLib = dlopen((char *)libname, RTLD_LAZY
@@ -7349,7 +7347,7 @@
 	    );
     if (hinstLib == NULL)
     {
-	/* "dlerr" must be used before dlclose() */
+	// "dlerr" must be used before dlclose()
 	dlerr = (char *)dlerror();
 	if (dlerr != NULL)
 	    semsg(_("dlerror = \"%s\""), dlerr);
@@ -7358,7 +7356,7 @@
     hinstLib = shl_load((const char*)libname, BIND_IMMEDIATE|BIND_VERBOSE, 0L);
 # endif
 
-    /* If the handle is valid, try to get the function address. */
+    // If the handle is valid, try to get the function address.
     if (hinstLib != NULL)
     {
 # ifdef USING_SETJMP
@@ -7426,8 +7424,8 @@
 		}
 	    }
 
-	    /* Save the string before we free the library. */
-	    /* Assume that a "1" or "-1" result is an illegal pointer. */
+	    // Save the string before we free the library.
+	    // Assume that a "1" or "-1" result is an illegal pointer.
 	    if (string_result == NULL)
 		*number_result = retval_int;
 	    else if (retval_str != NULL
@@ -7443,7 +7441,7 @@
 	{
 	    int i;
 
-	    /* try to find the name of this signal */
+	    // try to find the name of this signal
 	    for (i = 0; signal_info[i].sig != -1; i++)
 		if (lc_signal == signal_info[i].sig)
 		    break;
@@ -7453,11 +7451,11 @@
 # endif
 
 # if defined(USE_DLOPEN)
-	/* "dlerr" must be used before dlclose() */
+	// "dlerr" must be used before dlclose()
 	if (dlerr != NULL)
 	    semsg(_("dlerror = \"%s\""), dlerr);
 
-	/* Free the DLL module. */
+	// Free the DLL module.
 	(void)dlclose(hinstLib);
 # else
 	(void)shl_unload(hinstLib);
@@ -7475,7 +7473,7 @@
 #endif
 
 #if (defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)) || defined(PROTO)
-static int	xterm_trace = -1;	/* default: disabled */
+static int	xterm_trace = -1;	// default: disabled
 static int	xterm_button;
 
 /*
@@ -7505,11 +7503,11 @@
 	    ELAPSED_INIT(start_tv);
 # endif
 
-	/* Ignore X errors while opening the display */
+	// Ignore X errors while opening the display
 	oldhandler = XSetErrorHandler(x_error_check);
 
 # if defined(USING_SETJMP)
-	/* Ignore X IO errors while opening the display */
+	// Ignore X IO errors while opening the display
 	oldIOhandler = XSetIOErrorHandler(x_IOerror_check);
 	mch_startjmp();
 	if (SETJMP(lc_jump_env) != 0)
@@ -7530,10 +7528,10 @@
 	}
 
 # if defined(USING_SETJMP)
-	/* Now handle X IO errors normally. */
+	// Now handle X IO errors normally.
 	(void)XSetIOErrorHandler(oldIOhandler);
 # endif
-	/* Now handle X errors normally. */
+	// Now handle X errors normally.
 	(void)XSetErrorHandler(oldhandler);
 
 	if (xterm_dpy == NULL)
@@ -7543,7 +7541,7 @@
 	    return;
 	}
 
-	/* Catch terminating error of the X server connection. */
+	// Catch terminating error of the X server connection.
 	(void)XSetIOErrorHandler(x_IOerror_handler);
 
 # ifdef ELAPSED_FUNC
@@ -7555,7 +7553,7 @@
 	}
 # endif
 
-	/* Create a Shell to make converters work. */
+	// Create a Shell to make converters work.
 	AppShell = XtVaAppCreateShell("vim_xterm", "Vim_xterm",
 		applicationShellWidgetClass, xterm_dpy,
 		NULL);
@@ -7584,7 +7582,7 @@
 	clip_init(TRUE);
 	if (x11_window == 0 && (strp = getenv("WINDOWID")) != NULL)
 	    x11_window = (Window)atol(strp);
-	/* Check if $WINDOWID is valid. */
+	// Check if $WINDOWID is valid.
 	if (test_x11_window(xterm_dpy) == FAIL)
 	    x11_window = 0;
 	if (x11_window != 0)
@@ -7636,25 +7634,25 @@
 
     if (xterm_trace == 1)
     {
-	/* Get the hints just before tracking starts.  The font size might
-	 * have changed recently. */
+	// Get the hints just before tracking starts.  The font size might
+	// have changed recently.
 	if (!XGetWMNormalHints(xterm_dpy, x11_window, &xterm_hints, &got_hints)
 		|| !(got_hints & PResizeInc)
 		|| xterm_hints.width_inc <= 1
 		|| xterm_hints.height_inc <= 1)
 	{
-	    xterm_trace = -1;  /* Not enough data -- disable tracing */
+	    xterm_trace = -1;  // Not enough data -- disable tracing
 	    return FALSE;
 	}
 
-	/* Rely on the same mouse code for the duration of this */
+	// Rely on the same mouse code for the duration of this
 	mouse_code = find_termcode(mouse_name);
 	prev_row = mouse_row;
 	prev_col = mouse_col;
 	xterm_trace = 2;
 
-	/* Find the offset of the chars, there might be a scrollbar on the
-	 * left of the window and/or a menu on the top (eterm etc.) */
+	// Find the offset of the chars, there might be a scrollbar on the
+	// left of the window and/or a menu on the top (eterm etc.)
 	XQueryPointer(xterm_dpy, x11_window, &root, &child, &root_x, &root_y,
 		      &win_x, &win_y, &mask_return);
 	xterm_hints.y = win_y - (xterm_hints.height_inc * mouse_row)
@@ -7709,7 +7707,7 @@
     if (xterm_dpy != NULL)
     {
 #  if 0
-	/* Lesstif and Solaris crash here, lose some memory */
+	// Lesstif and Solaris crash here, lose some memory
 	XtCloseDisplay(xterm_dpy);
 #  endif
 	if (x11_display == xterm_dpy)
@@ -7719,7 +7717,7 @@
 #  if 0
     if (app_context != (XtAppContext)NULL)
     {
-	/* Lesstif and Solaris crash here, lose some memory */
+	// Lesstif and Solaris crash here, lose some memory
 	XtDestroyApplicationContext(app_context);
 	app_context = (XtAppContext)NULL;
     }
@@ -7762,7 +7760,7 @@
 
 	if (mask & XtIMXEvent)
 	{
-	    /* There is an event to process. */
+	    // There is an event to process.
 	    XtAppNextEvent(app_context, &event);
 #ifdef FEAT_CLIENTSERVER
 	    {
@@ -7777,7 +7775,7 @@
 	}
 	else
 	{
-	    /* There is something else than an event to process. */
+	    // There is something else than an event to process.
 	    XtAppProcessEvent(app_context, mask);
 	}
     }
@@ -7832,20 +7830,19 @@
     save_cmdmod = cmdmod;
     cmdmod.confirm = TRUE;
     if (check_changed_any(FALSE, FALSE))
-	/* Mustn't logout */
+	// Mustn't logout
 	cancel_shutdown = True;
     cmdmod = save_cmdmod;
-    setcursor();		/* position cursor */
+    setcursor();		// position cursor
     out_flush();
 
-    /* Done interaction */
+    // Done interaction
     SmcInteractDone(smc_conn, cancel_shutdown);
 
-    /* Finish off
-     * Only end save-yourself here if we're not cancelling shutdown;
-     * we'll get a cancelled callback later in which we'll end it.
-     * Hopefully get around glitchy SMs (like GNOME-1)
-     */
+    // Finish off
+    // Only end save-yourself here if we're not cancelling shutdown;
+    // we'll get a cancelled callback later in which we'll end it.
+    // Hopefully get around glitchy SMs (like GNOME-1)
     if (!cancel_shutdown)
     {
 	xsmp.save_yourself = False;
@@ -7866,29 +7863,29 @@
     int		interact_style UNUSED,
     Bool	fast UNUSED)
 {
-    /* Handle already being in saveyourself */
+    // Handle already being in saveyourself
     if (xsmp.save_yourself)
 	SmcSaveYourselfDone(smc_conn, True);
     xsmp.save_yourself = True;
     xsmp.shutdown = shutdown;
 
-    /* First up, preserve all files */
+    // First up, preserve all files
     out_flush();
-    ml_sync_all(FALSE, FALSE);	/* preserve all swap files */
+    ml_sync_all(FALSE, FALSE);	// preserve all swap files
 
     if (p_verbose > 0)
 	verb_msg(_("XSMP handling save-yourself request"));
 
 # if defined(FEAT_GUI) && defined(USE_XSMP_INTERACT)
-    /* Now see if we can ask about unsaved files */
+    // Now see if we can ask about unsaved files
     if (shutdown && !fast && gui.in_use)
-	/* Need to interact with user, but need SM's permission */
+	// Need to interact with user, but need SM's permission
 	SmcInteractRequest(smc_conn, SmDialogError,
 					xsmp_handle_interaction, client_data);
     else
 # endif
     {
-	/* Can stop the cycle here */
+	// Can stop the cycle here
 	SmcSaveYourselfDone(smc_conn, True);
 	xsmp.save_yourself = False;
     }
@@ -7903,7 +7900,7 @@
 {
     xsmp_close();
 
-    /* quit quickly leaving swapfiles for modified buffers behind */
+    // quit quickly leaving swapfiles for modified buffers behind
     getout_preserve_modified(0);
 }
 
@@ -7946,7 +7943,7 @@
     Bool	opening,
     IcePointer	*watchData UNUSED)
 {
-    /* Intercept creation of ICE connection fd */
+    // Intercept creation of ICE connection fd
     if (opening)
     {
 	xsmp_icefd = IceConnectionNumber(iceConn);
@@ -7955,7 +7952,7 @@
 }
 
 
-/* Handle any ICE processing that's required; return FAIL if SM lost */
+// Handle any ICE processing that's required; return FAIL if SM lost
     int
 xsmp_handle_requests(void)
 {
@@ -7964,7 +7961,7 @@
     if (IceProcessMessages(xsmp.iceconn, NULL, &rep)
 						 == IceProcessMessagesIOError)
     {
-	/* Lost ICE */
+	// Lost ICE
 	if (p_verbose > 0)
 	    verb_msg(_("XSMP lost ICE connection"));
 	xsmp_close();
@@ -7976,7 +7973,7 @@
 
 static int dummy;
 
-/* Set up X Session Management Protocol */
+// Set up X Session Management Protocol
     void
 xsmp_init(void)
 {
@@ -7993,7 +7990,7 @@
 
     xsmp.save_yourself = xsmp.shutdown = False;
 
-    /* Set up SM callbacks - must have all, even if they're not used */
+    // Set up SM callbacks - must have all, even if they're not used
     smcallbacks.save_yourself.callback = xsmp_handle_save_yourself;
     smcallbacks.save_yourself.client_data = NULL;
     smcallbacks.die.callback = xsmp_die;
@@ -8003,8 +8000,8 @@
     smcallbacks.shutdown_cancelled.callback = xsmp_shutdown_cancelled;
     smcallbacks.shutdown_cancelled.client_data = NULL;
 
-    /* Set up a watch on ICE connection creations.  The "dummy" argument is
-     * apparently required for FreeBSD (we get a BUS error when using NULL). */
+    // Set up a watch on ICE connection creations.  The "dummy" argument is
+    // apparently required for FreeBSD (we get a BUS error when using NULL).
     if (IceAddConnectionWatch(xsmp_ice_connection, &dummy) == 0)
     {
 	if (p_verbose > 0)
@@ -8012,7 +8009,7 @@
 	return;
     }
 
-    /* Create an SM connection */
+    // Create an SM connection
     xsmp.smcconn = SmcOpenConnection(
 	    NULL,
 	    NULL,
@@ -8040,7 +8037,7 @@
     xsmp.iceconn = SmcGetIceConnection(xsmp.smcconn);
 
 #if 0
-    /* ID ourselves */
+    // ID ourselves
     smname.value = "vim";
     smname.length = 3;
     smnameprop.name = "SmProgram";
@@ -8054,7 +8051,7 @@
 }
 
 
-/* Shut down XSMP comms. */
+// Shut down XSMP comms.
     void
 xsmp_close(void)
 {
@@ -8067,11 +8064,11 @@
 	xsmp_icefd = -1;
     }
 }
-#endif /* USE_XSMP */
+#endif // USE_XSMP
 
 
 #ifdef EBCDIC
-/* Translate character to its CTRL- value */
+// Translate character to its CTRL- value
 char CtrlTable[] =
 {
 /* 00 - 5E */
@@ -8160,7 +8157,7 @@
 };
 
 char MetaCharTable[]=
-{/*   0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F */
+{//   0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
       0,  0,  0,  0,'\\', 0,'F',  0,'W','M','N',  0,  0,  0,  0,  0,
       0,  0,  0,  0,']',  0,  0,'G',  0,  0,'R','O',  0,  0,  0,  0,
     '@','A','B','C','D','E',  0,  0,'H','I','J','K','L',  0,  0,  0,
@@ -8168,9 +8165,9 @@
 };
 
 
-/* TODO: Use characters NOT numbers!!! */
+// TODO: Use characters NOT numbers!!!
 char CtrlCharTable[]=
-{/*   0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F */
+{//   0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
     124,193,194,195,  0,201,  0,  0,  0,  0,  0,210,211,212,213,214,
     215,216,217,226,  0,209,200,  0,231,232,  0,  0,224,189, 95,109,
       0,  0,  0,  0,  0,  0,230,173,  0,  0,  0,  0,  0,197,198,199,
