diff --git a/src/fileio.c b/src/fileio.c
index dfe1ef9..aa84e9b 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -27,11 +27,9 @@
 /* Is there any system that doesn't have access()? */
 #define USE_MCH_ACCESS
 
-#ifdef FEAT_MBYTE
 static char_u *next_fenc(char_u **pp);
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 static char_u *readfile_charconvert(char_u *fname, char_u *fenc, int *fdp);
-# endif
 #endif
 #ifdef FEAT_VIMINFO
 static void check_marks_read(void);
@@ -47,31 +45,29 @@
 static int apply_autocmds_exarg(event_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, exarg_T *eap);
 static int au_find_group(char_u *name);
 
-# define AUGROUP_DEFAULT    -1	    /* default autocmd group */
-# define AUGROUP_ERROR	    -2	    /* erroneous autocmd group */
-# define AUGROUP_ALL	    -3	    /* all autocmd groups */
+#define AUGROUP_DEFAULT    -1	    /* default autocmd group */
+#define AUGROUP_ERROR	    -2	    /* erroneous autocmd group */
+#define AUGROUP_ALL	    -3	    /* all autocmd groups */
 
-#if defined(FEAT_CRYPT) || defined(FEAT_MBYTE)
-# define HAS_BW_FLAGS
-# define FIO_LATIN1	0x01	/* convert Latin1 */
-# define FIO_UTF8	0x02	/* convert UTF-8 */
-# define FIO_UCS2	0x04	/* convert UCS-2 */
-# define FIO_UCS4	0x08	/* convert UCS-4 */
-# define FIO_UTF16	0x10	/* convert UTF-16 */
-# ifdef WIN3264
-#  define FIO_CODEPAGE	0x20	/* convert MS-Windows codepage */
-#  define FIO_PUT_CP(x) (((x) & 0xffff) << 16)	/* put codepage in top word */
-#  define FIO_GET_CP(x)	(((x)>>16) & 0xffff)	/* get codepage from top word */
-# endif
-# ifdef MACOS_CONVERT
-#  define FIO_MACROMAN	0x20	/* convert MacRoman */
-# endif
-# define FIO_ENDIAN_L	0x80	/* little endian */
-# define FIO_ENCRYPTED	0x1000	/* encrypt written bytes */
-# define FIO_NOCONVERT	0x2000	/* skip encoding conversion */
-# define FIO_UCSBOM	0x4000	/* check for BOM at start of file */
-# define FIO_ALL	-1	/* allow all formats */
+#define HAS_BW_FLAGS
+#define FIO_LATIN1	0x01	/* convert Latin1 */
+#define FIO_UTF8	0x02	/* convert UTF-8 */
+#define FIO_UCS2	0x04	/* convert UCS-2 */
+#define FIO_UCS4	0x08	/* convert UCS-4 */
+#define FIO_UTF16	0x10	/* convert UTF-16 */
+#ifdef WIN3264
+# define FIO_CODEPAGE	0x20	/* convert MS-Windows codepage */
+# define FIO_PUT_CP(x) (((x) & 0xffff) << 16)	/* put codepage in top word */
+# define FIO_GET_CP(x)	(((x)>>16) & 0xffff)	/* get codepage from top word */
 #endif
+#ifdef MACOS_CONVERT
+# define FIO_MACROMAN	0x20	/* convert MacRoman */
+#endif
+#define FIO_ENDIAN_L	0x80	/* little endian */
+#define FIO_ENCRYPTED	0x1000	/* encrypt written bytes */
+#define FIO_NOCONVERT	0x2000	/* skip encoding conversion */
+#define FIO_UCSBOM	0x4000	/* check for BOM at start of file */
+#define FIO_ALL	-1	/* allow all formats */
 
 /* When converting, a read() or write() may leave some bytes to be converted
  * for the next call.  The value is guessed... */
@@ -95,7 +91,6 @@
 #ifdef FEAT_CRYPT
     buf_T	*bw_buffer;	/* buffer being written */
 #endif
-#ifdef FEAT_MBYTE
     char_u	bw_rest[CONV_RESTLEN]; /* not converted bytes */
     int		bw_restlen;	/* nr of bytes in bw_rest[] */
     int		bw_first;	/* first write call */
@@ -104,27 +99,24 @@
     int		bw_conv_error;	/* set for conversion error */
     linenr_T	bw_conv_error_lnum;  /* first line with error or zero */
     linenr_T	bw_start_lnum;  /* line number at start of buffer */
