diff --git a/src/edit.c b/src/edit.c
index 852060b..92dbf4c 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -212,9 +212,7 @@
 static void stop_insert(pos_T *end_insert_pos, int esc, int nomove);
 static int  echeck_abbr(int);
 static void replace_join(int off);
-#ifdef FEAT_MBYTE
 static void mb_replace_pop_ins(int cc);
-#endif
 static void replace_flush(void);
 static void replace_do_bs(int limit_col);
 static int del_char_after_col(int limit_col);
@@ -567,14 +565,12 @@
 	{
 	    if (ptr[1] == NUL)
 		++curwin->w_cursor.col;
-#ifdef FEAT_MBYTE
 	    else if (has_mbyte)
 	    {
 		i = (*mb_ptr2len)(ptr);
 		if (ptr[i] == NUL)
 		    curwin->w_cursor.col += i;
 	    }
-#endif
 	}
 	ins_at_eol = FALSE;
     }
@@ -1580,12 +1576,10 @@
 	     * special character.  Let CTRL-] expand abbreviations without
 	     * inserting it. */
 	    if (vim_iswordc(c) || (!echeck_abbr(
-#ifdef FEAT_MBYTE
-			/* Add ABBR_OFF for characters above 0x100, this is
-			 * what check_abbr() expects. */
-			(has_mbyte && c >= 0x100) ? (c + ABBR_OFF) :
-#endif
-		       c) && c != Ctrl_RSB))
+			// Add ABBR_OFF for characters above 0x100, this is
+			// what check_abbr() expects.
+				(has_mbyte && c >= 0x100) ? (c + ABBR_OFF) : c)
+			&& c != Ctrl_RSB))
 	    {
 		insert_special(c, FALSE, FALSE);
 #ifdef FEAT_RIGHTLEFT
@@ -1835,14 +1829,11 @@
 	    attr = 0;
 	pc_row = W_WINROW(curwin) + curwin->w_wrow;
 	pc_col = curwin->w_wincol;
-#if defined(FEAT_RIGHTLEFT) || defined(FEAT_MBYTE)
 	pc_status = PC_STATUS_UNSET;
-#endif
 #ifdef FEAT_RIGHTLEFT
 	if (curwin->w_p_rl)
 	{
 	    pc_col += curwin->w_width - 1 - curwin->w_wcol;
-# ifdef FEAT_MBYTE
 	    if (has_mbyte)
 	    {
 		int fix_col = mb_fix_col(pc_col, pc_row);
@@ -1854,22 +1845,17 @@
 		    pc_status = PC_STATUS_RIGHT;
 		}
 	    }
-# endif
 	}
 	else
 #endif
 	{
 	    pc_col += curwin->w_wcol;
-#ifdef FEAT_MBYTE
 	    if (mb_lefthalve(pc_row, pc_col))
 		pc_status = PC_STATUS_LEFT;
-#endif
 	}
 
 	/* save the character to be able to put it back */
-#if defined(FEAT_RIGHTLEFT) || defined(FEAT_MBYTE)
 	if (pc_status == PC_STATUS_UNSET)