-# ifdef USE_ICONV
+#ifdef USE_ICONV
     iconv_t	bw_iconv_fd;	/* descriptor for iconv() or -1 */
-# endif
 #endif
 };
 
 static int  buf_write_bytes(struct bw_info *ip);
 
-#ifdef FEAT_MBYTE
 static linenr_T readfile_linenr(linenr_T linecnt, char_u *p, char_u *endp);
 static int ucs2bytes(unsigned c, char_u **pp, int flags);
 static int need_conversion(char_u *fenc);
 static int get_fio_flags(char_u *ptr);
 static char_u *check_for_bom(char_u *p, long size, int *lenp, int flags);
 static int make_bom(char_u *buf, char_u *name);
-# ifdef WIN3264
+#ifdef WIN3264
 static int get_win_fio_flags(char_u *ptr);
-# endif
-# ifdef MACOS_CONVERT
+#endif
+#ifdef MACOS_CONVERT
 static int get_mac_fio_flags(char_u *ptr);
-# endif
 #endif
 static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
 
@@ -265,7 +257,6 @@
     int		try_dos;
     int		try_unix;
     int		file_rewind = FALSE;
-#ifdef FEAT_MBYTE
     int		can_retry;
     linenr_T	conv_error = 0;		/* line nr with conversion error */
     linenr_T	illegal_byte = 0;	/* line nr with illegal byte */
@@ -281,19 +272,18 @@
     char_u	*fenc_next = NULL;	/* next item in 'fencs' or NULL */
     int		advance_fenc = FALSE;
     long	real_size = 0;
-# ifdef USE_ICONV
+#ifdef USE_ICONV
     iconv_t	iconv_fd = (iconv_t)-1;	/* descriptor for iconv() or -1 */
-#  ifdef FEAT_EVAL
+# ifdef FEAT_EVAL
     int		did_iconv = FALSE;	/* TRUE when iconv() failed and trying
 					   'charconvert' next */
-#  endif
 # endif
+#endif
     int		converted = FALSE;	/* TRUE if conversion done */
     int		notconverted = FALSE;	/* TRUE if conversion wanted but it
 					   wasn't possible */
     char_u	conv_rest[CONV_RESTLEN];
     int		conv_restlen = 0;	/* nr of bytes in conv_rest[] */
-#endif
     buf_T	*old_curbuf;
     char_u	*old_b_ffname;
     char_u	*old_b_fname;
@@ -609,11 +599,9 @@
 		     * edited before and deleted.  Get the old marks. */
 		    check_marks_read();
 #endif
-#ifdef FEAT_MBYTE
 		    /* Set forced 'fileencoding'.  */
 		    if (eap != NULL)
 			set_forced_fenc(eap);
-#endif
 		    apply_autocmds_exarg(EVENT_BUFNEWFILE, sfname, sfname,
 							  FALSE, curbuf, eap);
 		    /* remember the current fileformat */
@@ -658,10 +646,8 @@
 	    curbuf->b_p_eol = TRUE;
 	    curbuf->b_start_eol = TRUE;
 	}
-#ifdef FEAT_MBYTE
 	curbuf->b_p_bomb = FALSE;
 	curbuf->b_start_bomb = FALSE;
-#endif
     }
 
     /* Create a swap file now, so that other Vims are warned that we are
@@ -846,7 +832,6 @@
      */
     linecnt = curbuf->b_ml.ml_line_count;
 
-#ifdef FEAT_MBYTE
     /* "++bad=" argument. */
     if (eap != NULL && eap->bad_char != 0)
     {
@@ -926,7 +911,6 @@
 	fenc = next_fenc(&fenc_next);
 	fenc_alloced = TRUE;
     }
-#endif
 
     /*
      * Jump back here to retry reading the file in different ways.
@@ -966,14 +950,12 @@
 	while (lnum > from)
 	    ml_delete(lnum--, FALSE);
 	file_rewind = FALSE;
-#ifdef FEAT_MBYTE
 	if (set_options)
 	{
 	    curbuf->b_p_bomb = FALSE;
 	    curbuf->b_start_bomb = FALSE;
 	}
 	conv_error = 0;
-#endif
     }
 
     /*
@@ -997,15 +979,14 @@
 	    fileformat = EOL_UNKNOWN;		/* detect from file */
     }
 
-#ifdef FEAT_MBYTE
-# ifdef USE_ICONV
+#ifdef USE_ICONV
     if (iconv_fd != (iconv_t)-1)
     {
 	/* aborted conversion with iconv(), close the descriptor */
 	iconv_close(iconv_fd);
 	iconv_fd = (iconv_t)-1;
     }
-# endif
+#endif
 
     if (advance_fenc)
     {
@@ -1073,49 +1054,49 @@
 	else if (enc_utf8 || STRCMP(p_enc, "latin1") == 0)
 	    fio_flags = get_fio_flags(fenc);
 
-# ifdef WIN3264
+#ifdef WIN3264
 	/*
 	 * Conversion from an MS-Windows codepage to UTF-8 or another codepage
 	 * is handled with MultiByteToWideChar().
 	 */
 	if (fio_flags == 0)
 	    fio_flags = get_win_fio_flags(fenc);
-# endif
+#endif
 
-# ifdef MACOS_CONVERT
+#ifdef MACOS_CONVERT
 	/* Conversion from Apple MacRoman to latin1 or UTF-8 */
 	if (fio_flags == 0)
 	    fio_flags = get_mac_fio_flags(fenc);
-# endif
+#endif
 
-# ifdef USE_ICONV
+#ifdef USE_ICONV
 	/*
 	 * Try using iconv() if we can't convert internally.
 	 */
 	if (fio_flags == 0
-#  ifdef FEAT_EVAL
+# ifdef FEAT_EVAL
 		&& !did_iconv
-#  endif
+# endif
 		)
 	    iconv_fd = (iconv_t)my_iconv_open(
 				  enc_utf8 ? (char_u *)"utf-8" : p_enc, fenc);
-# endif
+#endif
 
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	/*
 	 * Use the 'charconvert' expression when conversion is required
 	 * and we can't do it internally or with iconv().
 	 */
 	if (fio_flags == 0 && !read_stdin && !read_buffer && *p_ccv != NUL
 						    && !read_fifo
-#  ifdef USE_ICONV
+# ifdef USE_ICONV
 						    && iconv_fd == (iconv_t)-1
-#  endif
+# endif
 		)
 	{
-#  ifdef USE_ICONV
+# ifdef USE_ICONV
 	    did_iconv = FALSE;
-#  endif
+# endif
 	    /* Skip conversion when it's already done (retry for wrong
 	     * "fileformat"). */
 	    if (tmpname == NULL)
@@ -1137,12 +1118,12 @@
 	    }
 	}
 	else