-#endif
 	{
 	    screen_getbytes(pc_row, pc_col, pc_bytes, &pc_attr);
 	    pc_status = PC_STATUS_SET;
@@ -1953,13 +1939,11 @@
 {
     if (pc_status != PC_STATUS_UNSET && pc_row >= msg_scrolled)
     {
-#if defined(FEAT_MBYTE)
 	if (pc_status == PC_STATUS_RIGHT)
 	    ++curwin->w_wcol;
 	if (pc_status == PC_STATUS_RIGHT || pc_status == PC_STATUS_LEFT)
 	    redrawWinline(curwin, curwin->w_cursor.lnum);
 	else
-#endif
 	    screen_puts(pc_bytes, pc_row - msg_scrolled, pc_col, pc_attr);
     }
 }
@@ -1979,7 +1963,6 @@
     cursor_off();
     save_col = curwin->w_cursor.col;
     curwin->w_cursor.col = col;
-#ifdef FEAT_MBYTE
     if (has_mbyte)
     {
 	char_u *p;
@@ -1988,7 +1971,6 @@
 	p = ml_get_curline();
 	curwin->w_cursor.col -= (*mb_head_off)(p, p + col);
     }
-#endif
     curs_columns(FALSE);	    /* recompute w_wrow and w_wcol */
     if (curwin->w_wcol < curwin->w_width)
     {
@@ -2132,11 +2114,9 @@
 	while (vcol <= (int)curwin->w_virtcol)
 	{
 	    last_vcol = vcol;
-#ifdef FEAT_MBYTE
 	    if (has_mbyte && new_cursor_col >= 0)
 		new_cursor_col += (*mb_ptr2len)(ptr + new_cursor_col);
 	    else
-#endif
 		++new_cursor_col;
 	    vcol += lbr_chartabsize(ptr, ptr + new_cursor_col, (colnr_T)vcol);
 	}
@@ -2302,7 +2282,6 @@
    static int
 del_char_after_col(int limit_col UNUSED)
 {
-#ifdef FEAT_MBYTE
     if (enc_utf8 && limit_col >= 0)
     {
 	colnr_T ecol = curwin->w_cursor.col + 1;
@@ -2324,7 +2303,6 @@
 	del_bytes((long)((int)ecol - curwin->w_cursor.col), FALSE, TRUE);
     }
     else
-#endif
 	(void)del_char(FALSE);
     return TRUE;
 }
@@ -2529,7 +2507,6 @@
 	/* Infer case of completed part. */
 
 	/* Find actual length of completion. */
-#ifdef FEAT_MBYTE
 	if (has_mbyte)
 	{
 	    p = str;
@@ -2541,11 +2518,9 @@
 	    }
 	}
 	else
-#endif
 	    actual_len = len;
 
 	/* Find actual length of original text. */
-#ifdef FEAT_MBYTE
 	if (has_mbyte)
 	{
 	    p = compl_orig_text;
@@ -2557,7 +2532,6 @@
 	    }
 	}
 	else