-# endif
+#endif
 	{
 	    if (fio_flags == 0
-# ifdef USE_ICONV
+#ifdef USE_ICONV
 		    && iconv_fd == (iconv_t)-1
-# endif
+#endif
 	       )
 	    {
 		/* Conversion wanted but we can't.
@@ -1157,7 +1138,6 @@
      * another "fenc" value.  It's FALSE when no other "fenc" to try, reading
      * stdin or fixed at a specific encoding. */
     can_retry = (*fenc != NUL && !read_stdin && !read_fifo && !keep_dest_enc);
-#endif
 
     if (!skip_read)
     {
@@ -1165,9 +1145,7 @@
 	filesize = 0;
 	skip_count = lines_to_skip;
 	read_count = lines_to_read;
-#ifdef FEAT_MBYTE
 	conv_restlen = 0;
-#endif
 #ifdef FEAT_PERSISTENT_UNDO
 	read_undo_file = (newfile && (flags & READ_KEEP_UNDO) == 0
 				  && curbuf->b_ffname != NULL
@@ -1253,7 +1231,6 @@
 		ptr = buffer + linerest;
 		line_start = buffer;
 
-#ifdef FEAT_MBYTE
 		/* May need room to translate into.
 		 * For iconv() we don't really know the required space, use a
 		 * factor ICONV_MULT.
@@ -1265,11 +1242,11 @@
 		 * ucs-4 to utf-8: 4 bytes become up to 6 bytes, size must be
 		 * multiple of 4 */
 		real_size = (int)size;
-# ifdef USE_ICONV
+#ifdef USE_ICONV
 		if (iconv_fd != (iconv_t)-1)
 		    size = size / ICONV_MULT;
 		else
-# endif
+#endif
 		    if (fio_flags & FIO_LATIN1)
 		    size = size / 2;
 		else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
@@ -1278,17 +1255,15 @@
 		    size = (size * 2 / 3) & ~3;
 		else if (fio_flags == FIO_UCSBOM)
 		    size = size / ICONV_MULT;	/* worst case */
-# ifdef WIN3264
+#ifdef WIN3264
 		else if (fio_flags & FIO_CODEPAGE)
 		    size = size / ICONV_MULT;	/* also worst case */
-# endif
-# ifdef MACOS_CONVERT
+#endif
+#ifdef MACOS_CONVERT
 		else if (fio_flags & FIO_MACROMAN)
 		    size = size / ICONV_MULT;	/* also worst case */
-# endif
 #endif
 
-#ifdef FEAT_MBYTE
 		if (conv_restlen > 0)
 		{
 		    /* Insert unconverted bytes from previous line. */
@@ -1296,7 +1271,6 @@
 		    ptr += conv_restlen;
 		    size -= conv_restlen;
 		}
-#endif
 
 		if (read_buffer)
 		{
@@ -1445,7 +1419,6 @@
 		{
 		    if (size < 0)		    /* read error */
 			error = TRUE;
-#ifdef FEAT_MBYTE
 		    else if (conv_restlen > 0)
 		    {
 			/*
@@ -1455,9 +1428,9 @@
 
 			/* When we did a conversion report an error. */
 			if (fio_flags != 0
-# ifdef USE_ICONV
+#ifdef USE_ICONV
 				|| iconv_fd != (iconv_t)-1
-# endif
+#endif
 			   )
 			{
 			    if (can_retry)
@@ -1482,9 +1455,9 @@
 			     * leave the UTF8 checking code to do it, as it
 			     * works slightly differently. */
 			    if (bad_char_behavior != BAD_KEEP && (fio_flags != 0
-# ifdef USE_ICONV
+#ifdef USE_ICONV
 				    || iconv_fd != (iconv_t)-1
-# endif
+#endif
 			       ))
 			    {
 				while (conv_restlen > 0)
@@ -1494,21 +1467,19 @@
 				}
 			    }
 			    fio_flags = 0;	/* don't convert this */
-# ifdef USE_ICONV
+#ifdef USE_ICONV
 			    if (iconv_fd != (iconv_t)-1)
 			    {
 				iconv_close(iconv_fd);
 				iconv_fd = (iconv_t)-1;
 			    }
-# endif
+#endif
 			}
 		    }
-#endif
 		}
 	    }
 	    skip_read = FALSE;
 
-#ifdef FEAT_MBYTE
 	    /*
 	     * At start of file (or after crypt magic number): Check for BOM.
 	     * Also check for a BOM for other Unicode encodings, but not after
@@ -1516,11 +1487,11 @@
 	     * found.
 	     */
 	    if ((filesize == 0
-# ifdef FEAT_CRYPT
+#ifdef FEAT_CRYPT
 		   || (cryptkey != NULL
 			&& filesize == crypt_get_header_len(
 						 crypt_get_method_nr(curbuf)))
-# endif
+#endif
 		       )
 		    && (fio_flags == FIO_UCSBOM
 			|| (!curbuf->b_p_bomb
@@ -1574,16 +1545,14 @@
 	    ptr -= conv_restlen;
 	    size += conv_restlen;
 	    conv_restlen = 0;
-#endif
 	    /*
 	     * Break here for a read error or end-of-file.
 	     */
 	    if (size <= 0)
 		break;
 
-#ifdef FEAT_MBYTE
 
-# ifdef USE_ICONV
+#ifdef USE_ICONV
 	    if (iconv_fd != (iconv_t)-1)
 	    {
 		/*
@@ -1645,9 +1614,9 @@
 		mch_memmove(line_start, buffer, (size_t)linerest);
 		size = (long)((char_u *)top - ptr);
 	    }
-# endif
+#endif
 
-# ifdef WIN3264
+#ifdef WIN3264
 	    if (fio_flags & FIO_CODEPAGE)
 	    {
 		char_u	*src, *dst;
@@ -1813,8 +1782,8 @@
 		size = (long)(dst - ptr);
 	    }
 	    else
-# endif
-# ifdef MACOS_CONVERT
+#endif
+#ifdef MACOS_CONVERT
 	    if (fio_flags & FIO_MACROMAN)
 	    {
 		/*
@@ -1825,7 +1794,7 @@
 		    goto rewind_retry;
 	    }
 	    else
-# endif
+#endif
 	    if (fio_flags != 0)
 	    {
 		int	u8c;
@@ -2089,11 +2058,11 @@
 			     * file is more likely than a conversion error. */
 			    if (can_retry && !incomplete_tail)
 				break;
-# ifdef USE_ICONV
+#ifdef USE_ICONV
 			    /* When we did a conversion report an error. */
 			    if (iconv_fd != (iconv_t)-1 && conv_error == 0)
 				conv_error = readfile_linenr(linecnt, ptr, p);
-# endif
+#endif
 			    /* Remember the first linenr with an illegal byte */
 			    if (conv_error == 0 && illegal_byte == 0)
 				illegal_byte = readfile_linenr(linecnt, ptr, p);
@@ -2117,19 +2086,18 @@
 		    /* Detected a UTF-8 error. */
 rewind_retry:
 		    /* Retry reading with another conversion. */
-# if defined(FEAT_EVAL) && defined(USE_ICONV)
+#if defined(FEAT_EVAL) && defined(USE_ICONV)
 		    if (*p_ccv != NUL && iconv_fd != (iconv_t)-1)
 			/* iconv() failed, try 'charconvert' */
 			did_iconv = TRUE;
 		    else
-# endif
+#endif
 			/* use next item from 'fileencodings' */
 			advance_fenc = TRUE;
 		    file_rewind = TRUE;
 		    goto retry;
 		}
 	    }
-#endif
 
 	    /* count the number of characters (after conversion!) */
 	    filesize += size;
@@ -2371,7 +2339,6 @@
      * encryption was used. */
 #endif
 
-#ifdef FEAT_MBYTE
     /* If editing a new file: set 'fenc' for the current buffer.
      * Also for ":read ++edit file". */
     if (set_options)
@@ -2379,13 +2346,12 @@
 						       OPT_FREE|OPT_LOCAL, 0);
     if (fenc_alloced)
 	vim_free(fenc);
-# ifdef USE_ICONV
+#ifdef USE_ICONV
     if (iconv_fd != (iconv_t)-1)
     {
 	iconv_close(iconv_fd);
 	iconv_fd = (iconv_t)-1;
     }
-# endif
 #endif
 
     if (!read_buffer && !read_stdin)
@@ -2409,13 +2375,11 @@
     }
 #endif
 
-#ifdef FEAT_MBYTE
     if (tmpname != NULL)
     {
 	mch_remove(tmpname);		/* delete converted file */
 	vim_free(tmpname);
     }
-#endif
     --no_wait_return;			/* may wait for return now */
 
     /*
@@ -2528,7 +2492,6 @@
 		STRCAT(IObuff, _("[long lines split]"));
 		c = TRUE;
 	    }
-#ifdef FEAT_MBYTE
 	    if (notconverted)
 	    {
 		STRCAT(IObuff, _("[NOT converted]"));
@@ -2539,7 +2502,6 @@
 		STRCAT(IObuff, _("[converted]"));
 		c = TRUE;
 	    }
-#endif
 #ifdef FEAT_CRYPT
 	    if (cryptkey != NULL)
 	    {
@@ -2547,7 +2509,6 @@
 		c = TRUE;
 	    }
 #endif
-#ifdef FEAT_MBYTE
 	    if (conv_error != 0)
 	    {
 		sprintf((char *)IObuff + STRLEN(IObuff),
@@ -2560,9 +2521,7 @@
 			 _("[ILLEGAL BYTE in line %ld]"), (long)illegal_byte);
 		c = TRUE;
 	    }
-	    else
-#endif
-		if (error)
+	    else if (error)
 	    {
 		STRCAT(IObuff, _("[READ ERRORS]"));
 		c = TRUE;
@@ -2601,11 +2560,8 @@
 
 	/* with errors writing the file requires ":w!" */
 	if (newfile && (error
-#ifdef FEAT_MBYTE
 		    || conv_error != 0
-		    || (illegal_byte > 0 && bad_char_behavior != BAD_KEEP)
-#endif
-		    ))
+		    || (illegal_byte > 0 && bad_char_behavior != BAD_KEEP)))
 	    curbuf->b_p_ro = TRUE;
 
 	u_clearline();	    /* cannot use "U" command after adding lines */
@@ -2745,8 +2701,6 @@
 }
 #endif
 
-#ifdef FEAT_MBYTE
-
 /*
  * From the current line count and characters read after that, estimate the
  * line number where we are now.
@@ -2767,7 +2721,6 @@
 	    ++lnum;
     return lnum;
 }
-#endif
 
 /*
  * Fill "*eap" to force the 'fileencoding', 'fileformat' and 'binary to be
@@ -2777,21 +2730,13 @@
     int
 prep_exarg(exarg_T *eap, buf_T *buf)
 {
-    eap->cmd = alloc(15
-#ifdef FEAT_MBYTE
-		+ (unsigned)STRLEN(buf->b_p_fenc)
-#endif
-	    );
+    eap->cmd = alloc(15 + (unsigned)STRLEN(buf->b_p_fenc));
     if (eap->cmd == NULL)
 	return FAIL;
 
-#ifdef FEAT_MBYTE
     sprintf((char *)eap->cmd, "e ++enc=%s", buf->b_p_fenc);
     eap->force_enc = 8;
     eap->bad_char = buf->b_bad_char;
-#else
-    sprintf((char *)eap->cmd, "e");
-#endif
     eap->force_ff = *buf->b_p_ff;
 
     eap->force_bin = buf->b_p_bin ? FORCE_BIN : FORCE_NOBIN;
@@ -2825,7 +2770,6 @@
     }
 }
 
-#if defined(FEAT_MBYTE) || defined(PROTO)
 /*
  * Set forced 'fileencoding'.
  */