-#endif
 	    actual_compl_length = compl_length;
 
 	/* "actual_len" may be smaller than "actual_compl_length" when using
@@ -2571,22 +2545,18 @@
 	{
 	    p = str;
 	    for (i = 0; i < actual_len; ++i)
-#ifdef FEAT_MBYTE
 		if (has_mbyte)
 		    wca[i] = mb_ptr2char_adv(&p);
 		else
-#endif
 		    wca[i] = *(p++);
 
 	    /* Rule 1: Were any chars converted to lower? */
 	    p = compl_orig_text;
 	    for (i = 0; i < min_len; ++i)
 	    {
-#ifdef FEAT_MBYTE
 		if (has_mbyte)
 		    c = mb_ptr2char_adv(&p);
 		else
-#endif
 		    c = *(p++);
 		if (MB_ISLOWER(c))
 		{
@@ -2610,11 +2580,9 @@
 		p = compl_orig_text;
 		for (i = 0; i < min_len; ++i)
 		{
-#ifdef FEAT_MBYTE
 		    if (has_mbyte)
 			c = mb_ptr2char_adv(&p);
 		    else
-#endif
 			c = *(p++);
 		    if (was_letter && MB_ISUPPER(c) && MB_ISLOWER(wca[i]))
 		    {
@@ -2631,11 +2599,9 @@
 	    p = compl_orig_text;
 	    for (i = 0; i < min_len; ++i)
 	    {
-#ifdef FEAT_MBYTE
 		if (has_mbyte)
 		    c = mb_ptr2char_adv(&p);
 		else
-#endif
 		    c = *(p++);
 		if (MB_ISLOWER(c))
 		    wca[i] = MB_TOLOWER(wca[i]);
@@ -2652,11 +2618,9 @@
 	    p = IObuff;
 	    i = 0;
 	    while (i < actual_len && (p - IObuff + 6) < IOSIZE)
-#ifdef FEAT_MBYTE
 		if (has_mbyte)
 		    p += (*mb_char2bytes)(wca[i++], p);
 		else
-#endif
 		    *(p++) = wca[i++];
 	    *p = NUL;
 
@@ -2837,14 +2801,12 @@
 	s = match->cp_str;
 	while (*p != NUL)
 	{
-#ifdef FEAT_MBYTE
 	    if (has_mbyte)
 	    {
 		c1 = mb_ptr2char(p);
 		c2 = mb_ptr2char(s);
 	    }
 	    else
-#endif
 	    {
 		c1 = *p;
 		c2 = *s;
@@ -2852,14 +2814,12 @@
 	    if (match->cp_icase ? (MB_TOLOWER(c1) != MB_TOLOWER(c2))
 								 : (c1 != c2))
 		break;
-#ifdef FEAT_MBYTE
 	    if (has_mbyte)
 	    {
 		MB_PTR_ADV(p);
 		MB_PTR_ADV(s);
 	    }
 	    else
-#endif
 	    {
 		++p;
 		++s;
@@ -3426,7 +3386,6 @@
 			    wstart = ptr;
 
 			    /* Find end of the word. */
-#ifdef FEAT_MBYTE
 			    if (has_mbyte)
 				/* Japanese words may have characters in
 				 * different classes, only separate words
@@ -3440,7 +3399,6 @@
 				    ptr += l;
 				}
 			    else
-#endif
 				ptr = find_word_end(ptr);
 
 			    /* Add the word. Skip the regexp match. */
@@ -3475,12 +3433,10 @@
     char_u *
 find_word_start(char_u *ptr)
 {
-#ifdef FEAT_MBYTE
     if (has_mbyte)
 	while (*ptr != NUL && *ptr != '\n' && mb_get_class(ptr) <= 1)
 	    ptr += (*mb_ptr2len)(ptr);
     else
-#endif
 	while (*ptr != NUL && *ptr != '\n' && !vim_iswordc(*ptr))
 	    ++ptr;
     return ptr;
@@ -3493,7 +3449,6 @@
     char_u *
 find_word_end(char_u *ptr)
 {
-#ifdef FEAT_MBYTE
     int		start_class;
 
     if (has_mbyte)
@@ -3508,7 +3463,6 @@
 	    }
     }
     else
-#endif
 	while (vim_iswordc(*ptr))
 	    ++ptr;
     return ptr;
@@ -3719,13 +3673,10 @@
     static void
 ins_compl_addleader(int c)
 {
-#ifdef FEAT_MBYTE
     int		cc;
-#endif
 
     if (stop_arrow() == FAIL)
 	return;
-#ifdef FEAT_MBYTE
     if (has_mbyte && (cc = (*mb_char2len)(c)) > 1)
     {
 	char_u	buf[MB_MAXBYTES + 1];
@@ -3737,7 +3688,6 @@
 	    AppendToRedobuff(buf);
     }
     else
-#endif
     {
 	ins_char(c);
 	if (compl_opt_refresh_always)
@@ -4155,10 +4105,8 @@
 	p = compl_orig_text;
 	for (len = 0; p[len] != NUL && p[len] == ptr[len]; ++len)
 	    ;
-#ifdef FEAT_MBYTE
 	if (len > 0)
 	    len -= (*mb_head_off)(p, p + len);
-#endif
 	for (p += len; *p != NUL; MB_PTR_ADV(p))
 	    AppendCharToRedobuff(K_BS);
     }
@@ -5416,25 +5364,14 @@
 		    return FAIL;
 		if (!vim_iswordp(line + compl_col)
 			|| (compl_col > 0
-			    && (
-#ifdef FEAT_MBYTE
-				vim_iswordp(mb_prevptr(line, line + compl_col))
-#else
-				vim_iswordc(line[compl_col - 1])
-#endif
-				)))
+			 && (vim_iswordp(mb_prevptr(line, line + compl_col)))))
 		    prefix = (char_u *)"";
 		STRCPY((char *)compl_pattern, prefix);
 		(void)quote_meta(compl_pattern + STRLEN(prefix),
 					      line + compl_col, compl_length);
 	    }
-	    else if (--startcol < 0 ||
-#ifdef FEAT_MBYTE
-			   !vim_iswordp(mb_prevptr(line, line + startcol + 1))
-#else
-			   !vim_iswordc(line[startcol])
-#endif
-		    )
+	    else if (--startcol < 0
+		    || !vim_iswordp(mb_prevptr(line, line + startcol + 1)))
 	    {
 		/* Match any word of at least two chars */
 		compl_pattern = vim_strsave((char_u *)"\\<\\k\\k");
@@ -5445,7 +5382,6 @@
 	    }
 	    else
 	    {
-#ifdef FEAT_MBYTE
 		/* Search the point of change class of multibyte character
 		 * or not a word single byte character backward.  */
 		if (has_mbyte)
@@ -5465,7 +5401,6 @@
 		    }
 		}
 		else
-#endif
 		    while (--startcol >= 0 && vim_iswordc(line[startcol]))
 			;
 		compl_col += ++startcol;
@@ -5956,7 +5891,6 @@
 	}
 	if (dest != NULL)
 	    *dest++ = *src;
-# ifdef FEAT_MBYTE
 	/* Copy remaining bytes of a multibyte character. */
 	if (has_mbyte)
 	{
@@ -5972,7 +5906,6 @@
 			*dest++ = *src;
 		}
 	}
-# endif
     }
     if (dest != NULL)
 	*dest = NUL;
@@ -5995,9 +5928,7 @@
     int		i;
     int		hex = FALSE;
     int		octal = FALSE;
-#ifdef FEAT_MBYTE
     int		unicode = 0;
-#endif
 
     if (got_int)
 	return Ctrl_C;
@@ -6022,28 +5953,18 @@
     {
 	nc = plain_vgetc();
 #ifdef FEAT_CMDL_INFO
-	if (!(State & CMDLINE)
-# ifdef FEAT_MBYTE
-		&& MB_BYTE2LEN_CHECK(nc) == 1
-# endif
-	   )
+	if (!(State & CMDLINE) && MB_BYTE2LEN_CHECK(nc) == 1)
 	    add_to_showcmd(nc);
 #endif
 	if (nc == 'x' || nc == 'X')
 	    hex = TRUE;
 	else if (nc == 'o' || nc == 'O')
 	    octal = TRUE;
-#ifdef FEAT_MBYTE
 	else if (nc == 'u' || nc == 'U')
 	    unicode = nc;
-#endif
 	else
 	{
-	    if (hex
-#ifdef FEAT_MBYTE
-		    || unicode != 0
-#endif
-		    )
+	    if (hex || unicode != 0)
 	    {
 		if (!vim_isxdigit(nc))
 		    break;
@@ -6065,11 +5986,7 @@
 	    ++i;
 	}
 
-	if (cc > 255
-#ifdef FEAT_MBYTE
-		&& unicode == 0
-#endif
-		)
+	if (cc > 255 && unicode == 0)
 	    cc = 255;		/* limit range to 0-255 */
 	nc = 0;
 
@@ -6078,13 +5995,11 @@
 	    if (i >= 2)
 		break;
 	}
-#ifdef FEAT_MBYTE
 	else if (unicode)	/* Unicode: up to four or eight chars */
 	{
 	    if ((unicode == 'u' && i >= 4) || (unicode == 'U' && i >= 8))
 		break;
 	}
-#endif
 	else if (i >= 3)	/* decimal or octal: up to three chars */
 	    break;
     }
@@ -6104,11 +6019,9 @@
 
     if (cc == 0)	/* NUL is stored as NL */
 	cc = '\n';
-#ifdef FEAT_MBYTE
     if (enc_dbcs && (cc & 0xff) == 0)
 	cc = '?';	/* don't accept an illegal DBCS char, the NUL in the
 			   second byte will cause trouble! */
-#endif
 
     --no_mapping;
 #ifdef FEAT_GUI
@@ -6179,11 +6092,7 @@
 # define ISSPECIAL(c)	((c) < ' ' || (c) >= DEL || (c) == '0' || (c) == '^')
 #endif
 
-#ifdef FEAT_MBYTE
-# define WHITECHAR(cc) (VIM_ISWHITE(cc) && (!enc_utf8 || !utf_iscomposing(utf_ptr2char(ml_get_cursor() + 1))))
-#else
-# define WHITECHAR(cc) VIM_ISWHITE(cc)
-#endif
+#define WHITECHAR(cc) (VIM_ISWHITE(cc) && (!enc_utf8 || !utf_iscomposing(utf_ptr2char(ml_get_cursor() + 1))))
 
 /*
  * "flags": INSCHAR_FORMAT - force formatting
@@ -6340,9 +6249,7 @@
 #endif
 
     if (       !ISSPECIAL(c)
-#ifdef FEAT_MBYTE
 	    && (!has_mbyte || (*mb_char2len)(c) == 1)
-#endif
 	    && !has_insertcharpre()
 	    && vpeekc() != NUL
 	    && !(State & REPLACE_FLAG)
@@ -6373,9 +6280,7 @@
 	 */
 	while (	   (c = vpeekc()) != NUL
 		&& !ISSPECIAL(c)
-#ifdef FEAT_MBYTE
 		&& (!has_mbyte || MB_BYTE2LEN_CHECK(c) == 1)
-#endif
 		&& i < INPUT_BUFLEN
 # ifdef FEAT_FKMAP
 		&& !(p_fkmap && KeyTyped) /* Farsi mode mapping moves cursor */
@@ -6412,7 +6317,6 @@
     }
     else
     {
-#ifdef FEAT_MBYTE
 	int		cc;
 
 	if (has_mbyte && (cc = (*mb_char2len)(c)) > 1)
@@ -6425,7 +6329,6 @@
 	    AppendCharToRedobuff(c);
 	}
 	else
-#endif
 	{
 	    ins_char(c);
 	    if (flags & INSCHAR_CTRLV)
@@ -6454,9 +6357,7 @@
     int		save_char = NUL;
     int		haveto_redraw = FALSE;
     int		fo_ins_blank = has_format_option(FO_INS_BLANK);
-#ifdef FEAT_MBYTE
     int		fo_multibyte = has_format_option(FO_MBYTE_BREAK);
-#endif
     int		fo_white_par = has_format_option(FO_WHITE_PAR);
     int		first_line = TRUE;
 #ifdef FEAT_COMMENTS
@@ -6613,7 +6514,6 @@
 		if (curwin->w_cursor.col <= (colnr_T)wantcol)
 		    break;
 	    }
-#ifdef FEAT_MBYTE
 	    else if (cc >= 0x100 && fo_multibyte)
 	    {
 		/* Break after or before a multi-byte character. */
@@ -6660,7 +6560,6 @@
 		if (curwin->w_cursor.col <= (colnr_T)wantcol)
 		    break;
 	    }
-#endif
 	    if (curwin->w_cursor.col == 0)
 		break;
 	    dec_cursor();
@@ -7350,7 +7249,6 @@
     char_u *
 add_char2buf(int c, char_u *s)
 {
-#ifdef FEAT_MBYTE
     char_u	temp[MB_MAXBYTES + 1];
     int		i;
     int		len;
@@ -7359,7 +7257,6 @@
     for (i = 0; i < len; ++i)
     {
 	c = temp[i];
-#endif
 	/* Need to escape K_SPECIAL and CSI like in the typeahead buffer. */
 	if (c == K_SPECIAL)
 	{
@@ -7377,9 +7274,7 @@
 #endif
 	else
 	    *s++ = c;
-#ifdef FEAT_MBYTE
     }
-#endif
     return s;
 }
 
@@ -7435,13 +7330,8 @@
 
 	/* Adjust for multi-wide char (excluding TAB) */
 	ptr = ml_get_cursor();
-	coladvance(getviscol() + ((*ptr != TAB && vim_isprintc(
-# ifdef FEAT_MBYTE
-			    (*mb_ptr2char)(ptr)
-# else
-			    *ptr
-# endif
-			    ))
+	coladvance(getviscol() + ((*ptr != TAB
+					  && vim_isprintc((*mb_ptr2char)(ptr)))
 		    ? ptr2cells(ptr) : 1));
 	curwin->w_set_curswant = TRUE;
 	/* Return OK if the cursor moved, FAIL otherwise (at window edge). */
@@ -7454,11 +7344,9 @@
     if (*ptr == NUL)
 	return FAIL;	    /* already at the very end */
 
-#ifdef FEAT_MBYTE
     if (has_mbyte)
 	l = (*mb_ptr2len)(ptr);
     else
-#endif
 	l = 1;
 
     /* move "l" bytes right, but don't end up on the NUL, unless 'virtualedit'
@@ -7499,10 +7387,7 @@
 	     * 'breakindent' is not set and there are no multi-byte
 	     * characters */
 	    if ((*p_sbr == NUL && !curwin->w_p_bri
-#  ifdef FEAT_MBYTE
-			&& !has_mbyte
-#  endif
-			) || getviscol() < v)
+					     && !has_mbyte) || getviscol() < v)
 		break;
 	    ++width;
 	}
@@ -7516,13 +7401,8 @@
 
 	    /* Adjust for multi-wide char (not a TAB) */
 	    ptr = ml_get_cursor();
-	    if (*ptr != TAB && vim_isprintc(
-#  ifdef FEAT_MBYTE
-			    (*mb_ptr2char)(ptr)
-#  else
-			    *ptr
-#  endif
-			    ) && ptr2cells(ptr) > 1)
+	    if (*ptr != TAB && vim_isprintc((*mb_ptr2char)(ptr))
+							 && ptr2cells(ptr) > 1)
 		curwin->w_cursor.coladd = 0;
 	}
 
@@ -7537,12 +7417,10 @@
     curwin->w_set_curswant = TRUE;
     --curwin->w_cursor.col;
 
-#ifdef FEAT_MBYTE
     /* if the character on the left of the current cursor is a multi-byte
      * character, move to its first byte */
     if (has_mbyte)
 	mb_adjust_cursor();
-#endif
     return OK;
 }
 