@@ -2886,7 +2830,7 @@
     return r;
 }
 
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 /*
  * Convert a file with the 'charconvert' expression.
  * This closes the file which is to be read, converts it and opens the
@@ -2937,10 +2881,9 @@
 
     return tmpname;
 }
-# endif
-
 #endif
 
+
 #ifdef FEAT_VIMINFO
 /*
  * Read marks for the current buffer from the viminfo file, when we support
@@ -3176,12 +3119,10 @@
     int		    fileformat;
     int		    write_bin;
     struct bw_info  write_info;		/* info for buf_write_bytes() */
-#ifdef FEAT_MBYTE
     int		    converted = FALSE;
     int		    notconverted = FALSE;
     char_u	    *fenc;		/* effective 'fileencoding' */
     char_u	    *fenc_tofree = NULL; /* allocated "fenc" */
-#endif
 #ifdef HAS_BW_FLAGS
     int		    wb_flags = 0;
 #endif
@@ -3219,15 +3160,13 @@
 	return FAIL;
     }
 
-#ifdef FEAT_MBYTE
     /* must init bw_conv_buf and bw_iconv_fd before jumping to "fail" */
     write_info.bw_conv_buf = NULL;
     write_info.bw_conv_error = FALSE;
     write_info.bw_conv_error_lnum = 0;
     write_info.bw_restlen = 0;
-# ifdef USE_ICONV
+#ifdef USE_ICONV
     write_info.bw_iconv_fd = (iconv_t)-1;
-# endif
 #endif
 #ifdef FEAT_CRYPT
     write_info.bw_buffer = buf;
@@ -4227,7 +4166,6 @@
      * multi-byte conversion. */
     wfname = fname;
 
-#ifdef FEAT_MBYTE
     /* Check for forced 'fileencoding' from "++opt=val" argument. */
     if (eap != NULL && eap->force_enc != 0)
     {
@@ -4265,7 +4203,7 @@
 	}
     }
 
-# ifdef WIN3264
+#ifdef WIN3264
     if (converted && wb_flags == 0 && (wb_flags = get_win_fio_flags(fenc)) != 0)
     {
 	/* Convert UTF-8 -> UCS-2 and UCS-2 -> DBCS.  Worst-case * 4: */
@@ -4275,9 +4213,9 @@
 	if (write_info.bw_conv_buf == NULL)
 	    end = 0;
     }
-# endif
+#endif
 
-# ifdef MACOS_CONVERT
+#ifdef MACOS_CONVERT
     if (converted && wb_flags == 0 && (wb_flags = get_mac_fio_flags(fenc)) != 0)
     {
 	write_info.bw_conv_buflen = bufsize * 3;
@@ -4286,12 +4224,12 @@
 	if (write_info.bw_conv_buf == NULL)
 	    end = 0;
     }
-# endif
+#endif
 
-# if defined(FEAT_EVAL) || defined(USE_ICONV)
+#if defined(FEAT_EVAL) || defined(USE_ICONV)
     if (converted && wb_flags == 0)
     {
-#  ifdef USE_ICONV
+# ifdef USE_ICONV
 	/*
 	 * Use iconv() conversion when conversion is needed and it's not done
 	 * internally.
@@ -4308,12 +4246,12 @@
 		end = 0;
 	    write_info.bw_first = TRUE;
 	}
-#   ifdef FEAT_EVAL
-	else
-#   endif
-#  endif
-
 #  ifdef FEAT_EVAL
+	else
+#  endif
+# endif
+
+# ifdef FEAT_EVAL
 	    /*
 	     * When the file needs to be converted with 'charconvert' after
 	     * writing, write to a temp file instead and let the conversion
@@ -4328,16 +4266,16 @@
 		    goto restore_backup;
 		}
 	    }
-#  endif
-    }
 # endif
+    }
+#endif
     if (converted && wb_flags == 0
-#  ifdef USE_ICONV
+#ifdef USE_ICONV
 	    && write_info.bw_iconv_fd == (iconv_t)-1
-#  endif
-#  ifdef FEAT_EVAL
+# endif
+# ifdef FEAT_EVAL
 	    && wfname == fname
-#  endif
+# endif
 	    )
     {
 	if (!forceit)
@@ -4347,7 +4285,6 @@
 	}
 	notconverted = TRUE;
     }
-#endif
 
     /*
      * If conversion is taking place, we may first pretend to write and check
@@ -4362,9 +4299,7 @@
 	 * - we make a backup file, that can be restored in case of conversion
 	 *   failure.
 	 */
-#ifdef FEAT_MBYTE
 	if (!converted || dobackup)
-#endif
 	    checking_conversion = FALSE;
 
 	if (checking_conversion)
@@ -4477,10 +4412,8 @@
 			end = 0;
 		}
 
-#ifdef FEAT_MBYTE
 		if (wfname != fname)
 		    vim_free(wfname);
-#endif
 		goto fail;
 	    }
 	    write_info.bw_fd = fd;
@@ -4563,7 +4496,6 @@
 	else
 	    write_bin = buf->b_p_bin;
 
-#ifdef FEAT_MBYTE
 	/*
 	 * The BOM is written just after the encryption magic number.
 	 * Skip it when appending and the file already existed, the BOM only
@@ -4583,7 +4515,6 @@
 	    }
 	}
 	write_info.bw_start_lnum = start;
-#endif
 
 #ifdef FEAT_PERSISTENT_UNDO
 	write_undo_file = (buf->b_p_udf
@@ -4635,9 +4566,7 @@
 		nchars += bufsize;
 		s = buffer;
 		len = 0;
-#ifdef FEAT_MBYTE
 		write_info.bw_start_lnum = lnum;
-#endif
 	    }
 	    /* write failed or last line has no EOL: stop here */
 	    if (end == 0
@@ -4841,7 +4770,7 @@
 	}
 #endif
 
-#if defined(FEAT_MBYTE) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	if (wfname != fname)
 	{
 	    /*
@@ -4870,7 +4799,6 @@
 	 */
 	if (errmsg == NULL)
 	{
-#ifdef FEAT_MBYTE
 	    if (write_info.bw_conv_error)
 	    {
 		if (write_info.bw_conv_error_lnum == 0)
@@ -4883,12 +4811,10 @@
 					 (long)write_info.bw_conv_error_lnum);
 		}
 	    }
+	    else if (got_int)
+		errmsg = (char_u *)_(e_interr);
 	    else
-#endif
-		if (got_int)
-		    errmsg = (char_u *)_(e_interr);
-		else
-		    errmsg = (char_u *)_("E514: write error (file system full?)");
+		errmsg = (char_u *)_("E514: write error (file system full?)");
 	}
 
 	/*
@@ -4953,7 +4879,6 @@
     {
 	msg_add_fname(buf, fname);	/* put fname in IObuff with quotes */
 	c = FALSE;
-#ifdef FEAT_MBYTE
 	if (write_info.bw_conv_error)
 	{
 	    STRCAT(IObuff, _(" CONVERSION ERROR"));
@@ -4972,7 +4897,6 @@
 	    STRCAT(IObuff, _("[converted]"));
 	    c = TRUE;
 	}