@@ -7829,7 +7707,6 @@
     ++replace_stack_nr;
 }
 
-#if defined(FEAT_MBYTE) || defined(PROTO)
 /*
  * Push a character onto the replace stack.  Handles a multi-byte character in
  * reverse byte order, so that the first byte is popped off first.
@@ -7845,7 +7722,6 @@
 	replace_push(p[j]);
     return l;
 }
-#endif
 
 /*
  * Pop one item from the replace stack.
@@ -7893,17 +7769,12 @@
     State = NORMAL;			/* don't want REPLACE here */
     while ((cc = replace_pop()) > 0)
     {
-#ifdef FEAT_MBYTE
 	mb_replace_pop_ins(cc);
-#else
-	ins_char(cc);
-#endif
 	dec_cursor();
     }
     State = oldState;
 }
 
-#ifdef FEAT_MBYTE
 /*
  * Insert bytes popped from the replace stack. "cc" is the first byte.  If it
  * indicates a multi-byte char, pop the other bytes too.
@@ -7956,7 +7827,6 @@
 	    }
 	}
 }
-#endif
 
 /*
  * make the replace stack empty
@@ -8012,7 +7882,6 @@
 	    getvcol(curwin, &curwin->w_cursor, NULL, &start_vcol, NULL);
 	    orig_vcols = chartabsize(ml_get_cursor(), start_vcol);
 	}
-#ifdef FEAT_MBYTE
 	if (has_mbyte)
 	{
 	    (void)del_char_after_col(limit_col);
@@ -8021,7 +7890,6 @@
 	    replace_push(cc);
 	}
 	else
-#endif
 	{
 	    pchar_cursor(cc);
 	    if (State & VREPLACE_FLAG)
@@ -8038,9 +7906,7 @@
 	    for (i = 0; i < ins_len; ++i)
 	    {
 		vcol += chartabsize(p + i, vcol);
-#ifdef FEAT_MBYTE
 		i += (*mb_ptr2len)(p) - 1;
-#endif
 	    }
 	    vcol -= start_vcol;
 
@@ -8329,7 +8195,6 @@
 		    /* Just completed a word, check if it starts with "look".
 		     * search back for the start of a word. */
 		    line = ml_get_curline();
-# ifdef FEAT_MBYTE
 		    if (has_mbyte)
 		    {
 			char_u	*n;
@@ -8342,7 +8207,6 @@
 			}
 		    }
 		    else
-# endif
 			for (s = line + curwin->w_cursor.col; s > line; --s)
 			    if (!vim_iswordc(s[-1]))
 				break;
@@ -8823,11 +8687,9 @@
 #endif
 	{
 	    --curwin->w_cursor.col;
-#ifdef FEAT_MBYTE
 	    /* Correct cursor for multi-byte character. */
 	    if (has_mbyte)
 		mb_adjust_cursor();
-#endif
 	}
     }
 
@@ -9137,9 +8999,7 @@
     int		did_backspace = FALSE;
     int		in_indent;
     int		oldState;
-#ifdef FEAT_MBYTE
     int		cpc[MAX_MCO];	    /* composing characters */
-#endif
 
     /*
      * can't delete anything in an empty file
@@ -9287,11 +9147,7 @@
 		while (cc > 0)
 		{
 		    save_col = curwin->w_cursor.col;
-#ifdef FEAT_MBYTE
 		    mb_replace_pop_ins(cc);
-#else
-		    ins_char(cc);
-#endif
 		    curwin->w_cursor.col = save_col;
 		    cc = replace_pop();
 		}
@@ -9413,12 +9269,10 @@
 	 */
 	else
 	{
-#ifdef FEAT_MBYTE
 	    int cclass = 0, prev_cclass = 0;
 
 	    if (has_mbyte)
 		cclass = mb_get_class(ml_get_cursor());
-#endif
 	    do
 	    {
 #ifdef FEAT_RIGHTLEFT
@@ -9427,14 +9281,12 @@
 		    dec_cursor();
 
 		cc = gchar_cursor();
-#ifdef FEAT_MBYTE
 		/* look multi-byte character class */
 		if (has_mbyte)
 		{
 		    prev_cclass = cclass;
 		    cclass = mb_get_class(ml_get_cursor());
 		}
-#endif
 
 		/* start of word? */
 		if (mode == BACKSPACE_WORD && !vim_isspace(cc))
@@ -9445,10 +9297,7 @@
 		/* end of word? */
 		else if (mode == BACKSPACE_WORD_NOT_SPACE
 			&& ((vim_isspace(cc) || vim_iswordc(cc) != temp)
-#ifdef FEAT_MBYTE
-			|| prev_cclass != cclass
-#endif
-			))
+			|| prev_cclass != cclass))
 		{
 #ifdef FEAT_RIGHTLEFT
 		    if (!revins_on)
@@ -9464,12 +9313,9 @@
 		    replace_do_bs(-1);
 		else
 		{
-#ifdef FEAT_MBYTE
 		    if (enc_utf8 && p_deco)
 			(void)utfc_ptr2char(ml_get_cursor(), cpc);
-#endif
 		    (void)del_char(FALSE);
-#ifdef FEAT_MBYTE
 		    /*
 		     * If there are combining characters and 'delcombine' is set
 		     * move the cursor back.  Don't back up before the base
@@ -9477,7 +9323,6 @@
 		     */
 		    if (enc_utf8 && p_deco && cpc[0] != NUL)
 			inc_cursor();
-#endif
 #ifdef FEAT_RIGHTLEFT
 		    if (revins_chars)
 		    {
@@ -9713,11 +9558,9 @@
 	    // won't get the end sequence.
 	    break;
 
-#ifdef FEAT_MBYTE
 	if (has_mbyte)
 	    idx += (*mb_char2bytes)(c, buf + idx);
 	else
-#endif
 	    buf[idx++] = c;
 	buf[idx] = NUL;
 	if (end != NULL && STRNCMP(buf, end, idx) == 0)
@@ -9760,11 +9603,9 @@
 		case PASTE_ONE_CHAR:
 		    if (ret_char == -1)
 		    {
-#ifdef FEAT_MBYTE
 			if (has_mbyte)
 			    ret_char = (*mb_ptr2char)(buf);
 			else
-#endif
 			    ret_char = buf[0];
 		    }
 		    break;
@@ -9972,11 +9813,9 @@
 	else
 #endif
 	{
-#ifdef FEAT_MBYTE
 	    if (has_mbyte)
 		curwin->w_cursor.col += (*mb_ptr2len)(ml_get_cursor());
 	    else
-#endif
 		++curwin->w_cursor.col;
 	}
 
@@ -10590,11 +10429,7 @@
     if ((colnr_T)temp > curwin->w_virtcol)
 	ptr = prev_ptr;
 
-#ifdef FEAT_MBYTE
     c = (*mb_ptr2char)(ptr);
-#else
-    c = *ptr;
-#endif
     if (c == NUL)
 	vim_beep(BO_COPY);
     return c;
@@ -10773,11 +10608,9 @@
     if (!has_insertcharpre())
 	return NULL;
 
-# ifdef FEAT_MBYTE
     if (has_mbyte)
 	buf[(*mb_char2bytes)(c, buf)] = NUL;
     else
-# endif
     {
 	buf[0] = c;
 	buf[1] = NUL;