-#endif
 	if (device)
 	{
 	    STRCAT(IObuff, _("[Device]"));
@@ -5013,11 +4937,8 @@
     /* When written everything correctly: reset 'modified'.  Unless not
      * writing to the original file and '+' is not in 'cpoptions'. */
     if (reset_changed && whole && !append
-#ifdef FEAT_MBYTE
 	    && !write_info.bw_conv_error
-#endif
-	    && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL)
-	    )
+	    && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL))
     {
 	unchanged(buf, TRUE);
 	/* b:changedtick is always incremented in unchanged() but that
@@ -5113,16 +5034,14 @@
     vim_free(backup);
     if (buffer != smallbuf)
 	vim_free(buffer);
-#ifdef FEAT_MBYTE
     vim_free(fenc_tofree);
     vim_free(write_info.bw_conv_buf);
-# ifdef USE_ICONV
+#ifdef USE_ICONV
     if (write_info.bw_iconv_fd != (iconv_t)-1)
     {
 	iconv_close(write_info.bw_iconv_fd);
 	write_info.bw_iconv_fd = (iconv_t)-1;
     }
-# endif
 #endif
 #ifdef HAVE_ACL
     mch_free_acl(acl);
@@ -5411,7 +5330,6 @@
     int		flags = ip->bw_flags;	/* extra flags */
 #endif
 
-#ifdef FEAT_MBYTE
     /*
      * Skip conversion when writing the crypt magic number or the BOM.
      */
@@ -5521,7 +5439,7 @@
 	    }
 	}
 
-# ifdef WIN3264
+#ifdef WIN3264
 	else if (flags & FIO_CODEPAGE)
 	{
 	    /*
@@ -5617,7 +5535,7 @@
 
 	    fromlen = to - ip->bw_conv_buf;
 	    buf = to;
-#  ifdef CP_UTF8	/* VC 4.1 doesn't define CP_UTF8 */
+# ifdef CP_UTF8	/* VC 4.1 doesn't define CP_UTF8 */
 	    if (FIO_GET_CP(flags) == CP_UTF8)
 	    {
 		/* Convert from UCS-2 to UTF-8, using the remainder of the
@@ -5636,7 +5554,7 @@
 		len = (int)(to - buf);
 	    }
 	    else
-#endif
+# endif
 	    {
 		/* Convert from UCS-2 to the codepage, using the remainder of
 		 * the conversion buffer.  If the conversion uses the default
@@ -5653,9 +5571,9 @@
 		}
 	    }
 	}
-# endif
+#endif
 
-# ifdef MACOS_CONVERT
+#ifdef MACOS_CONVERT
 	else if (flags & FIO_MACROMAN)
 	{
 	    /*
@@ -5689,9 +5607,9 @@
 	    }
 	    buf = ip->bw_conv_buf;
 	}
-# endif
+#endif
 
-# ifdef USE_ICONV
+#ifdef USE_ICONV
 	if (ip->bw_iconv_fd != (iconv_t)-1)
 	{
 	    const char	*from;
@@ -5759,9 +5677,8 @@
 	    buf = ip->bw_conv_buf;
 	    len = (int)((char_u *)to - ip->bw_conv_buf);
 	}
-# endif
+#endif
     }
-#endif /* FEAT_MBYTE */
 
     if (ip->bw_fd < 0)
 	/* Only checking conversion, which is OK if we get here. */
@@ -5798,7 +5715,6 @@
     return (wlen < len) ? FAIL : OK;
 }
 
-#ifdef FEAT_MBYTE
 /*
  * Convert a Unicode character to bytes.
  * Return TRUE for an error, FALSE when it's OK.
@@ -6089,7 +6005,6 @@
     (void)ucs2bytes(0xfeff, &p, flags);
     return (int)(p - buf);
 }
-#endif
 
 /*
  * Try to find a shortname by comparing the fullname with the current
@@ -7639,13 +7554,10 @@
     if (path_with_url(fname))
 	return;
     for (p = fname; *p != NUL; ++p)
-# ifdef  FEAT_MBYTE
 	/* The Big5 encoding can have '\' in the trail byte. */
 	if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
 	    ++p;
-	else
-# endif
-	if (*p == '\\')
+	else if (*p == '\\')
 	    *p = '/';
 }
 #endif
@@ -10340,13 +10252,11 @@
 #endif
 	    default:
 		size++;
-# ifdef FEAT_MBYTE
 		if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
 		{
 		    ++p;
 		    ++size;
 		}
-# endif
 		break;
 	}
     }
@@ -10479,12 +10389,9 @@
 		    reg_pat[i++] = ',';
 		break;
 	    default:
-# ifdef  FEAT_MBYTE
 		if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
 		    reg_pat[i++] = *p++;
-		else
-# endif
-		if (allow_dirs != NULL && vim_ispathsep(*p))
+		else if (allow_dirs != NULL && vim_ispathsep(*p))
 		    *allow_dirs = TRUE;
 		reg_pat[i++] = *p;
 		break;
