changeset 5735:50dbef5e774a v7.4.212

updated for version 7.4.212 Problem: Now that the +visual feature is always enabled the #ifdefs for it are not useful. Solution: Remove the checks for FEAT_VISUAL.
author Bram Moolenaar <bram@vim.org>
date Sun, 23 Mar 2014 15:13:05 +0100
parents 657ade71d395
children 187cebfcddf7
files src/buffer.c src/charset.c src/edit.c src/eval.c src/ex_cmds.c src/ex_docmd.c src/feature.h src/fold.c src/getchar.c src/globals.h src/gui.c src/gui_mac.c src/gui_w48.c src/main.c src/mark.c src/menu.c src/misc2.c src/move.c src/netbeans.c src/normal.c src/ops.c src/option.c src/option.h src/os_msdos.c src/os_qnx.c src/os_win32.h src/quickfix.c src/regexp.c src/regexp_nfa.c src/screen.c src/search.c src/spell.c src/structs.h src/syntax.c src/term.c src/ui.c src/undo.c src/version.c src/window.c
diffstat 39 files changed, 124 insertions(+), 861 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1432,10 +1432,8 @@ set_curbuf(buf, action)
 	curwin->w_alt_fnum = curbuf->b_fnum; /* remember alternate file */
     buflist_altfpos(curwin);			 /* remember curpos */
 
-#ifdef FEAT_VISUAL
     /* Don't restart Select mode after switching to another buffer. */
     VIsual_reselect = FALSE;
-#endif
 
     /* close_windows() or apply_autocmds() may change curbuf */
     prevbuf = curbuf;
--- a/src/charset.c
+++ b/src/charset.c
@@ -1380,10 +1380,7 @@ getvcol(wp, pos, start, cursor, end)
 		&& (State & NORMAL)
 		&& !wp->w_p_list
 		&& !virtual_active()
-#ifdef FEAT_VISUAL
-		&& !(VIsual_active
-				   && (*p_sel == 'e' || ltoreq(*pos, VIsual)))
-#endif
+		&& !(VIsual_active && (*p_sel == 'e' || ltoreq(*pos, VIsual)))
 		)
 	    *cursor = vcol + incr - 1;	    /* cursor at end */
 	else
@@ -1463,7 +1460,6 @@ getvvcol(wp, pos, start, cursor, end)
 }
 #endif
 
-#if defined(FEAT_VISUAL) || defined(PROTO)
 /*
  * Get the leftmost and rightmost virtual column of pos1 and pos2.
  * Used for Visual block mode.
@@ -1500,7 +1496,6 @@ getvcols(wp, pos1, pos2, left, right)
     else
 	*right = to1;
 }
-#endif
 
 /*
  * skipwhite: skip over ' ' and '\t'.
--- a/src/edit.c
+++ b/src/edit.c
@@ -220,9 +220,7 @@ static int  ins_esc __ARGS((long *count,
 #ifdef FEAT_RIGHTLEFT
 static void ins_ctrl_ __ARGS((void));
 #endif
-#ifdef FEAT_VISUAL
 static int ins_start_select __ARGS((int c));
-#endif
 static void ins_insert __ARGS((int replaceState));
 static void ins_ctrl_o __ARGS((void));
 static void ins_shift __ARGS((int c, int lastc));
@@ -932,7 +930,6 @@ edit(cmdchar, startln, count)
 	    }
 #endif
 
-#ifdef FEAT_VISUAL
 	/*
 	 * If 'keymodel' contains "startsel", may start selection.  If it
 	 * does, a CTRL-O and c will be stuffed, we need to get these
@@ -940,7 +937,6 @@ edit(cmdchar, startln, count)
 	 */
 	if (ins_start_select(c))
 	    continue;
-#endif
 
 	/*
 	 * The big switch to handle a character in insert mode.
@@ -6900,7 +6896,6 @@ stop_insert(end_insert_pos, esc, nomove)
 	    else if (cc != NUL)
 		++curwin->w_cursor.col;	/* put cursor back on the NUL */
 
-#ifdef FEAT_VISUAL
 	    /* <C-S-Right> may have started Visual mode, adjust the position for
 	     * deleted characters. */
 	    if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum)
@@ -6910,12 +6905,11 @@ stop_insert(end_insert_pos, esc, nomove)
 		if (VIsual.col > len)
 		{
 		    VIsual.col = len;
-# ifdef FEAT_VIRTUALEDIT
+#ifdef FEAT_VIRTUALEDIT
 		    VIsual.coladd = 0;
-# endif
+#endif
 		}
 	    }
-#endif
 	}
     }
     did_ai = FALSE;
@@ -8112,9 +8106,7 @@ ins_reg()
     int		need_redraw = FALSE;
     int		regname;
     int		literally = 0;
-#ifdef FEAT_VISUAL
     int		vis_active = VIsual_active;
-#endif
 
     /*
      * If we are going to wait for a character, show a '"'.
@@ -8218,11 +8210,9 @@ ins_reg()
     if (need_redraw || stuff_empty())
 	edit_unputchar();
 
-#ifdef FEAT_VISUAL
     /* Disallow starting Visual mode here, would get a weird mode. */
     if (!vis_active && VIsual_active)
 	end_visual_mode();
-#endif
 }
 
 /*
@@ -8419,11 +8409,7 @@ ins_esc(count, cmdchar, nomove)
 #endif
 	       )
 	    && (restart_edit == NUL
-		   || (gchar_cursor() == NUL
-#ifdef FEAT_VISUAL
-		       && !VIsual_active
-#endif
-		      ))
+		   || (gchar_cursor() == NUL && !VIsual_active))
 #ifdef FEAT_RIGHTLEFT
 	    && !revins_on
 #endif
@@ -8525,7 +8511,6 @@ ins_ctrl_()
 }
 #endif
 
-#ifdef FEAT_VISUAL
 /*
  * If 'keymodel' contains "startsel", may start selection.
  * Returns TRUE when a CTRL-O and other keys stuffed.
@@ -8581,7 +8566,6 @@ ins_start_select(c)
 	}
     return FALSE;
 }
-#endif
 
 /*
  * <Insert> key in Insert mode: toggle insert/replace mode.
--- a/src/eval.c
+++ b/src/eval.c
@@ -11833,12 +11833,10 @@ f_getregtype(argvars, rettv)
     {
 	case MLINE: buf[0] = 'V'; break;
 	case MCHAR: buf[0] = 'v'; break;
-#ifdef FEAT_VISUAL
 	case MBLOCK:
 		buf[0] = Ctrl_V;
 		sprintf((char *)buf + 1, "%ld", reglen + 1);
 		break;
-#endif
     }
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = vim_strsave(buf);
@@ -12552,9 +12550,7 @@ f_has(argvars, rettv)
 #ifdef FEAT_VIRTUALEDIT
 	"virtualedit",
 #endif
-#ifdef FEAT_VISUAL
 	"visual",
-#endif
 #ifdef FEAT_VISUALEXTRA
 	"visualextra",
 #endif
@@ -14397,7 +14393,6 @@ f_mode(argvars, rettv)
     buf[1] = NUL;
     buf[2] = NUL;
 
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	if (VIsual_select)
@@ -14405,9 +14400,7 @@ f_mode(argvars, rettv)
 	else
 	    buf[0] = VIsual_mode;
     }
-    else
-#endif
-	if (State == HITRETURN || State == ASKMORE || State == SETWSIZE
+    else if (State == HITRETURN || State == ASKMORE || State == SETWSIZE
 		|| State == CONFIRM)
     {
 	buf[0] = 'r';
@@ -16756,7 +16749,6 @@ f_setreg(argvars, rettv)
 		case 'V': case 'l':	/* line-wise selection */
 		    yank_type = MLINE;
 		    break;
-#ifdef FEAT_VISUAL
 		case 'b': case Ctrl_V:	/* block-wise selection */
 		    yank_type = MBLOCK;
 		    if (VIM_ISDIGIT(stropt[1]))
@@ -16766,7 +16758,6 @@ f_setreg(argvars, rettv)
 			--stropt;
 		    }
 		    break;
-#endif
 	    }
     }
 
@@ -18769,7 +18760,6 @@ f_visualmode(argvars, rettv)
     typval_T	*argvars UNUSED;
     typval_T	*rettv UNUSED;
 {
-#ifdef FEAT_VISUAL
     char_u	str[2];
 
     rettv->v_type = VAR_STRING;
@@ -18780,7 +18770,6 @@ f_visualmode(argvars, rettv)
     /* A non-zero number or non-empty string argument: reset mode. */
     if (non_zero_arg(&argvars[0]))
 	curbuf->b_visual_mode_eval = NUL;
-#endif
 }
 
 /*
@@ -19154,14 +19143,12 @@ var2fpos(varp, dollar_lnum, fnum)
 	return NULL;
     if (name[0] == '.')				/* cursor */
 	return &curwin->w_cursor;
-#ifdef FEAT_VISUAL
     if (name[0] == 'v' && name[1] == NUL)	/* Visual start */
     {
 	if (VIsual_active)
 	    return &VIsual;
 	return &curwin->w_cursor;
     }
-#endif
     if (name[0] == '\'')			/* mark */
     {
 	pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum);
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3274,13 +3274,11 @@ do_ecmd(fnum, ffname, sfname, eap, newln
 	goto theend;
     }
 
-#ifdef FEAT_VISUAL
     /*
      * End Visual mode before switching to another buffer, so the text can be
      * copied into the GUI selection buffer.
      */
     reset_VIsual();
-#endif
 
 #ifdef FEAT_AUTOCMD
     if ((command != NULL || newlnum > (linenr_T)0)
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -8577,10 +8577,8 @@ ex_operators(eap)
 	beginline(BL_SOL | BL_FIX);
     }
 
-#if defined(FEAT_VISUAL)
     if (VIsual_active)
 	end_visual_mode();
-#endif
 
     switch (eap->cmdidx)
     {
@@ -8991,11 +8989,7 @@ ex_redraw(eap)
     RedrawingDisabled = 0;
     p_lz = FALSE;
     update_topline();
-    update_screen(eap->forceit ? CLEAR :
-#ifdef FEAT_VISUAL
-	    VIsual_active ? INVERTED :
-#endif
-	    0);
+    update_screen(eap->forceit ? CLEAR : VIsual_active ? INVERTED : 0);
 #ifdef FEAT_TITLE
     if (need_maketitle)
 	maketitle();
@@ -9030,11 +9024,7 @@ ex_redrawstatus(eap)
 	status_redraw_all();
     else
 	status_redraw_curbuf();
-    update_screen(
-# ifdef FEAT_VISUAL
-	    VIsual_active ? INVERTED :
-# endif
-	    0);
+    update_screen(VIsual_active ? INVERTED : 0);
     RedrawingDisabled = r;
     p_lz = p;
     out_flush();
--- a/src/feature.h
+++ b/src/feature.h
@@ -214,7 +214,6 @@
  * +visual		Visual mode - now always included.
  * +visualextra		Extra features for Visual mode (mostly block operators).
  */
-#define FEAT_VISUAL
 #ifdef FEAT_NORMAL
 # define FEAT_VISUALEXTRA
 #endif
@@ -1138,13 +1137,10 @@
 #ifdef FEAT_GUI
 # ifndef FEAT_CLIPBOARD
 #  define FEAT_CLIPBOARD
-#  ifndef FEAT_VISUAL
-#   define FEAT_VISUAL
-#  endif
 # endif
 #endif
 
-#if defined(FEAT_NORMAL) && defined(FEAT_VISUAL) \
+#if defined(FEAT_NORMAL) \
 	&& (defined(UNIX) || defined(VMS)) \
 	&& defined(WANT_X11) && defined(HAVE_X11)
 # define FEAT_XCLIPBOARD
--- a/src/fold.c
+++ b/src/fold.c
@@ -430,11 +430,9 @@ opFoldRange(first, last, opening, recurs
     }
     if (done == DONE_NOTHING)
 	EMSG(_(e_nofold));
-#ifdef FEAT_VISUAL
     /* Force a redraw to remove the Visual highlighting. */
     if (had_visual)
 	redraw_curbuf_later(INVERTED);
-#endif
 }
 
 /* openFold() {{{2 */
@@ -807,11 +805,9 @@ deleteFold(start, end, recursive, had_vi
     if (!did_one)
     {
 	EMSG(_(e_nofold));
-#ifdef FEAT_VISUAL
 	/* Force a redraw to remove the Visual highlighting. */
 	if (had_visual)
 	    redraw_curbuf_later(INVERTED);
-#endif
     }
     else
 	/* Deleting markers may make cursor column invalid. */
@@ -1065,7 +1061,6 @@ find_wl_entry(win, lnum)
 }
 
 /* foldAdjustVisual() {{{2 */
-#ifdef FEAT_VISUAL
 /*
  * Adjust the Visual area to include any fold at the start or end completely.
  */
@@ -1103,7 +1098,6 @@ foldAdjustVisual()
 #endif
     }
 }
-#endif
 
 /* cursor_foldstart() {{{2 */
 /*
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -870,7 +870,6 @@ start_redo(count, old_redo)
 	c = read_redo(FALSE, old_redo);
     }
 
-#ifdef FEAT_VISUAL
     if (c == 'v')   /* redo Visual */
     {
 	VIsual = curwin->w_cursor;
@@ -880,7 +879,6 @@ start_redo(count, old_redo)
 	redo_VIsual_busy = TRUE;
 	c = read_redo(FALSE, old_redo);
     }
-#endif
 
     /* try to enter the count (in place of a previous count) */
     if (count)
@@ -1162,7 +1160,6 @@ typebuf_typed()
     return typebuf.tb_maplen == 0;
 }
 
-#if defined(FEAT_VISUAL) || defined(PROTO)
 /*
  * Return the number of characters that are mapped (or not typed).
  */
@@ -1171,7 +1168,6 @@ typebuf_maplen()
 {
     return typebuf.tb_maplen;
 }
-#endif
 
 /*
  * remove "len" characters from typebuf.tb_buf[typebuf.tb_off + offset]
@@ -2443,7 +2439,6 @@ vgetorpeek(advance)
 				idx = get_menu_index(current_menu, local_State);
 				if (idx != MENU_INDEX_INVALID)
 				{
-# ifdef FEAT_VISUAL
 				    /*
 				     * In Select mode and a Visual mode menu
 				     * is used:  Switch to Visual mode
@@ -2457,7 +2452,6 @@ vgetorpeek(advance)
 					(void)ins_typebuf(K_SELECT_STRING,
 						  REMAP_NONE, 0, TRUE, FALSE);
 				    }
-# endif
 				    ins_typebuf(current_menu->strings[idx],
 						current_menu->noremap[idx],
 						0, TRUE,
@@ -2516,7 +2510,6 @@ vgetorpeek(advance)
 			    break;
 			}
 
-#ifdef FEAT_VISUAL
 			/*
 			 * In Select mode and a Visual mode mapping is used:
 			 * Switch to Visual mode temporarily.  Append K_SELECT
@@ -2529,7 +2522,6 @@ vgetorpeek(advance)
 			    (void)ins_typebuf(K_SELECT_STRING, REMAP_NONE,
 							      0, TRUE, FALSE);
 			}
-#endif
 
 #ifdef FEAT_EVAL
 			/* Copy the values from *mp that are used, because
--- a/src/globals.h
+++ b/src/globals.h
@@ -662,7 +662,6 @@ EXTERN int	silent_mode INIT(= FALSE);
 				/* set to TRUE when "-s" commandline argument
 				 * used for ex */
 
-#ifdef FEAT_VISUAL
 EXTERN pos_T	VIsual;		/* start position of active Visual selection */
 EXTERN int	VIsual_active INIT(= FALSE);
 				/* whether Visual mode is active */
@@ -677,7 +676,6 @@ EXTERN int	VIsual_mode INIT(= 'v');
 
 EXTERN int	redo_VIsual_busy INIT(= FALSE);
 				/* TRUE when redoing Visual */
-#endif
 
 #ifdef FEAT_MOUSE
 /*
@@ -1178,11 +1176,9 @@ EXTERN int	fill_fold INIT(= '-');
 EXTERN int	fill_diff INIT(= '-');
 #endif
 
-#ifdef FEAT_VISUAL
 /* Whether 'keymodel' contains "stopsel" and "startsel". */
 EXTERN int	km_stopsel INIT(= FALSE);
 EXTERN int	km_startsel INIT(= FALSE);
-#endif
 
 #ifdef FEAT_CMDWIN
 EXTERN int	cedit_key INIT(= -1);	/* key value of 'cedit' option */
--- a/src/gui.c
+++ b/src/gui.c
@@ -3132,11 +3132,9 @@ button_set:
      */
     if (!mouse_has(checkfor) || checkfor == MOUSE_COMMAND)
     {
-#ifdef FEAT_VISUAL
 	/* Don't do modeless selection in Visual mode. */
 	if (checkfor != MOUSE_NONEF && VIsual_active && (State & NORMAL))
 	    return;
-#endif
 
 	/*
 	 * When 'mousemodel' is "popup", shift-left is translated to right.
--- a/src/gui_mac.c
+++ b/src/gui_mac.c
@@ -1068,11 +1068,7 @@ HandleODocAE(const AppleEvent *theAEvent
     }
  */
 
-
-#ifdef FEAT_VISUAL
     reset_VIsual();
-#endif
-
     fnames = new_fnames_from_AEDesc(&theList, &numFiles, &error);
 
     if (error)
@@ -1142,7 +1138,7 @@ HandleODocAE(const AppleEvent *theAEvent
 
     /* Update the screen display */
     update_screen(NOT_VALID);
-#ifdef FEAT_VISUAL
+
     /* Select the text if possible */
     if (gotPosition)
     {
@@ -1160,7 +1156,7 @@ HandleODocAE(const AppleEvent *theAEvent
 	    VIsual.col = 0;
 	}
     }
-#endif
+
     setcursor();
     out_flush();
 
--- a/src/gui_w48.c
+++ b/src/gui_w48.c
@@ -3708,9 +3708,7 @@ gui_mch_browse(
     DragQueryPoint(hDrop, &pt);
     MapWindowPoints(s_hwnd, s_textArea, &pt, 1);
 
-# ifdef FEAT_VISUAL
     reset_VIsual();
-# endif
 
     fnames = (char_u **)alloc(cFiles * sizeof(char_u *));
 
--- a/src/main.c
+++ b/src/main.c
@@ -1057,9 +1057,7 @@ main_loop(cmdwin, noexmode)
     if (!cmdwin && !noexmode && SETJMP(x_jump_env))
     {
 	State = NORMAL;
-# ifdef FEAT_VISUAL
 	VIsual_active = FALSE;
-# endif
 	got_int = TRUE;
 	need_wait_return = FALSE;
 	global_busy = FALSE;
@@ -1096,11 +1094,7 @@ main_loop(cmdwin, noexmode)
 		check_timestamps(FALSE);
 	    if (need_wait_return)	/* if wait_return still needed ... */
 		wait_return(FALSE);	/* ... call it now */
-	    if (need_start_insertmode && goto_im()
-#ifdef FEAT_VISUAL
-		    && !VIsual_active
-#endif
-		    )
+	    if (need_start_insertmode && goto_im() && !VIsual_active)
 	    {
 		need_start_insertmode = FALSE;
 		stuffReadbuff((char_u *)"i");	/* start insert mode next */
@@ -1202,7 +1196,7 @@ main_loop(cmdwin, noexmode)
 		diff_need_scrollbind = FALSE;
 	    }
 #endif
-#if defined(FEAT_FOLDING) && defined(FEAT_VISUAL)
+#if defined(FEAT_FOLDING)
 	    /* Include a closed fold completely in the Visual area. */
 	    foldAdjustVisual();
 #endif
@@ -1228,12 +1222,9 @@ main_loop(cmdwin, noexmode)
 	    update_topline();
 	    validate_cursor();
 
-#ifdef FEAT_VISUAL
 	    if (VIsual_active)
 		update_curbuf(INVERTED);/* update inverted part */
-	    else
-#endif
-		if (must_redraw)
+	    else if (must_redraw)
 		update_screen(0);
 	    else if (redraw_cmdline || clear_cmdline)
 		showmode();
--- a/src/mark.c
+++ b/src/mark.c
@@ -98,7 +98,6 @@ setmark_pos(c, pos, fnum)
 	return OK;
     }
 
-#ifdef FEAT_VISUAL
     if (c == '<' || c == '>')
     {
 	if (c == '<')
@@ -110,7 +109,6 @@ setmark_pos(c, pos, fnum)
 	    curbuf->b_visual.vi_mode = 'v';
 	return OK;
     }
-#endif
 
 #ifndef EBCDIC
     if (c > 'z')	    /* some islower() and isupper() cannot handle
@@ -340,9 +338,7 @@ getmark_buf_fnum(buf, c, changefile, fnu
     int		*fnum;
 {
     pos_T		*posp;
-#ifdef FEAT_VISUAL
     pos_T		*startp, *endp;
-#endif
     static pos_T	pos_copy;
 
     posp = NULL;
@@ -403,7 +399,6 @@ getmark_buf_fnum(buf, c, changefile, fnu
 	curwin->w_cursor = pos;
 	listcmd_busy = slcb;
     }
-#ifdef FEAT_VISUAL
     else if (c == '<' || c == '>')	/* start/end of visual area */
     {
 	startp = &buf->b_visual.vi_start;
@@ -428,7 +423,6 @@ getmark_buf_fnum(buf, c, changefile, fnu
 #endif
 	}
     }
-#endif
     else if (ASCII_ISLOWER(c))		/* normal named mark */
     {
 	posp = &(buf->b_namedm[c - 'a']);
@@ -757,10 +751,8 @@ do_marks(eap)
     show_one_mark(']', arg, &curbuf->b_op_end, NULL, TRUE);
     show_one_mark('^', arg, &curbuf->b_last_insert, NULL, TRUE);
     show_one_mark('.', arg, &curbuf->b_last_change, NULL, TRUE);
-#ifdef FEAT_VISUAL
     show_one_mark('<', arg, &curbuf->b_visual.vi_start, NULL, TRUE);
     show_one_mark('>', arg, &curbuf->b_visual.vi_end, NULL, TRUE);
-#endif
     show_one_mark(-1, arg, NULL, NULL, FALSE);
 }
 
@@ -892,10 +884,8 @@ ex_delmarks(eap)
 		    case '.': curbuf->b_last_change.lnum = 0; break;
 		    case '[': curbuf->b_op_start.lnum    = 0; break;
 		    case ']': curbuf->b_op_end.lnum      = 0; break;
-#ifdef FEAT_VISUAL
 		    case '<': curbuf->b_visual.vi_start.lnum = 0; break;
 		    case '>': curbuf->b_visual.vi_end.lnum   = 0; break;
-#endif
 		    case ' ': break;
 		    default:  EMSG2(_(e_invarg2), p);
 			      return;
@@ -1085,11 +1075,9 @@ mark_adjust(line1, line2, amount, amount
 	    one_adjust_nodel(&(curbuf->b_changelist[i].lnum));
 #endif
 
-#ifdef FEAT_VISUAL
 	/* Visual area */
 	one_adjust_nodel(&(curbuf->b_visual.vi_start.lnum));
 	one_adjust_nodel(&(curbuf->b_visual.vi_end.lnum));
-#endif
 
 #ifdef FEAT_QUICKFIX
 	/* quickfix marks */
@@ -1136,14 +1124,12 @@ mark_adjust(line1, line2, amount, amount
 		    if (win->w_tagstack[i].fmark.fnum == fnum)
 			one_adjust_nodel(&(win->w_tagstack[i].fmark.mark.lnum));
 
-#ifdef FEAT_VISUAL
 	    /* the displayed Visual area */
 	    if (win->w_old_cursor_lnum != 0)
 	    {
 		one_adjust_nodel(&(win->w_old_cursor_lnum));
 		one_adjust_nodel(&(win->w_old_visual_lnum));
 	    }
-#endif
 
 	    /* topline and cursor position for windows with the same buffer
 	     * other than the current window */
@@ -1260,11 +1246,9 @@ mark_col_adjust(lnum, mincol, lnum_amoun
 	col_adjust(&(curbuf->b_changelist[i]));
 #endif
 
-#ifdef FEAT_VISUAL
     /* Visual area */
     col_adjust(&(curbuf->b_visual.vi_start));
     col_adjust(&(curbuf->b_visual.vi_end));
-#endif
 
     /* previous context mark */
     col_adjust(&(curwin->w_pcmark));
--- a/src/menu.c
+++ b/src/menu.c
@@ -1640,7 +1640,6 @@ get_menu_index(menu, state)
 	idx = MENU_INDEX_INSERT;
     else if (state & CMDLINE)
 	idx = MENU_INDEX_CMDLINE;
-#ifdef FEAT_VISUAL
     else if (VIsual_active)
     {
 	if (VIsual_select)
@@ -1648,7 +1647,6 @@ get_menu_index(menu, state)
 	else
 	    idx = MENU_INDEX_VISUAL;
     }
-#endif
     else if (state == HITRETURN || state == ASKMORE)
 	idx = MENU_INDEX_CMDLINE;
     else if (finish_op)
@@ -1811,14 +1809,12 @@ menu_is_tearoff(name)
     static int
 get_menu_mode()
 {
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	if (VIsual_select)
 	    return MENU_INDEX_SELECT;
 	return MENU_INDEX_VISUAL;
     }
-#endif
     if (State & INSERT)
 	return MENU_INDEX_INSERT;
     if ((State & CMDLINE) || State == ASKMORE || State == HITRETURN)
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -31,9 +31,7 @@ virtual_active()
     if (virtual_op != MAYBE)
 	return virtual_op;
     return (ve_flags == VE_ALL
-# ifdef FEAT_VISUAL
 	    || ((ve_flags & VE_BLOCK) && VIsual_active && VIsual_mode == Ctrl_V)
-# endif
 	    || ((ve_flags & VE_INSERT) && (State & INSERT)));
 }
 
@@ -149,9 +147,7 @@ coladvance2(pos, addspaces, finetune, wc
 
     one_more = (State & INSERT)
 		    || restart_edit != NUL
-#ifdef FEAT_VISUAL
 		    || (VIsual_active && *p_sel != 'o')
-#endif
 #ifdef FEAT_VIRTUALEDIT
 		    || ((ve_flags & VE_ONEMORE) && wcol < MAXCOL)
 #endif
@@ -570,9 +566,7 @@ check_cursor_col_win(win)
 	 * - in Visual mode and 'selection' isn't "old"
 	 * - 'virtualedit' is set */
 	if ((State & INSERT) || restart_edit
-#ifdef FEAT_VISUAL
 		|| (VIsual_active && *p_sel != 'o')
-#endif
 #ifdef FEAT_VIRTUALEDIT
 		|| (ve_flags & VE_ONEMORE)
 #endif
@@ -627,9 +621,7 @@ check_cursor()
 adjust_cursor_col()
 {
     if (curwin->w_cursor.col > 0
-# ifdef FEAT_VISUAL
 	    && (!VIsual_active || *p_sel == 'o')
-# endif
 	    && gchar_cursor() == NUL)
 	--curwin->w_cursor.col;
 }
@@ -3290,17 +3282,14 @@ get_real_state()
 {
     if (State & NORMAL)
     {
-#ifdef FEAT_VISUAL
 	if (VIsual_active)
 	{
 	    if (VIsual_select)
 		return SELECTMODE;
 	    return VISUAL;
 	}
-	else
-#endif
-	    if (finish_op)
-		return OP_PENDING;
+	else if (finish_op)
+	    return OP_PENDING;
     }
     return State;
 }
@@ -3738,7 +3727,6 @@ get_shape_idx(mouse)
     }
     if (finish_op)
 	return SHAPE_IDX_O;
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	if (*p_sel == 'e')
@@ -3746,7 +3734,6 @@ get_shape_idx(mouse)
 	else
 	    return SHAPE_IDX_V;
     }
-#endif
     return SHAPE_IDX_N;
 }
 #endif
--- a/src/move.c
+++ b/src/move.c
@@ -2857,17 +2857,13 @@ do_check_cursorbind()
     win_T	*old_curwin = curwin;
     buf_T	*old_curbuf = curbuf;
     int		restart_edit_save;
-# ifdef FEAT_VISUAL
     int		old_VIsual_select = VIsual_select;
     int		old_VIsual_active = VIsual_active;
-# endif
 
     /*
      * loop through the cursorbound windows
      */
-# ifdef FEAT_VISUAL
     VIsual_select = VIsual_active = 0;
-# endif
     for (curwin = firstwin; curwin; curwin = curwin->w_next)
     {
 	curbuf = curwin->w_buffer;
@@ -2916,10 +2912,8 @@ do_check_cursorbind()
     /*
      * reset current-window
      */
-# ifdef FEAT_VISUAL
     VIsual_select = old_VIsual_select;
     VIsual_active = old_VIsual_active;
-# endif
     curwin = old_curwin;
     curbuf = old_curbuf;
 }
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -2232,11 +2232,9 @@ nb_do_cmd(
 
 	    nb_set_curbuf(buf->bufp);
 
-#ifdef FEAT_VISUAL
 	    /* Don't want Visual mode now. */
 	    if (VIsual_active)
 		end_visual_mode();
-#endif
 #ifdef NBDEBUG
 	    s = args;
 #endif
--- a/src/normal.c
+++ b/src/normal.c
@@ -14,7 +14,6 @@
 
 #include "vim.h"
 
-#ifdef FEAT_VISUAL
 /*
  * The Visual area is remembered for reselection.
  */
@@ -24,7 +23,6 @@ static colnr_T	resel_VIsual_vcol;		/* nr
 static int	VIsual_mode_orig = NUL;		/* saved Visual mode */
 
 static int	restart_VIsual_select = 0;
-#endif
 
 #ifdef FEAT_EVAL
 static void	set_vcount_ca __ARGS((cmdarg_T *cap, int *set_prevcount));
@@ -37,7 +35,7 @@ static int
 static int	find_command __ARGS((int cmdchar));
 static void	op_colon __ARGS((oparg_T *oap));
 static void	op_function __ARGS((oparg_T *oap));
-#if defined(FEAT_MOUSE) && defined(FEAT_VISUAL)
+#if defined(FEAT_MOUSE)
 static void	find_start_of_word __ARGS((pos_T *));
 static void	find_end_of_word __ARGS((pos_T *));
 static int	get_mouse_class __ARGS((char_u *p));
@@ -48,9 +46,7 @@ static int	checkclearop __ARGS((oparg_T 
 static int	checkclearopq __ARGS((oparg_T *oap));
 static void	clearop __ARGS((oparg_T *oap));
 static void	clearopbeep __ARGS((oparg_T *oap));
-#ifdef FEAT_VISUAL
 static void	unshift_special __ARGS((cmdarg_T *cap));
-#endif
 #ifdef FEAT_CMDL_INFO
 static void	del_from_showcmd __ARGS((int));
 #endif
@@ -117,25 +113,19 @@ static void	nv_Replace __ARGS((cmdarg_T 
 #ifdef FEAT_VREPLACE
 static void	nv_vreplace __ARGS((cmdarg_T *cap));
 #endif
-#ifdef FEAT_VISUAL
 static void	v_swap_corners __ARGS((int cmdchar));
-#endif
 static void	nv_replace __ARGS((cmdarg_T *cap));
 static void	n_swapchar __ARGS((cmdarg_T *cap));
 static void	nv_cursormark __ARGS((cmdarg_T *cap, int flag, pos_T *pos));
-#ifdef FEAT_VISUAL
 static void	v_visop __ARGS((cmdarg_T *cap));
-#endif
 static void	nv_subst __ARGS((cmdarg_T *cap));
 static void	nv_abbrev __ARGS((cmdarg_T *cap));
 static void	nv_optrans __ARGS((cmdarg_T *cap));
 static void	nv_gomark __ARGS((cmdarg_T *cap));
 static void	nv_pcmark __ARGS((cmdarg_T *cap));
 static void	nv_regname __ARGS((cmdarg_T *cap));
-#ifdef FEAT_VISUAL
 static void	nv_visual __ARGS((cmdarg_T *cap));
 static void	n_start_visual_mode __ARGS((int c));
-#endif
 static void	nv_window __ARGS((cmdarg_T *cap));
 static void	nv_suspend __ARGS((cmdarg_T *cap));
 static void	nv_g_cmd __ARGS((cmdarg_T *cap));
@@ -155,11 +145,9 @@ static void	nv_bck_word __ARGS((cmdarg_T
 static void	nv_wordcmd __ARGS((cmdarg_T *cap));
 static void	nv_beginline __ARGS((cmdarg_T *cap));
 static void	adjust_cursor __ARGS((oparg_T *oap));
-#ifdef FEAT_VISUAL
 static void	adjust_for_sel __ARGS((cmdarg_T *cap));
 static int	unadjust_for_sel __ARGS((void));
 static void	nv_select __ARGS((cmdarg_T *cap));
-#endif
 static void	nv_goto __ARGS((cmdarg_T *cap));
 static void	nv_normal __ARGS((cmdarg_T *cap));
 static void	nv_esc __ARGS((cmdarg_T *oap));
@@ -248,24 +236,14 @@ static const struct nv_cmd
     {Ctrl_N,	nv_down,	NV_STS,			FALSE},
     {Ctrl_O,	nv_ctrlo,	0,			0},
     {Ctrl_P,	nv_up,		NV_STS,			FALSE},
-#ifdef FEAT_VISUAL
     {Ctrl_Q,	nv_visual,	0,			FALSE},
-#else
-    {Ctrl_Q,	nv_ignore,	0,			0},
-#endif
     {Ctrl_R,	nv_redo,	0,			0},
     {Ctrl_S,	nv_ignore,	0,			0},
     {Ctrl_T,	nv_tagpop,	NV_NCW,			0},
     {Ctrl_U,	nv_halfpage,	0,			0},
-#ifdef FEAT_VISUAL
     {Ctrl_V,	nv_visual,	0,			FALSE},
     {'V',	nv_visual,	0,			FALSE},
     {'v',	nv_visual,	0,			FALSE},
-#else
-    {Ctrl_V,	nv_error,	0,			0},
-    {'V',	nv_error,	0,			0},
-    {'v',	nv_error,	0,			0},
-#endif
     {Ctrl_W,	nv_window,	0,			0},
     {Ctrl_X,	nv_addsub,	0,			0},
     {Ctrl_Y,	nv_scroll_line,	0,			FALSE},
@@ -427,9 +405,7 @@ static const struct nv_cmd
     {K_HELP,	nv_help,	NV_NCW,			0},
     {K_F1,	nv_help,	NV_NCW,			0},
     {K_XF1,	nv_help,	NV_NCW,			0},
-#ifdef FEAT_VISUAL
     {K_SELECT,	nv_select,	0,			0},
-#endif
 #ifdef FEAT_GUI
     {K_VER_SCROLLBAR, nv_ver_scrollbar, 0,		0},
     {K_HOR_SCROLLBAR, nv_hor_scrollbar, 0,		0},
@@ -579,11 +555,9 @@ normal_cmd(oap, toplevel)
 #ifdef FEAT_CMDL_INFO
     int		need_flushbuf;		/* need to call out_flush() */
 #endif
-#ifdef FEAT_VISUAL
     pos_T	old_pos;		/* cursor position before command */
     int		mapped_len;
     static int	old_mapped_len = 0;
-#endif
     int		idx;
 #ifdef FEAT_EVAL
     int		set_prevcount = FALSE;
@@ -643,9 +617,7 @@ normal_cmd(oap, toplevel)
     }
 #endif
 
-#ifdef FEAT_VISUAL
     mapped_len = typebuf_maplen();
-#endif
 
     State = NORMAL_BUSY;
 #ifdef USE_ON_FLY_SCROLL
@@ -666,7 +638,6 @@ normal_cmd(oap, toplevel)
     c = safe_vgetc();
     LANGMAP_ADJUST(c, TRUE);
 
-#ifdef FEAT_VISUAL
     /*
      * If a mapping was started in Visual or Select mode, remember the length
      * of the mapping.  This is used below to not return to Insert mode for as
@@ -677,12 +648,10 @@ normal_cmd(oap, toplevel)
     else if (old_mapped_len
 		|| (VIsual_active && mapped_len == 0 && typebuf_maplen() > 0))
 	old_mapped_len = typebuf_maplen();
-#endif
 
     if (c == NUL)
 	c = K_ZERO;
 
-#ifdef FEAT_VISUAL
     /*
      * In Select mode, typed text replaces the selection.
      */
@@ -703,16 +672,13 @@ normal_cmd(oap, toplevel)
 	msg_nowait = TRUE;	/* don't delay going to insert mode */
 	old_mapped_len = 0;	/* do go to Insert mode */
     }
-#endif
 
 #ifdef FEAT_CMDL_INFO
     need_flushbuf = add_to_showcmd(c);
 #endif
 
 getcount:
-#ifdef FEAT_VISUAL
     if (!(VIsual_active && VIsual_select))
-#endif
     {
 	/*
 	 * Handle a count before a command and compute ca.count0.
@@ -856,7 +822,6 @@ getcount:
 	goto normal_end;
 #endif
 
-#ifdef FEAT_VISUAL
     /*
      * In Visual/Select mode, a few keys are handled in a special way.
      */
@@ -892,7 +857,6 @@ getcount:
 	    }
 	}
     }
-#endif
 
 #ifdef FEAT_RIGHTLEFT
     if (curwin->w_p_rl && KeyTyped && !KeyStuffed
@@ -930,11 +894,7 @@ getcount:
 		    && !Recording
 		    && !Exec_reg)
 		|| ((ca.cmdchar == 'a' || ca.cmdchar == 'i')
-		    && (oap->op_type != OP_NOP
-#ifdef FEAT_VISUAL
-			|| VIsual_active
-#endif
-		       ))))
+		    && (oap->op_type != OP_NOP || VIsual_active))))
     {
 	int	*cp;
 	int	repl = FALSE;	/* get character for replace mode */
@@ -1168,7 +1128,6 @@ getcount:
 	msg_col = 0;
     }
 
-#ifdef FEAT_VISUAL
     old_pos = curwin->w_cursor;		/* remember where cursor was */
 
     /* When 'keymodel' contains "startsel" some keys start Select/Visual
@@ -1188,7 +1147,6 @@ getcount:
 	    mod_mask &= ~MOD_MASK_SHIFT;
 	}
     }
-#endif
 
     /*
      * Execute the command!
@@ -1220,12 +1178,10 @@ getcount:
 #endif
     }
 
-#ifdef FEAT_VISUAL
     /* Get the length of mapped chars again after typing a count, second
      * character or "z333<cr>". */
     if (old_mapped_len > 0)
 	old_mapped_len = typebuf_maplen();
-#endif
 
     /*
      * If an operation is pending, handle it...
@@ -1247,11 +1203,9 @@ getcount:
     if (       ((p_smd
 		    && msg_silent == 0
 		    && (restart_edit != 0
-#ifdef FEAT_VISUAL
 			|| (VIsual_active
 			    && old_pos.lnum == curwin->w_cursor.lnum
 			    && old_pos.col == curwin->w_cursor.col)
-#endif
 		       )
 		    && (clear_cmdline
 			|| redraw_cmdline)
@@ -1259,9 +1213,7 @@ getcount:
 		    && !msg_nowait
 		    && KeyTyped)
 		|| (restart_edit != 0
-#ifdef FEAT_VISUAL
 		    && !VIsual_active
-#endif
 		    && (msg_scroll
 			|| emsg_on_display)))
 	    && oap->regname == 0
@@ -1368,36 +1320,24 @@ normal_end:
      * May switch from Visual to Select mode after CTRL-O command.
      */
     if (       oap->op_type == OP_NOP
-#ifdef FEAT_VISUAL
 	    && ((restart_edit != 0 && !VIsual_active && old_mapped_len == 0)
 		|| restart_VIsual_select == 1)
-#else
-	    && restart_edit != 0
-#endif
 	    && !(ca.retval & CA_COMMAND_BUSY)
 	    && stuff_empty()
 	    && oap->regname == 0)
     {
-#ifdef FEAT_VISUAL
 	if (restart_VIsual_select == 1)
 	{
 	    VIsual_select = TRUE;
 	    showmode();
 	    restart_VIsual_select = 0;
 	}
-#endif
-	if (restart_edit != 0
-#ifdef FEAT_VISUAL
-		&& !VIsual_active && old_mapped_len == 0
-#endif
-		)
+	if (restart_edit != 0 && !VIsual_active && old_mapped_len == 0)
 	    (void)edit(restart_edit, FALSE, 1L);
     }
 
-#ifdef FEAT_VISUAL
     if (restart_VIsual_select == 2)
 	restart_VIsual_select = 1;
-#endif
 
     /* Save count before an operator for next time. */
     opcount = ca.opcount;
@@ -1437,15 +1377,13 @@ do_pending_operator(cap, old_col, gui_ya
     int		empty_region_error;
     int		restart_edit_save;
 
-#ifdef FEAT_VISUAL
     /* The visual area is remembered for redo */
     static int	    redo_VIsual_mode = NUL; /* 'v', 'V', or Ctrl-V */
     static linenr_T redo_VIsual_line_count; /* number of lines */
     static colnr_T  redo_VIsual_vcol;	    /* number of cols or end column */
     static long	    redo_VIsual_count;	    /* count for Visual operator */
-# ifdef FEAT_VIRTUALEDIT
+#ifdef FEAT_VIRTUALEDIT
     int		    include_line_break = FALSE;
-# endif
 #endif
 
 #if defined(FEAT_CLIPBOARD)
@@ -1459,10 +1397,8 @@ do_pending_operator(cap, old_col, gui_ya
     if ((clip_star.available || clip_plus.available)
 	    && oap->op_type != OP_NOP
 	    && !gui_yank
-# ifdef FEAT_VISUAL
 	    && VIsual_active
 	    && !redo_VIsual_busy
-# endif
 	    && oap->regname == 0)
 	clip_auto_select();
 #endif
@@ -1471,13 +1407,8 @@ do_pending_operator(cap, old_col, gui_ya
     /*
      * If an operation is pending, handle it...
      */
-    if ((finish_op
-#ifdef FEAT_VISUAL
-		|| VIsual_active
-#endif
-		) && oap->op_type != OP_NOP)
-    {
-#ifdef FEAT_VISUAL
+    if ((finish_op || VIsual_active) && oap->op_type != OP_NOP)
+    {
 	oap->is_VIsual = VIsual_active;
 	if (oap->motion_force == 'V')
 	    oap->motion_type = MLINE;
@@ -1501,17 +1432,14 @@ do_pending_operator(cap, old_col, gui_ya
 	    VIsual_select = FALSE;
 	    VIsual_reselect = FALSE;
 	}
-#endif
 
 	/* Only redo yank when 'y' flag is in 'cpoptions'. */
 	/* Never redo "zf" (define fold). */
 	if ((vim_strchr(p_cpo, CPO_YANK) != NULL || oap->op_type != OP_YANK)
-#ifdef FEAT_VISUAL
 		&& ((!VIsual_active || oap->motion_force)
 		    /* Also redo Operator-pending Visual mode mappings */
 		    || (VIsual_active && cap->cmdchar == ':'
 						 && oap->op_type != OP_COLON))
-#endif
 		&& cap->cmdchar != 'D'
 #ifdef FEAT_FOLDING
 		&& oap->op_type != OP_FOLD
@@ -1554,7 +1482,6 @@ do_pending_operator(cap, old_col, gui_ya
 	    }
 	}
 
-#ifdef FEAT_VISUAL
 	if (redo_VIsual_busy)
 	{
 	    /* Redo of an operation on a Visual area. Use the same size from
@@ -1639,7 +1566,6 @@ do_pending_operator(cap, old_col, gui_ya
 	    if (VIsual_mode == 'V')
 		oap->start.col = 0;
 	}
-#endif /* FEAT_VISUAL */
 
 	/*
 	 * Set oap->start to the first position of the operated text, oap->end
@@ -1690,7 +1616,6 @@ do_pending_operator(cap, old_col, gui_ya
 	virtual_op = virtual_active();
 #endif
 
-#ifdef FEAT_VISUAL
 	if (VIsual_active || redo_VIsual_busy)
 	{
 	    if (VIsual_mode == Ctrl_V)	/* block mode */
@@ -1826,9 +1751,9 @@ do_pending_operator(cap, old_col, gui_ya
 	    {
 		oap->motion_type = MCHAR;
 		if (VIsual_mode != Ctrl_V && *ml_get_pos(&(oap->end)) == NUL
-# ifdef FEAT_VIRTUALEDIT
+#ifdef FEAT_VIRTUALEDIT
 			&& (include_line_break || !virtual_op)
-# endif
+#endif
 			)
 		{
 		    oap->inclusive = FALSE;
@@ -1840,9 +1765,9 @@ do_pending_operator(cap, old_col, gui_ya
 			{
 			    ++oap->end.lnum;
 			    oap->end.col = 0;
-# ifdef FEAT_VIRTUALEDIT
+#ifdef FEAT_VIRTUALEDIT
 			    oap->end.coladd = 0;
-# endif
+#endif
 			    ++oap->line_count;
 			}
 			else
@@ -1868,10 +1793,10 @@ do_pending_operator(cap, old_col, gui_ya
 	    if (!gui_yank)
 	    {
 		VIsual_active = FALSE;
-# ifdef FEAT_MOUSE
+#ifdef FEAT_MOUSE
 		setmouse();
 		mouse_dragging = 0;
-# endif
+#endif
 		if (mode_displayed)
 		    clear_cmdline = TRUE;   /* unshow visual mode later */
 #ifdef FEAT_CMDL_INFO
@@ -1886,7 +1811,6 @@ do_pending_operator(cap, old_col, gui_ya
 		    redraw_curbuf_later(INVERTED);
 	    }
 	}
-#endif
 
 #ifdef FEAT_MBYTE
 	/* Include the trailing byte of a multi-byte char. */
@@ -1921,16 +1845,14 @@ do_pending_operator(cap, old_col, gui_ya
 	empty_region_error = (oap->empty
 				&& vim_strchr(p_cpo, CPO_EMPTYREGION) != NULL);
 
-#ifdef FEAT_VISUAL
 	/* Force a redraw when operating on an empty Visual region, when
 	 * 'modifiable is off or creating a fold. */
 	if (oap->is_VIsual && (oap->empty || !curbuf->b_p_ma
-# ifdef FEAT_FOLDING
+#ifdef FEAT_FOLDING
 		    || oap->op_type == OP_FOLD
-# endif
+#endif
 		    ))
 	    redraw_curbuf_later(INVERTED);
-#endif
 
 	/*
 	 * If the end of an operator is in column one while oap->motion_type
@@ -1943,10 +1865,8 @@ do_pending_operator(cap, old_col, gui_ya
 		&& oap->inclusive == FALSE
 		&& !(cap->retval & CA_NO_ADJ_OP_END)
 		&& oap->end.col == 0
-#ifdef FEAT_VISUAL
 		&& (!oap->is_VIsual || *p_sel == 'o')
 		&& !oap->block_mode
-#endif
 		&& oap->line_count > 1)
 	{
 	    oap->end_adjusted = TRUE;	    /* remember that we did this */
@@ -1971,11 +1891,7 @@ do_pending_operator(cap, old_col, gui_ya
 	{
 	case OP_LSHIFT:
 	case OP_RSHIFT:
-	    op_shift(oap, TRUE,
-#ifdef FEAT_VISUAL
-		    oap->is_VIsual ? (int)cap->count1 :
-#endif
-		    1);
+	    op_shift(oap, TRUE, oap->is_VIsual ? (int)cap->count1 : 1);
 	    auto_format(FALSE, TRUE);
 	    break;
 
@@ -1988,15 +1904,14 @@ do_pending_operator(cap, old_col, gui_ya
 		beep_flush();
 	    else
 	    {
-		(void)do_join(oap->line_count, oap->op_type == OP_JOIN, TRUE, TRUE);
+		(void)do_join(oap->line_count, oap->op_type == OP_JOIN,
+								  TRUE, TRUE);
 		auto_format(FALSE, TRUE);
 	    }
 	    break;
 
 	case OP_DELETE:
-#ifdef FEAT_VISUAL
 	    VIsual_reselect = FALSE;	    /* don't reselect now */
-#endif
 	    if (empty_region_error)
 	    {
 		vim_beep();
@@ -2026,9 +1941,7 @@ do_pending_operator(cap, old_col, gui_ya
 	    break;
 
 	case OP_CHANGE:
-#ifdef FEAT_VISUAL
 	    VIsual_reselect = FALSE;	    /* don't reselect now */
-#endif
 	    if (empty_region_error)
 	    {
 		vim_beep();
@@ -2126,9 +2039,7 @@ do_pending_operator(cap, old_col, gui_ya
 
 	case OP_INSERT:
 	case OP_APPEND:
-#ifdef FEAT_VISUAL
 	    VIsual_reselect = FALSE;	/* don't reselect now */
-#endif
 #ifdef FEAT_VISUALEXTRA
 	    if (empty_region_error)
 	    {
@@ -2158,9 +2069,7 @@ do_pending_operator(cap, old_col, gui_ya
 	    break;
 
 	case OP_REPLACE:
-#ifdef FEAT_VISUAL
 	    VIsual_reselect = FALSE;	/* don't reselect now */
-#endif
 #ifdef FEAT_VISUALEXTRA
 	    if (empty_region_error)
 #endif
@@ -2220,9 +2129,7 @@ do_pending_operator(cap, old_col, gui_ya
 	{
 	    curwin->w_cursor = old_cursor;
 	}
-#ifdef FEAT_VISUAL
 	oap->block_mode = FALSE;
-#endif
 	clearop(oap);
     }
 }
@@ -2235,11 +2142,9 @@ op_colon(oap)
     oparg_T	*oap;
 {
     stuffcharReadbuff(':');
-#ifdef FEAT_VISUAL
     if (oap->is_VIsual)
 	stuffReadbuff((char_u *)"'<,'>");
     else
-#endif
     {
 	/*
 	 * Make the range look nice, so it can be repeated.
@@ -2404,14 +2309,12 @@ do_mouse(oap, c, dir, count, fixindent)
     pos_T	save_cursor;
 #endif
     win_T	*old_curwin = curwin;
-#ifdef FEAT_VISUAL
     static pos_T orig_cursor;
     colnr_T	leftcol, rightcol;
     pos_T	end_visual;
     int		diff;
     int		old_active = VIsual_active;
     int		old_mode = VIsual_mode;
-#endif
     int		regname;
 
 #if defined(FEAT_FOLDING)
@@ -2432,15 +2335,12 @@ do_mouse(oap, c, dir, count, fixindent)
 	if (!gui.in_use)
 #endif
 	{
-#ifdef FEAT_VISUAL
 	    if (VIsual_active)
 	    {
 		if (!mouse_has(MOUSE_VISUAL))
 		    return FALSE;
 	    }
-	    else
-#endif
-		if (State == NORMAL && !mouse_has(MOUSE_NORMAL))
+	    else if (State == NORMAL && !mouse_has(MOUSE_NORMAL))
 		return FALSE;
 	}
 
@@ -2509,14 +2409,6 @@ do_mouse(oap, c, dir, count, fixindent)
 	}
     }
 
-#ifndef FEAT_VISUAL
-    /*
-     * ALT is only used for starting/extending Visual mode.
-     */
-    if ((mod_mask & MOD_MASK_ALT))
-	return FALSE;
-#endif
-
     /*
      * CTRL right mouse button does CTRL-T
      */
@@ -2586,7 +2478,6 @@ do_mouse(oap, c, dir, count, fixindent)
 		return FALSE;
 	    }
 
-#ifdef FEAT_VISUAL
 	    /*
 	     * If visual was active, yank the highlighted text and put it
 	     * before the mouse pointer position.
@@ -2607,7 +2498,6 @@ do_mouse(oap, c, dir, count, fixindent)
 		do_always = TRUE;	/* ignore 'mouse' setting next time */
 		return FALSE;
 	    }
-#endif
 	    /*
 	     * The rest is below jump_to_mouse()
 	     */
@@ -2761,7 +2651,6 @@ do_mouse(oap, c, dir, count, fixindent)
 		{
 		    /* First set the cursor position before showing the popup
 		     * menu. */
-#ifdef FEAT_VISUAL
 		    if (VIsual_active)
 		    {
 			pos_T    m_pos;
@@ -2800,16 +2689,11 @@ do_mouse(oap, c, dir, count, fixindent)
 		    }
 		    else
 			jump_flags = MOUSE_MAY_STOP_VIS;
-#endif
 		}
 		if (jump_flags)
 		{
 		    jump_flags = jump_to_mouse(jump_flags, NULL, which_button);
-		    update_curbuf(
-#ifdef FEAT_VISUAL
-			    VIsual_active ? INVERTED :
-#endif
-			    VALID);
+		    update_curbuf(VIsual_active ? INVERTED : VALID);
 		    setcursor();
 		    out_flush();    /* Update before showing popup menu */
 		}
@@ -2832,7 +2716,6 @@ do_mouse(oap, c, dir, count, fixindent)
 	}
     }
 
-#ifdef FEAT_VISUAL
     if ((State & (NORMAL | INSERT))
 			    && !(mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL)))
     {
@@ -2872,7 +2755,6 @@ do_mouse(oap, c, dir, count, fixindent)
 		jump_flags |= MOUSE_MAY_VIS;
 	}
     }
-#endif
 
     /*
      * If an operator is pending, ignore all drags and releases until the
@@ -2941,7 +2823,6 @@ do_mouse(oap, c, dir, count, fixindent)
     }
 #endif
 
-#ifdef FEAT_VISUAL
     /* Set global flag that we are extending the Visual area with mouse
      * dragging; temporarily minimize 'scrolloff'. */
     if (VIsual_active && is_drag && p_so)
@@ -3040,7 +2921,6 @@ do_mouse(oap, c, dir, count, fixindent)
      */
     else if ((State & INSERT) && VIsual_active)
 	stuffcharReadbuff(Ctrl_O);
-#endif
 
     /*
      * Middle mouse click: Put text before cursor.
@@ -3118,11 +2998,7 @@ do_mouse(oap, c, dir, count, fixindent)
      */
     else if ((mod_mask & MOD_MASK_SHIFT))
     {
-	if (State & INSERT
-#ifdef FEAT_VISUAL
-		|| (VIsual_active && VIsual_select)
-#endif
-		)
+	if ((State & INSERT) || (VIsual_active && VIsual_select))
 	    stuffcharReadbuff(Ctrl_O);
 	if (which_button == MOUSE_LEFT)
 	    stuffcharReadbuff('*');
@@ -3153,7 +3029,6 @@ do_mouse(oap, c, dir, count, fixindent)
 # endif
     }
 #endif
-#ifdef FEAT_VISUAL
     else if ((mod_mask & MOD_MASK_MULTI_CLICK) && (State & (NORMAL | INSERT))
 	     && mouse_has(MOUSE_VISUAL))
     {
@@ -3267,12 +3142,10 @@ do_mouse(oap, c, dir, count, fixindent)
 	    || (VIsual_active && p_smd && msg_silent == 0
 				 && (!old_active || VIsual_mode != old_mode)))
 	redraw_cmdline = TRUE;
-#endif
 
     return moved;
 }
 
-#ifdef FEAT_VISUAL
 /*
  * Move "pos" back to the start of the word it's in.
  */
@@ -3372,10 +3245,8 @@ get_mouse_class(p)
 	return 1;
     return c;
 }
-#endif /* FEAT_VISUAL */
 #endif /* FEAT_MOUSE */
 
-#if defined(FEAT_VISUAL) || defined(PROTO)
 /*
  * Check if  highlighting for visual mode is possible, give a warning message
  * if not.
@@ -3468,7 +3339,6 @@ reset_VIsual()
 	VIsual_reselect = FALSE;
     }
 }
-#endif /* FEAT_VISUAL */
 
 #if defined(FEAT_BEVAL)
 static int find_is_eval_item __ARGS((char_u *ptr, int *colp, int *nbp, int dir));
@@ -3802,11 +3672,7 @@ checkclearop(oap)
 checkclearopq(oap)
     oparg_T	*oap;
 {
-    if (oap->op_type == OP_NOP
-#ifdef FEAT_VISUAL
-	    && !VIsual_active
-#endif
-	    )
+    if (oap->op_type == OP_NOP && !VIsual_active)
 	return FALSE;
     clearopbeep(oap);
     return TRUE;
@@ -3830,7 +3696,6 @@ clearopbeep(oap)
     beep_flush();
 }
 
-#ifdef FEAT_VISUAL
 /*
  * Remove the shift modifier from a special key.
  */
@@ -3849,18 +3714,13 @@ unshift_special(cap)
     }
     cap->cmdchar = simplify_key(cap->cmdchar, &mod_mask);
 }
-#endif
 
 #if defined(FEAT_CMDL_INFO) || defined(PROTO)
 /*
  * Routines for displaying a partly typed command
  */
 
-#ifdef FEAT_VISUAL	/* need room for size of Visual area */
-# define SHOWCMD_BUFLEN SHOWCMD_COLS + 1 + 30
-#else
-# define SHOWCMD_BUFLEN SHOWCMD_COLS + 1
-#endif
+#define SHOWCMD_BUFLEN SHOWCMD_COLS + 1 + 30
 static char_u	showcmd_buf[SHOWCMD_BUFLEN];
 static char_u	old_showcmd_buf[SHOWCMD_BUFLEN];  /* For push_showcmd() */
 static int	showcmd_is_clear = TRUE;
@@ -3874,7 +3734,6 @@ clear_showcmd()
     if (!p_sc)
 	return;
 
-#ifdef FEAT_VISUAL
     if (VIsual_active && !char_avail())
     {
 	int		cursor_bot = lt(VIsual, curwin->w_cursor);
@@ -3960,7 +3819,6 @@ clear_showcmd()
 	showcmd_visual = TRUE;
     }
     else
-#endif
     {
 	showcmd_buf[0] = NUL;
 	showcmd_visual = FALSE;
@@ -4203,10 +4061,8 @@ check_scrollbind(topline_diff, leftcol_d
     int		want_hor;
     win_T	*old_curwin = curwin;
     buf_T	*old_curbuf = curbuf;
-#ifdef FEAT_VISUAL
     int		old_VIsual_select = VIsual_select;
     int		old_VIsual_active = VIsual_active;
-#endif
     colnr_T	tgt_leftcol = curwin->w_leftcol;
     long	topline;
     long	y;
@@ -4223,9 +4079,7 @@ check_scrollbind(topline_diff, leftcol_d
     /*
      * loop through the scrollbound windows and scroll accordingly
      */
-#ifdef FEAT_VISUAL
     VIsual_select = VIsual_active = 0;
-#endif
     for (curwin = firstwin; curwin; curwin = curwin->w_next)
     {
 	curbuf = curwin->w_buffer;
@@ -4280,10 +4134,8 @@ check_scrollbind(topline_diff, leftcol_d
     /*
      * reset current-window
      */
-#ifdef FEAT_VISUAL
     VIsual_select = old_VIsual_select;
     VIsual_active = old_VIsual_active;
-#endif
     curwin = old_curwin;
     curbuf = old_curbuf;
 }
@@ -5239,11 +5091,9 @@ dozet:
 
 		    if (checkclearop(cap->oap))
 			break;
-# ifdef FEAT_VISUAL
 		    if (VIsual_active && get_visual_text(cap, &ptr, &len)
 								      == FAIL)
 			return;
-# endif
 		    if (ptr == NULL)
 		    {
 			pos_T	pos = curwin->w_cursor;
@@ -5411,12 +5261,9 @@ nv_exmode(cap)
     /*
      * Ignore 'Q' in Visual mode, just give a beep.
      */
-#ifdef FEAT_VISUAL
     if (VIsual_active)
 	vim_beep();
-    else
-#endif
-	if (!checkclearop(cap->oap))
+    else if (!checkclearop(cap->oap))
 	do_exmode(FALSE);
 }
 
@@ -5430,11 +5277,9 @@ nv_colon(cap)
     int	    old_p_im;
     int	    cmd_result;
 
-#ifdef FEAT_VISUAL
     if (VIsual_active)
 	nv_operator(cap);
     else
-#endif
     {
 	if (cap->oap->op_type != OP_NOP)
 	{
@@ -5494,15 +5339,12 @@ nv_colon(cap)
 nv_ctrlg(cap)
     cmdarg_T *cap;
 {
-#ifdef FEAT_VISUAL
     if (VIsual_active)	/* toggle Selection/Visual mode */
     {
 	VIsual_select = !VIsual_select;
 	showmode();
     }
-    else
-#endif
-	if (!checkclearop(cap->oap))
+    else if (!checkclearop(cap->oap))
 	/* print full name if count given or :cd used */
 	fileinfo((int)cap->count0, FALSE, TRUE);
 }
@@ -5514,14 +5356,12 @@ nv_ctrlg(cap)
 nv_ctrlh(cap)
     cmdarg_T *cap;
 {
-#ifdef FEAT_VISUAL
     if (VIsual_active && VIsual_select)
     {
 	cap->cmdchar = 'x';	/* BS key behaves like 'x' in Select mode */
 	v_visop(cap);
     }
     else
-#endif
 	nv_left(cap);
 }
 
@@ -5558,7 +5398,6 @@ nv_clear(cap)
 nv_ctrlo(cap)
     cmdarg_T	*cap;
 {
-#ifdef FEAT_VISUAL
     if (VIsual_active && VIsual_select)
     {
 	VIsual_select = FALSE;
@@ -5566,7 +5405,6 @@ nv_ctrlo(cap)
 	restart_VIsual_select = 2;	/* restart Select mode later */
     }
     else
-#endif
     {
 	cap->count1 = -cap->count1;
 	nv_pcmark(cap);
@@ -5675,10 +5513,8 @@ nv_ident(cap)
      */
     if (cmdchar == ']' || cmdchar == Ctrl_RSB || cmdchar == 'K')
     {
-#ifdef FEAT_VISUAL
 	if (VIsual_active && get_visual_text(cap, &ptr, &n) == FAIL)
 	    return;
-#endif
 	if (checkclearopq(cap->oap))
 	    return;
     }
@@ -5872,7 +5708,6 @@ nv_ident(cap)
     vim_free(buf);
 }
 
-#if defined(FEAT_VISUAL) || defined(PROTO)
 /*
  * Get visually selected text, within one line only.
  * Returns FAIL if more than one line selected.
@@ -5917,7 +5752,6 @@ get_visual_text(cap, pp, lenp)
     reset_VIsual_and_resel();
     return OK;
 }
-#endif
 
 /*
  * CTRL-T: backwards in tag stack
@@ -6040,11 +5874,7 @@ nv_right(cap)
     cmdarg_T	*cap;
 {
     long	n;
-#ifdef FEAT_VISUAL
-    int		PAST_LINE;
-#else
-# define PAST_LINE 0
-#endif
+    int		past_line;
 
     if (mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL))
     {
@@ -6057,25 +5887,21 @@ nv_right(cap)
 
     cap->oap->motion_type = MCHAR;
     cap->oap->inclusive = FALSE;
-#ifdef FEAT_VISUAL
-    PAST_LINE = (VIsual_active && *p_sel != 'o');
-
-# ifdef FEAT_VIRTUALEDIT
+    past_line = (VIsual_active && *p_sel != 'o');
+
+#ifdef FEAT_VIRTUALEDIT
     /*
-     * In virtual mode, there's no such thing as "PAST_LINE", as lines are
-     * (theoretically) infinitely long.
+     * In virtual edit mode, there's no such thing as "past_line", as lines
+     * are (theoretically) infinitely long.
      */
     if (virtual_active())
-	PAST_LINE = 0;
-# endif
+	past_line = 0;
 #endif
 
     for (n = cap->count1; n > 0; --n)
     {
-	if ((!PAST_LINE && oneright() == FAIL)
-#ifdef FEAT_VISUAL
-		|| (PAST_LINE && *ml_get_cursor() == NUL)
-#endif
+	if ((!past_line && oneright() == FAIL)
+		|| (past_line && *ml_get_cursor() == NUL)
 		)
 	{
 	    /*
@@ -6123,26 +5949,24 @@ nv_right(cap)
 	    }
 	    break;
 	}
-#ifdef FEAT_VISUAL
-	else if (PAST_LINE)
+	else if (past_line)
 	{
 	    curwin->w_set_curswant = TRUE;
-# ifdef FEAT_VIRTUALEDIT
+#ifdef FEAT_VIRTUALEDIT
 	    if (virtual_active())
 		oneright();
 	    else
-# endif
-	    {
-# ifdef FEAT_MBYTE
+#endif
+	    {
+#ifdef FEAT_MBYTE
 		if (has_mbyte)
 		    curwin->w_cursor.col +=
 					 (*mb_ptr2len)(ml_get_cursor());
 		else
-# endif
+#endif
 		    ++curwin->w_cursor.col;
 	    }
 	}
-#endif
     }
 #ifdef FEAT_FOLDING
     if (n != cap->count1 && (fdo_flags & FDO_HOR) && KeyTyped
@@ -6503,9 +6327,7 @@ nv_csearch(cap)
 	else
 	    curwin->w_cursor.coladd = 0;
 #endif
-#ifdef FEAT_VISUAL
 	adjust_for_sel(cap);
-#endif
 #ifdef FEAT_FOLDING
 	if ((fdo_flags & FDO_HOR) && KeyTyped && cap->oap->op_type == OP_NOP)
 	    foldOpenCursor();
@@ -6754,7 +6576,6 @@ nv_brackets(cap)
 	    int	    dir = (cap->cmdchar == ']' && cap->nchar == 'p')
 							 ? FORWARD : BACKWARD;
 	    int	    regname = cap->oap->regname;
-#ifdef FEAT_VISUAL
 	    int	    was_visual = VIsual_active;
 	    int	    line_count = curbuf->b_ml.ml_line_count;
 	    pos_T   start, end;
@@ -6766,14 +6587,12 @@ nv_brackets(cap)
 		end =  equalpos(start,VIsual) ? curwin->w_cursor : VIsual;
 		curwin->w_cursor = (dir == BACKWARD ? start : end);
 	    }
-#endif
 # ifdef FEAT_CLIPBOARD
 	    adjust_clip_reg(&regname);
 # endif
 	    prep_redo_cmd(cap);
 
 	    do_put(regname, dir, cap->count1, PUT_FIXINDENT);
-#ifdef FEAT_VISUAL
 	    if (was_visual)
 	    {
 		VIsual = start;
@@ -6802,7 +6621,6 @@ nv_brackets(cap)
 		    redraw_later(SOME_VALID);
 		}
 	    }
-#endif
 	}
     }
 
@@ -6936,9 +6754,7 @@ nv_percent(cap)
 #ifdef FEAT_VIRTUALEDIT
 	    curwin->w_cursor.coladd = 0;
 #endif
-#ifdef FEAT_VISUAL
 	    adjust_for_sel(cap);
-#endif
 	}
     }
 #ifdef FEAT_FOLDING
@@ -7027,11 +6843,7 @@ nv_findpar(cap)
 nv_undo(cap)
     cmdarg_T	*cap;
 {
-    if (cap->oap->op_type == OP_LOWER
-#ifdef FEAT_VISUAL
-	    || VIsual_active
-#endif
-	    )
+    if (cap->oap->op_type == OP_LOWER || VIsual_active)
     {
 	/* translate "<Visual>u" to "<Visual>gu" and "guu" to "gugu" */
 	cap->cmdchar = 'g';
@@ -7089,7 +6901,6 @@ nv_replace(cap)
 	return;
     }
 
-#ifdef FEAT_VISUAL
     /* Visual mode "r" */
     if (VIsual_active)
     {
@@ -7105,7 +6916,6 @@ nv_replace(cap)
 	nv_operator(cap);
 	return;
     }
-#endif
 
 #ifdef FEAT_VIRTUALEDIT
     /* Break tabs, etc. */
@@ -7273,7 +7083,6 @@ nv_replace(cap)
     }
 }
 
-#ifdef FEAT_VISUAL
 /*
  * 'o': Exchange start and end of Visual area.
  * 'O': same, but in block mode exchange left and right corners.
@@ -7326,7 +7135,6 @@ v_swap_corners(cmdchar)
 	curwin->w_set_curswant = TRUE;
     }
 }
-#endif /* FEAT_VISUAL */
 
 /*
  * "R" (cap->arg is FALSE) and "gR" (cap->arg is TRUE).
@@ -7335,7 +7143,6 @@ v_swap_corners(cmdchar)
 nv_Replace(cap)
     cmdarg_T	    *cap;
 {
-#ifdef FEAT_VISUAL
     if (VIsual_active)		/* "R" is replace lines */
     {
 	cap->cmdchar = 'c';
@@ -7344,9 +7151,7 @@ nv_Replace(cap)
 	VIsual_mode = 'V';
 	nv_operator(cap);
     }
-    else
-#endif
-	if (!checkclearopq(cap->oap))
+    else if (!checkclearopq(cap->oap))
     {
 	if (!curbuf->b_p_ma)
 	    EMSG(_(e_modifiable));
@@ -7369,16 +7174,13 @@ nv_Replace(cap)
 nv_vreplace(cap)
     cmdarg_T	*cap;
 {
-# ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	cap->cmdchar = 'r';
 	cap->nchar = cap->extra_char;
 	nv_replace(cap);	/* Do same as "r" in Visual mode for now */
     }
-    else
-# endif
-	if (!checkclearopq(cap->oap))
+    else if (!checkclearopq(cap->oap))
     {
 	if (!curbuf->b_p_ma)
 	    EMSG(_(e_modifiable));
@@ -7525,7 +7327,6 @@ nv_cursormark(cap, flag, pos)
     curwin->w_set_curswant = TRUE;
 }
 
-#ifdef FEAT_VISUAL
 /*
  * Handle commands that are operators in Visual mode.
  */
@@ -7550,7 +7351,6 @@ v_visop(cap)
     cap->cmdchar = *(vim_strchr(trans, cap->cmdchar) + 1);
     nv_operator(cap);
 }
-#endif
 
 /*
  * "s" and "S" commands.
@@ -7559,7 +7359,6 @@ v_visop(cap)
 nv_subst(cap)
     cmdarg_T	*cap;
 {
-#ifdef FEAT_VISUAL
     if (VIsual_active)	/* "vs" and "vS" are the same as "vc" */
     {
 	if (cap->cmdchar == 'S')
@@ -7571,7 +7370,6 @@ nv_subst(cap)
 	nv_operator(cap);
     }
     else
-#endif
 	nv_optrans(cap);
 }
 
@@ -7585,12 +7383,10 @@ nv_abbrev(cap)
     if (cap->cmdchar == K_DEL || cap->cmdchar == K_KDEL)
 	cap->cmdchar = 'x';		/* DEL key behaves like 'x' */
 
-#ifdef FEAT_VISUAL
     /* in Visual mode these commands are operators */
     if (VIsual_active)
 	v_visop(cap);
     else
-#endif
 	nv_optrans(cap);
 }
 
@@ -7758,7 +7554,6 @@ nv_regname(cap)
 	clearopbeep(cap->oap);
 }
 
-#ifdef FEAT_VISUAL
 /*
  * Handle "v", "V" and "CTRL-V" commands.
  * Also for "gh", "gH" and "g^H" commands: Always start Select mode, cap->arg
@@ -7950,7 +7745,6 @@ n_start_visual_mode(c)
     }
 }
 
-#endif /* FEAT_VISUAL */
 
 /*
  * CTRL-W: Window commands
@@ -7975,10 +7769,8 @@ nv_suspend(cap)
     cmdarg_T	*cap;
 {
     clearop(cap->oap);
-#ifdef FEAT_VISUAL
     if (VIsual_active)
 	end_visual_mode();		/* stop Visual mode */
-#endif
     do_cmdline_cmd((char_u *)"st");
 }
 
@@ -7990,9 +7782,7 @@ nv_g_cmd(cap)
     cmdarg_T	*cap;
 {
     oparg_T	*oap = cap->oap;
-#ifdef FEAT_VISUAL
     pos_T	tpos;
-#endif
     int		i;
     int		flag = FALSE;
 
@@ -8025,7 +7815,6 @@ nv_g_cmd(cap)
 	do_cmdline_cmd((char_u *)"%s//~/&");
 	break;
 
-#ifdef FEAT_VISUAL
     /*
      * "gv": Reselect the previous Visual area.  If Visual already active,
      *	     exchange previous and current Visual area.
@@ -8126,7 +7915,6 @@ nv_g_cmd(cap)
 	cap->arg = TRUE;
 	nv_visual(cap);
 	break;
-#endif /* FEAT_VISUAL */
 
     /* "gn", "gN" visually select next/previous search match
      * "gn" selects next match
@@ -8134,9 +7922,7 @@ nv_g_cmd(cap)
      */
     case 'N':
     case 'n':
-#ifdef FEAT_VISUAL
 	if (!current_search(cap->count1, cap->nchar == 'n'))
-#endif
 	    clearopbeep(oap);
 	break;
 
@@ -8258,9 +8044,7 @@ nv_g_cmd(cap)
 				    && vim_iswhite(ptr[curwin->w_cursor.col]))
 		--curwin->w_cursor.col;
 	    curwin->w_set_curswant = TRUE;
-#ifdef FEAT_VISUAL
 	    adjust_for_sel(cap);
-#endif
 	}
 	break;
 
@@ -8657,11 +8441,7 @@ nv_Undo(cap)
     cmdarg_T	*cap;
 {
     /* In Visual mode and typing "gUU" triggers an operator */
-    if (cap->oap->op_type == OP_UPPER
-#ifdef FEAT_VISUAL
-	    || VIsual_active
-#endif
-	    )
+    if (cap->oap->op_type == OP_UPPER || VIsual_active)
     {
 	/* translate "gUU" to "gUgU" */
 	cap->cmdchar = 'g';
@@ -8683,11 +8463,7 @@ nv_Undo(cap)
 nv_tilde(cap)
     cmdarg_T	*cap;
 {
-    if (!p_to
-#ifdef FEAT_VISUAL
-	    && !VIsual_active
-#endif
-	    && cap->oap->op_type != OP_TILDE)
+    if (!p_to && !VIsual_active && cap->oap->op_type != OP_TILDE)
 	n_swapchar(cap);
     else
 	nv_operator(cap);
@@ -8906,9 +8682,7 @@ nv_wordcmd(cap)
 	clearopbeep(cap->oap);
     else
     {
-#ifdef FEAT_VISUAL
 	adjust_for_sel(cap);
-#endif
 #ifdef FEAT_FOLDING
 	if ((fdo_flags & FDO_HOR) && KeyTyped && cap->oap->op_type == OP_NOP)
 	    foldOpenCursor();
@@ -8931,9 +8705,7 @@ adjust_cursor(oap)
      * - 'virtualedit' is not "all" and not "onemore".
      */
     if (curwin->w_cursor.col > 0 && gchar_cursor() == NUL
-#ifdef FEAT_VISUAL
 		&& (!VIsual_active || *p_sel == 'o')
-#endif
 #ifdef FEAT_VIRTUALEDIT
 		&& !virtual_active() && (ve_flags & VE_ONEMORE) == 0
 #endif
@@ -8968,7 +8740,6 @@ nv_beginline(cap)
 			       one-character line). */
 }
 
-#ifdef FEAT_VISUAL
 /*
  * In exclusive Visual mode, may include the last character.
  */
@@ -8979,11 +8750,11 @@ adjust_for_sel(cap)
     if (VIsual_active && cap->oap->inclusive && *p_sel == 'e'
 	    && gchar_cursor() != NUL && lt(VIsual, curwin->w_cursor))
     {
-# ifdef FEAT_MBYTE
+#ifdef FEAT_MBYTE
 	if (has_mbyte)
 	    inc_cursor();
 	else
-# endif
+#endif
 	    ++curwin->w_cursor.col;
 	cap->oap->inclusive = FALSE;
     }
@@ -9044,7 +8815,6 @@ nv_select(cap)
     }
 }
 
-#endif
 
 /*
  * "G", "gg", CTRL-END, CTRL-HOME.
@@ -9095,13 +8865,11 @@ nv_normal(cap)
 	if (cmdwin_type != 0)
 	    cmdwin_result = Ctrl_C;
 #endif
-#ifdef FEAT_VISUAL
 	if (VIsual_active)
 	{
 	    end_visual_mode();		/* stop Visual */
 	    redraw_curbuf_later(INVERTED);
 	}
-#endif
 	/* CTRL-\ CTRL-G restarts Insert mode when 'insertmode' is set. */
 	if (cap->nchar == Ctrl_G && p_im)
 	    restart_edit = 'a';
@@ -9132,9 +8900,7 @@ nv_esc(cap)
 #ifdef FEAT_CMDWIN
 		&& cmdwin_type == 0
 #endif
-#ifdef FEAT_VISUAL
 		&& !VIsual_active
-#endif
 		&& no_reason)
 	    MSG(_("Type  :quit<Enter>  to exit Vim"));
 
@@ -9152,7 +8918,6 @@ nv_esc(cap)
 #endif
     }
 
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	end_visual_mode();	/* stop Visual */
@@ -9160,10 +8925,8 @@ nv_esc(cap)
 	curwin->w_set_curswant = TRUE;
 	redraw_curbuf_later(INVERTED);
     }
-    else
-#endif
-	if (no_reason)
-	    vim_beep();
+    else if (no_reason)
+	vim_beep();
     clearop(cap->oap);
 
     /* A CTRL-C is often used at the start of a menu.  When 'insertmode' is
@@ -9187,20 +8950,13 @@ nv_edit(cap)
     if (cap->cmdchar == K_INS || cap->cmdchar == K_KINS)
 	cap->cmdchar = 'i';
 
-#ifdef FEAT_VISUAL
     /* in Visual mode "A" and "I" are an operator */
     if (VIsual_active && (cap->cmdchar == 'A' || cap->cmdchar == 'I'))
 	v_visop(cap);
 
     /* in Visual mode and after an operator "a" and "i" are for text objects */
-    else
-#endif
-	if ((cap->cmdchar == 'a' || cap->cmdchar == 'i')
-	    && (cap->oap->op_type != OP_NOP
-#ifdef FEAT_VISUAL
-		|| VIsual_active
-#endif
-		))
+    else if ((cap->cmdchar == 'a' || cap->cmdchar == 'i')
+	    && (cap->oap->op_type != OP_NOP || VIsual_active))
     {
 #ifdef FEAT_TEXTOBJ
 	nv_object(cap);
@@ -9467,12 +9223,9 @@ nv_halfpage(cap)
 nv_join(cap)
     cmdarg_T *cap;
 {
-#ifdef FEAT_VISUAL
     if (VIsual_active)	/* join the visual lines */
 	nv_operator(cap);
-    else
-#endif
-	if (!checkclearop(cap->oap))
+    else if (!checkclearop(cap->oap))
     {
 	if (cap->count0 <= 1)
 	    cap->count0 = 2;	    /* default for join is two lines! */
@@ -9495,12 +9248,10 @@ nv_join(cap)
 nv_put(cap)
     cmdarg_T  *cap;
 {
-#ifdef FEAT_VISUAL
     int		regname = 0;
     void	*reg1 = NULL, *reg2 = NULL;
     int		empty = FALSE;
     int		was_visual = FALSE;
-#endif
     int		dir;
     int		flags = 0;
 
@@ -9526,7 +9277,6 @@ nv_put(cap)
 	if (cap->cmdchar == 'g')
 	    flags |= PUT_CURSEND;
 
-#ifdef FEAT_VISUAL
 	if (VIsual_active)
 	{
 	    /* Putting in Visual mode: The put text replaces the selected
@@ -9536,14 +9286,14 @@ nv_put(cap)
 	     */
 	    was_visual = TRUE;
 	    regname = cap->oap->regname;
-# ifdef FEAT_CLIPBOARD
+#ifdef FEAT_CLIPBOARD
 	    adjust_clip_reg(&regname);
-# endif
+#endif
 	   if (regname == 0 || regname == '"'
 				     || VIM_ISDIGIT(regname) || regname == '-'
-# ifdef FEAT_CLIPBOARD
+#ifdef FEAT_CLIPBOARD
 		    || (clip_unnamed && (regname == '*' || regname == '+'))
-# endif
+#endif
 
 		    )
 	    {
@@ -9591,10 +9341,8 @@ nv_put(cap)
 	    /* May have been reset in do_put(). */
 	    VIsual_active = TRUE;
 	}
-#endif
 	do_put(cap->oap->regname, dir, cap->count1, flags);
 
-#ifdef FEAT_VISUAL
 	/* If a register was saved, put it back now. */
 	if (reg2 != NULL)
 	    put_register(regname, reg2);
@@ -9621,7 +9369,6 @@ nv_put(cap)
 		coladvance((colnr_T)MAXCOL);
 	    }
 	}
-#endif
 	auto_format(FALSE, TRUE);
     }
 }
@@ -9642,11 +9389,9 @@ nv_open(cap)
     }
     else
 #endif
-#ifdef FEAT_VISUAL
     if (VIsual_active)  /* switch start and end of visual */
 	v_swap_corners(cap->cmdchar);
     else
-#endif
 	n_opencmd(cap);
 }
 
--- a/src/ops.c
+++ b/src/ops.c
@@ -57,9 +57,7 @@ static struct yankreg
     char_u	**y_array;	/* pointer to array of line pointers */
     linenr_T	y_size;		/* number of lines in y_array */
     char_u	y_type;		/* MLINE, MCHAR or MBLOCK */
-#ifdef FEAT_VISUAL
     colnr_T	y_width;	/* only set if y_type == MBLOCK */
-#endif
 } y_regs[NUM_REGISTERS];
 
 static struct yankreg	*y_current;	    /* ptr to current yankreg */
@@ -107,17 +105,13 @@ static void	free_yank_all __ARGS((void))
 static int	yank_copy_line __ARGS((struct block_def *bd, long y_idx));
 #ifdef FEAT_CLIPBOARD
 static void	copy_yank_reg __ARGS((struct yankreg *reg));
-# if defined(FEAT_VISUAL) || defined(FEAT_EVAL)
 static void	may_set_selection __ARGS((void));
-# endif
 #endif
 static void	dis_msg __ARGS((char_u *p, int skip_esc));
 #if defined(FEAT_COMMENTS) || defined(PROTO)
 static char_u	*skip_comment __ARGS((char_u *line, int process, int include_space, int *is_comment));
 #endif
-#ifdef FEAT_VISUAL
 static void	block_prep __ARGS((oparg_T *oap, struct block_def *, linenr_T, int));
-#endif
 #if defined(FEAT_CLIPBOARD) || defined(FEAT_EVAL)
 static void	str_to_reg __ARGS((struct yankreg *y_ptr, int type, char_u *str, long len, long blocklen));
 #endif
@@ -187,7 +181,6 @@ get_op_type(char1, char2)
     return i;
 }
 
-#if defined(FEAT_VISUAL) || defined(PROTO)
 /*
  * Return TRUE if operator "op" always works on whole lines.
  */
@@ -197,7 +190,6 @@ op_on_lines(op)
 {
     return opchars[op][2];
 }
-#endif
 
 /*
  * Get first operator command character.
@@ -232,18 +224,14 @@ op_shift(oap, curs_top, amount)
     long	    i;
     int		    first_char;
     char_u	    *s;
-#ifdef FEAT_VISUAL
     int		    block_col = 0;
-#endif
 
     if (u_save((linenr_T)(oap->start.lnum - 1),
 				       (linenr_T)(oap->end.lnum + 1)) == FAIL)
 	return;
 
-#ifdef FEAT_VISUAL
     if (oap->block_mode)
 	block_col = curwin->w_cursor.col;
-#endif
 
     for (i = oap->line_count; --i >= 0; )
     {
@@ -272,15 +260,12 @@ op_shift(oap, curs_top, amount)
     foldOpenCursor();
 #endif
 
-#ifdef FEAT_VISUAL
     if (oap->block_mode)
     {
 	curwin->w_cursor.lnum = oap->start.lnum;
 	curwin->w_cursor.col = block_col;
     }
-    else
-#endif
-	if (curs_top)	    /* put cursor on first line, for ">>" */
+    else if (curs_top)	    /* put cursor on first line, for ">>" */
     {
 	curwin->w_cursor.lnum = oap->start.lnum;
 	beginline(BL_SOL | BL_FIX);   /* shift_line() may have set cursor.col */
@@ -733,14 +718,10 @@ op_reindent(oap, how)
      * there is no change still need to remove the Visual highlighting. */
     if (last_changed != 0)
 	changed_lines(first_changed, 0,
-#ifdef FEAT_VISUAL
 		oap->is_VIsual ? start_lnum + oap->line_count :
-#endif
 		last_changed + 1, 0L);
-#ifdef FEAT_VISUAL
     else if (oap->is_VIsual)
 	redraw_curbuf_later(INVERTED);
-#endif
 
     if (oap->line_count > p_report)
     {
@@ -948,7 +929,6 @@ may_get_selection(regname)
 }
 #endif
 
-#if defined(FEAT_VISUAL) || defined(PROTO)
 /*
  * Obtain the contents of a "normal" register. The register is made empty.
  * The returned pointer has allocated memory, use put_register() later.
@@ -1016,10 +996,10 @@ put_register(name, reg)
     *y_current = *(struct yankreg *)reg;
     vim_free(reg);
 
-# ifdef FEAT_CLIPBOARD
+#ifdef FEAT_CLIPBOARD
     /* Send text written to clipboard register to the clipboard. */
     may_set_selection();
-# endif
+#endif
 }
 
     void
@@ -1034,7 +1014,6 @@ free_register(reg)
     vim_free(reg);
     *y_current = tmp;
 }
-#endif
 
 #if defined(FEAT_MOUSE) || defined(PROTO)
 /*
@@ -1634,10 +1613,8 @@ op_delete(oap)
     int			n;
     linenr_T		lnum;
     char_u		*ptr;
-#ifdef FEAT_VISUAL
     char_u		*newp, *oldp;
     struct block_def	bd;
-#endif
     linenr_T		old_lcount = curbuf->b_ml.ml_line_count;
     int			did_yank = FALSE;
     int			orig_regname = oap->regname;
@@ -1670,10 +1647,8 @@ op_delete(oap)
      * delete linewise.  Don't do this for the change command or Visual mode.
      */
     if (       oap->motion_type == MCHAR
-#ifdef FEAT_VISUAL
 	    && !oap->is_VIsual
 	    && !oap->block_mode
-#endif
 	    && oap->line_count > 1
 	    && oap->motion_force == NUL
 	    && oap->op_type == OP_DELETE)
@@ -1787,7 +1762,6 @@ op_delete(oap)
 	}
     }
 
-#ifdef FEAT_VISUAL
     /*
      * block mode delete
      */
@@ -1838,9 +1812,7 @@ op_delete(oap)
 						       oap->end.lnum + 1, 0L);
 	oap->line_count = 0;	    /* no lines deleted */
     }
-    else
-#endif
-	if (oap->motion_type == MLINE)
+    else if (oap->motion_type == MLINE)
     {
 	if (oap->op_type == OP_CHANGE)
 	{
@@ -1924,13 +1896,10 @@ op_delete(oap)
 		return FAIL;
 
 	    /* if 'cpoptions' contains '$', display '$' at end of change */
-	    if (	   vim_strchr(p_cpo, CPO_DOLLAR) != NULL
+	    if (       vim_strchr(p_cpo, CPO_DOLLAR) != NULL
 		    && oap->op_type == OP_CHANGE
 		    && oap->end.lnum == curwin->w_cursor.lnum
-#ifdef FEAT_VISUAL
-		    && !oap->is_VIsual
-#endif
-		    )
+		    && !oap->is_VIsual)
 		display_dollar(oap->end.col - !oap->inclusive);
 
 	    n = oap->end.col - oap->start.col + 1 - !oap->inclusive;
@@ -1967,11 +1936,8 @@ op_delete(oap)
 	    }
 	    else
 	    {
-		(void)del_bytes((long)n, !virtual_op, oap->op_type == OP_DELETE
-#ifdef FEAT_VISUAL
-				    && !oap->is_VIsual
-#endif
-							);
+		(void)del_bytes((long)n, !virtual_op,
+				oap->op_type == OP_DELETE && !oap->is_VIsual);
 	    }
 	}
 	else				/* delete characters between lines */
@@ -2008,11 +1974,8 @@ op_delete(oap)
 	    {
 		/* delete from start of line until op_end */
 		curwin->w_cursor.col = 0;
-		(void)del_bytes((long)n, !virtual_op, oap->op_type == OP_DELETE
-#ifdef FEAT_VISUAL
-					&& !oap->is_VIsual
-#endif
-							    );
+		(void)del_bytes((long)n, !virtual_op,
+				oap->op_type == OP_DELETE && !oap->is_VIsual);
 		curwin->w_cursor = curpos;	/* restore curwin->w_cursor */
 	    }
 	    if (curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count)
@@ -2025,14 +1988,12 @@ op_delete(oap)
 #ifdef FEAT_VIRTUALEDIT
 setmarks:
 #endif
-#ifdef FEAT_VISUAL
     if (oap->block_mode)
     {
 	curbuf->b_op_end.lnum = oap->end.lnum;
 	curbuf->b_op_end.col = oap->start.col;
     }
     else
-#endif
 	curbuf->b_op_end = oap->start;
     curbuf->b_op_start = oap->start;
 
@@ -2318,9 +2279,7 @@ op_tilde(oap)
     oparg_T	*oap;
 {
     pos_T		pos;
-#ifdef FEAT_VISUAL
     struct block_def	bd;
-#endif
     int			did_change = FALSE;
 
     if (u_save((linenr_T)(oap->start.lnum - 1),
@@ -2328,7 +2287,6 @@ op_tilde(oap)
 	return;
 
     pos = oap->start;
-#ifdef FEAT_VISUAL
     if (oap->block_mode)		    /* Visual block mode */
     {
 	for (; pos.lnum <= oap->end.lnum; ++pos.lnum)
@@ -2340,7 +2298,7 @@ op_tilde(oap)
 	    one_change = swapchars(oap->op_type, &pos, bd.textlen);
 	    did_change |= one_change;
 
-# ifdef FEAT_NETBEANS_INTG
+#ifdef FEAT_NETBEANS_INTG
 	    if (netbeans_active() && one_change)
 	    {
 		char_u *ptr = ml_get_buf(curbuf, pos.lnum, FALSE);
@@ -2350,13 +2308,12 @@ op_tilde(oap)
 		netbeans_inserted(curbuf, pos.lnum, bd.textcol,
 						&ptr[bd.textcol], bd.textlen);
 	    }
-# endif
+#endif
 	}
 	if (did_change)
 	    changed_lines(oap->start.lnum, 0, oap->end.lnum + 1, 0L);
     }
     else				    /* not block mode */
-#endif
     {
 	if (oap->motion_type == MLINE)
 	{
@@ -2412,11 +2369,9 @@ op_tilde(oap)
 	}
     }
 
-#ifdef FEAT_VISUAL
     if (!did_change && oap->is_VIsual)
 	/* No change: need to remove the Visual selection */
 	redraw_curbuf_later(INVERTED);
-#endif
 
     /*
      * Set '[ and '] marks.
@@ -3018,10 +2973,8 @@ op_yank(oap, deleting, mess)
     if (       oap->motion_type == MCHAR
 	    && oap->start.col == 0
 	    && !oap->inclusive
-#ifdef FEAT_VISUAL
 	    && (!oap->is_VIsual || *p_sel == 'o')
 	    && !oap->block_mode
-#endif
 	    && oap->end.col == 0
 	    && yanklines > 1)
     {
@@ -3032,9 +2985,7 @@ op_yank(oap, deleting, mess)
 
     y_current->y_size = yanklines;
     y_current->y_type = yanktype;   /* set the yank register type */
-#ifdef FEAT_VISUAL
     y_current->y_width = 0;
-#endif
     y_current->y_array = (char_u **)lalloc_clear((long_u)(sizeof(char_u *) *
 							    yanklines), TRUE);
 
@@ -3047,7 +2998,6 @@ op_yank(oap, deleting, mess)
     y_idx = 0;
     lnum = oap->start.lnum;
 
-#ifdef FEAT_VISUAL
     if (oap->block_mode)
     {
 	/* Visual block mode */
@@ -3057,19 +3007,16 @@ op_yank(oap, deleting, mess)
 	if (curwin->w_curswant == MAXCOL && y_current->y_width > 0)
 	    y_current->y_width--;
     }
-#endif
 
     for ( ; lnum <= yankendlnum; lnum++, y_idx++)
     {
 	switch (y_current->y_type)
 	{
-#ifdef FEAT_VISUAL
 	    case MBLOCK:
 		block_prep(oap, &bd, lnum, FALSE);
 		if (yank_copy_line(&bd, y_idx) == FAIL)
 		    goto fail;
 		break;
-#endif
 
 	    case MLINE:
 		if ((y_current->y_array[y_idx] =
@@ -3206,9 +3153,7 @@ op_yank(oap, deleting, mess)
     if (mess)			/* Display message about yank? */
     {
 	if (yanktype == MCHAR
-#ifdef FEAT_VISUAL
 		&& !oap->block_mode
-#endif
 		&& yanklines == 1)
 	    yanklines = 0;
 	/* Some versions of Vi use ">=" here, some don't...  */
@@ -3218,17 +3163,13 @@ op_yank(oap, deleting, mess)
 	    update_topline_redraw();
 	    if (yanklines == 1)
 	    {
-#ifdef FEAT_VISUAL
 		if (oap->block_mode)
 		    MSG(_("block of 1 line yanked"));
 		else
-#endif
 		    MSG(_("1 line yanked"));
 	    }
-#ifdef FEAT_VISUAL
 	    else if (oap->block_mode)
 		smsg((char_u *)_("block of %ld lines yanked"), yanklines);
-#endif
 	    else
 		smsg((char_u *)_("%ld lines yanked"), yanklines);
 	}
@@ -3239,11 +3180,7 @@ op_yank(oap, deleting, mess)
      */
     curbuf->b_op_start = oap->start;
     curbuf->b_op_end = oap->end;
-    if (yanktype == MLINE
-#ifdef FEAT_VISUAL
-		&& !oap->block_mode
-#endif
-       )
+    if (yanktype == MLINE && !oap->block_mode)
     {
 	curbuf->b_op_start.col = 0;
 	curbuf->b_op_end.col = MAXCOL;
@@ -3380,7 +3317,6 @@ do_put(regname, dir, count, flags)
     long	i;			/* index in y_array[] */
     int		y_type;
     long	y_size;
-#ifdef FEAT_VISUAL
     int		oldlen;
     long	y_width = 0;
     colnr_T	vcol;
@@ -3388,7 +3324,6 @@ do_put(regname, dir, count, flags)
     int		incr = 0;
     long	j;
     struct block_def bd;
-#endif
     char_u	**y_array = NULL;
     long	nr_lines = 0;
     pos_T	new_cursor;
@@ -3497,14 +3432,11 @@ do_put(regname, dir, count, flags)
 	get_yank_register(regname, FALSE);
 
 	y_type = y_current->y_type;
-#ifdef FEAT_VISUAL
 	y_width = y_current->y_width;
-#endif
 	y_size = y_current->y_size;
 	y_array = y_current->y_array;
     }
 
-#ifdef FEAT_VISUAL
     if (y_type == MLINE)
     {
 	if (flags & PUT_LINE_SPLIT)
@@ -3535,7 +3467,6 @@ do_put(regname, dir, count, flags)
 	curbuf->b_op_start = curwin->w_cursor;	/* default for '[ mark */
 	curbuf->b_op_end = curwin->w_cursor;	/* default for '] mark */
     }
-#endif
 
     if (flags & PUT_LINE)	/* :put command or "p" in Visual line mode. */
 	y_type = MLINE;
@@ -3547,7 +3478,6 @@ do_put(regname, dir, count, flags)
 	goto end;
     }
 
-#ifdef FEAT_VISUAL
     if (y_type == MBLOCK)
     {
 	lnum = curwin->w_cursor.lnum + y_size + 1;
@@ -3556,9 +3486,7 @@ do_put(regname, dir, count, flags)
 	if (u_save(curwin->w_cursor.lnum - 1, lnum) == FAIL)
 	    goto end;
     }
-    else
-#endif
-	if (y_type == MLINE)
+    else if (y_type == MLINE)
     {
 	lnum = curwin->w_cursor.lnum;
 #ifdef FEAT_FOLDING
@@ -3610,7 +3538,6 @@ do_put(regname, dir, count, flags)
     lnum = curwin->w_cursor.lnum;
     col = curwin->w_cursor.col;
 
-#ifdef FEAT_VISUAL
     /*
      * Block mode
      */
@@ -3792,7 +3719,6 @@ do_put(regname, dir, count, flags)
 	    curwin->w_cursor.lnum = lnum;
     }
     else
-#endif
     {
 	/*
 	 * Character or Line mode
@@ -3866,17 +3792,9 @@ do_put(regname, dir, count, flags)
 			curwin->w_cursor.col += (colnr_T)(totlen - 1);
 		    }
 		}
-#ifdef FEAT_VISUAL
 		if (VIsual_active)
 		    lnum++;
-#endif
-	    } while (
-#ifdef FEAT_VISUAL
-		    VIsual_active && lnum <= curbuf->b_visual.vi_end.lnum
-#else
-		    FALSE /* stop after 1 paste */
-#endif
-		    );
+	    } while (VIsual_active && lnum <= curbuf->b_visual.vi_end.lnum);
 
 	    curbuf->b_op_end = curwin->w_cursor;
 	    /* For "CTRL-O p" in Insert mode, put cursor after last char */
@@ -4038,9 +3956,7 @@ end:
     if (regname == '=')
 	vim_free(y_array);
 
-#ifdef FEAT_VISUAL
     VIsual_active = FALSE;
-#endif
 
     /* If the cursor is past the end of the line put it at the end. */
     adjust_cursor_eol();
@@ -4729,11 +4645,9 @@ op_format(oap, keep_cursor)
 	return;
     curwin->w_cursor = oap->start;
 
-#ifdef FEAT_VISUAL
     if (oap->is_VIsual)
 	/* When there is no change: need to remove the Visual selection */
 	redraw_curbuf_later(INVERTED);
-#endif
 
     /* Set '[ mark at the start of the formatted area */
     curbuf->b_op_start = oap->start;
@@ -4765,7 +4679,6 @@ op_format(oap, keep_cursor)
 	saved_cursor.lnum = 0;
     }
 
-#ifdef FEAT_VISUAL
     if (oap->is_VIsual)
     {
 	win_T	*wp;
@@ -4783,7 +4696,6 @@ op_format(oap, keep_cursor)
 	    }
 	}
     }
-#endif
 }
 
 #if defined(FEAT_EVAL) || defined(PROTO)
@@ -4794,11 +4706,9 @@ op_format(oap, keep_cursor)
 op_formatexpr(oap)
     oparg_T	*oap;
 {
-# ifdef FEAT_VISUAL
     if (oap->is_VIsual)
 	/* When there is no change: need to remove the Visual selection */
 	redraw_curbuf_later(INVERTED);
-# endif
 
     if (fex_format(oap->start.lnum, oap->line_count, NUL) != 0)
 	/* As documented: when 'formatexpr' returns non-zero fall back to
@@ -5238,7 +5148,6 @@ paragraph_start(lnum)
     return FALSE;
 }
 
-#ifdef FEAT_VISUAL
 /*
  * prepare a few things for block mode yank/delete/tilde
  *
@@ -5397,7 +5306,6 @@ block_prep(oap, bdp, lnum, is_del)
     bdp->textcol = (colnr_T) (pstart - line);
     bdp->textstart = pstart;
 }
-#endif /* FEAT_VISUAL */
 
 #ifdef FEAT_RIGHTLEFT
 static void reverse_line __ARGS((char_u *s));
@@ -5748,19 +5656,13 @@ read_viminfo_register(virp, force)
 	str = skipwhite(skiptowhite(str));
 	if (STRNCMP(str, "CHAR", 4) == 0)
 	    y_current->y_type = MCHAR;
-#ifdef FEAT_VISUAL
 	else if (STRNCMP(str, "BLOCK", 5) == 0)
 	    y_current->y_type = MBLOCK;
-#endif
 	else
 	    y_current->y_type = MLINE;
 	/* get the block width; if it's missing we get a zero, which is OK */
 	str = skipwhite(skiptowhite(str));
-#ifdef FEAT_VISUAL
 	y_current->y_width = getdigits(&str);
-#else
-	(void)getdigits(&str);
-#endif
     }
 
     while (!(eof = viminfo_readline(virp))
@@ -5868,11 +5770,9 @@ write_viminfo_registers(fp)
 	    case MCHAR:
 		type = (char_u *)"CHAR";
 		break;
-#ifdef FEAT_VISUAL
 	    case MBLOCK:
 		type = (char_u *)"BLOCK";
 		break;
-#endif
 	    default:
 		sprintf((char *)IObuff, _("E574: Unknown register type %d"),
 							    y_regs[i].y_type);
@@ -5886,13 +5786,7 @@ write_viminfo_registers(fp)
 	fprintf(fp, "\"%c", c);
 	if (c == execreg_lastc)
 	    fprintf(fp, "@");
-	fprintf(fp, "\t%s\t%d\n", type,
-#ifdef FEAT_VISUAL
-		    (int)y_regs[i].y_width
-#else
-		    0
-#endif
-		    );
+	fprintf(fp, "\t%s\t%d\n", type, (int)y_regs[i].y_width);
 
 	/* If max_num_lines < 0, then we save ALL the lines in the register */
 	if (max_num_lines > 0 && num_lines > max_num_lines)
@@ -6039,10 +5933,8 @@ clip_get_selection(cbd)
 {
     struct yankreg *old_y_previous, *old_y_current;
     pos_T	old_cursor;
-#ifdef FEAT_VISUAL
     pos_T	old_visual;
     int		old_visual_mode;
-#endif
     colnr_T	old_curswant;
     int		old_set_curswant;
     pos_T	old_op_start, old_op_end;
@@ -6063,10 +5955,8 @@ clip_get_selection(cbd)
 	old_set_curswant = curwin->w_set_curswant;
 	old_op_start = curbuf->b_op_start;
 	old_op_end = curbuf->b_op_end;
-#ifdef FEAT_VISUAL
 	old_visual = VIsual;
 	old_visual_mode = VIsual_mode;
-#endif
 	clear_oparg(&oa);
 	oa.regname = (cbd == &clip_plus ? '+' : '*');
 	oa.op_type = OP_YANK;
@@ -6084,10 +5974,8 @@ clip_get_selection(cbd)
 	curwin->w_set_curswant = old_set_curswant;
 	curbuf->b_op_start = old_op_start;
 	curbuf->b_op_end = old_op_end;
-#ifdef FEAT_VISUAL
 	VIsual = old_visual;
 	VIsual_mode = old_visual_mode;
-#endif
     }
     else
     {
@@ -6190,7 +6078,6 @@ clip_convert_selection(str, len, cbd)
 }
 
 
-# if defined(FEAT_VISUAL) || defined(FEAT_EVAL)
 /*
  * If we have written to a clipboard register, send the text to the clipboard.
  */
@@ -6208,7 +6095,6 @@ may_set_selection()
 	clip_gen_set_selection(&clip_plus);
     }
 }
-# endif
 
 #endif /* FEAT_CLIPBOARD || PROTO */
 
@@ -6273,10 +6159,8 @@ get_reg_type(regname, reglen)
 
     if (y_current->y_array != NULL)
     {
-#ifdef FEAT_VISUAL
 	if (reglen != NULL && y_current->y_type == MBLOCK)
 	    *reglen = y_current->y_width;
-#endif
 	return y_current->y_type;
     }
     return MAUTO;
@@ -6454,11 +6338,6 @@ write_reg_contents_ex(name, str, maxlen,
     get_yank_register(name, TRUE);
     if (!y_append && !must_append)
 	free_yank_all();
-#ifndef FEAT_VISUAL
-    /* Just in case - make sure we don't use MBLOCK */
-    if (yank_type == MBLOCK)
-	yank_type = MAUTO;
-#endif
     str_to_reg(y_current, yank_type, str, len, block_len);
 
 # ifdef FEAT_CLIPBOARD
@@ -6496,9 +6375,7 @@ str_to_reg(y_ptr, yank_type, str, len, b
     int		append = FALSE;		/* append to last line in register */
     char_u	*s;
     char_u	**pp;
-#ifdef FEAT_VISUAL
     long	maxlen;
-#endif
 
     if (y_ptr->y_array == NULL)		/* NULL means empty register */
 	y_ptr->y_size = 0;
@@ -6539,9 +6416,7 @@ str_to_reg(y_ptr, yank_type, str, len, b
 	pp[lnum] = y_ptr->y_array[lnum];
     vim_free(y_ptr->y_array);
     y_ptr->y_array = pp;
-#ifdef FEAT_VISUAL
     maxlen = 0;
-#endif
 
     /*
      * Find the end of each line and save it into the array.
@@ -6552,10 +6427,8 @@ str_to_reg(y_ptr, yank_type, str, len, b
 	    if (str[i] == '\n')
 		break;
 	i -= start;			/* i is now length of line */
-#ifdef FEAT_VISUAL
 	if (i > maxlen)
 	    maxlen = i;
-#endif
 	if (append)
 	{
 	    --lnum;
@@ -6585,12 +6458,10 @@ str_to_reg(y_ptr, yank_type, str, len, b
     }
     y_ptr->y_type = type;
     y_ptr->y_size = lnum;
-# ifdef FEAT_VISUAL
     if (type == MBLOCK)
 	y_ptr->y_width = (blocklen < 0 ? maxlen - 1 : blocklen);
     else
 	y_ptr->y_width = 0;
-# endif
 }
 #endif /* FEAT_CLIPBOARD || FEAT_EVAL || PROTO */
 
@@ -6684,12 +6555,10 @@ cursor_pos_info()
     long	word_count_cursor = 0;
     int		eol_size;
     long	last_check = 100000L;
-#ifdef FEAT_VISUAL
     long	line_count_selected = 0;
     pos_T	min_pos, max_pos;
     oparg_T	oparg;
     struct block_def	bd;
-#endif
 
     /*
      * Compute the length of the file in characters.
@@ -6705,7 +6574,6 @@ cursor_pos_info()
 	else
 	    eol_size = 1;
 
-#ifdef FEAT_VISUAL
 	if (VIsual_active)
 	{
 	    if (lt(VIsual, curwin->w_cursor))
@@ -6749,7 +6617,6 @@ cursor_pos_info()
 	    }
 	    line_count_selected = max_pos.lnum - min_pos.lnum + 1;
 	}
-#endif
 
 	for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum)
 	{
@@ -6762,7 +6629,6 @@ cursor_pos_info()
 		last_check = byte_count + 100000L;
 	    }
 
-#ifdef FEAT_VISUAL
 	    /* Do extra processing for VIsual mode. */
 	    if (VIsual_active
 		    && lnum >= min_pos.lnum && lnum <= max_pos.lnum)
@@ -6773,13 +6639,13 @@ cursor_pos_info()
 		switch (VIsual_mode)
 		{
 		    case Ctrl_V:
-# ifdef FEAT_VIRTUALEDIT
+#ifdef FEAT_VIRTUALEDIT
 			virtual_op = virtual_active();
-# endif
+#endif
 			block_prep(&oparg, &bd, lnum, 0);
-# ifdef FEAT_VIRTUALEDIT
+#ifdef FEAT_VIRTUALEDIT
 			virtual_op = MAYBE;
-# endif
+#endif
 			s = bd.textstart;
 			len = (long)bd.textlen;
 			break;
@@ -6811,7 +6677,6 @@ cursor_pos_info()
 		}
 	    }
 	    else
-#endif
 	    {
 		/* In non-visual mode, check for the line the cursor is on */
 		if (lnum == curwin->w_cursor.lnum)
@@ -6833,7 +6698,6 @@ cursor_pos_info()
 	if (!curbuf->b_p_eol && curbuf->b_p_bin)
 	    byte_count -= eol_size;
 
-#ifdef FEAT_VISUAL
 	if (VIsual_active)
 	{
 	    if (VIsual_mode == Ctrl_V && curwin->w_curswant < MAXCOL)
@@ -6864,7 +6728,6 @@ cursor_pos_info()
 			byte_count_cursor, byte_count);
 	}
 	else
-#endif
 	{
 	    p = ml_get_curline();
 	    validate_virtcol();
--- a/src/option.c
+++ b/src/option.c
@@ -1629,11 +1629,7 @@ static struct vimoption
 #endif
 			    SCRIPTID_INIT},
     {"keymodel",    "km",   P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-#ifdef FEAT_VISUAL
 			    (char_u *)&p_km, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
 			    {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
     {"keywordprg",  "kp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
 			    (char_u *)&p_kp, PV_KP,
@@ -2190,19 +2186,11 @@ static struct vimoption
 			    (char_u *)&p_secure, PV_NONE,
 			    {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
     {"selection",   "sel",  P_STRING|P_VI_DEF,
-#ifdef FEAT_VISUAL
 			    (char_u *)&p_sel, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
 			    {(char_u *)"inclusive", (char_u *)0L}
 			    SCRIPTID_INIT},
     {"selectmode",  "slm",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
-#ifdef FEAT_VISUAL
 			    (char_u *)&p_slm, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
 			    {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
     {"sessionoptions", "ssop", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
 #ifdef FEAT_SESSION
@@ -2979,13 +2967,9 @@ static char *(p_wop_values[]) = {"tagfil
 static char *(p_wak_values[]) = {"yes", "menu", "no", NULL};
 #endif
 static char *(p_mousem_values[]) = {"extend", "popup", "popup_setpos", "mac", NULL};
-#ifdef FEAT_VISUAL
 static char *(p_sel_values[]) = {"inclusive", "exclusive", "old", NULL};
 static char *(p_slm_values[]) = {"mouse", "key", "cmd", NULL};
-#endif
-#ifdef FEAT_VISUAL
 static char *(p_km_values[]) = {"startsel", "stopsel", NULL};
-#endif
 #ifdef FEAT_BROWSE
 static char *(p_bsdir_values[]) = {"current", "last", "buffer", NULL};
 #endif
@@ -6578,7 +6562,6 @@ did_set_string_option(opt_idx, varp, new
     }
 #endif
 
-#ifdef FEAT_VISUAL
     /* 'selection' */
     else if (varp == &p_sel)
     {
@@ -6593,7 +6576,6 @@ did_set_string_option(opt_idx, varp, new
 	if (check_opt_strings(p_slm, p_slm_values, TRUE) != OK)
 	    errmsg = e_invarg;
     }
-#endif
 
 #ifdef FEAT_BROWSE
     /* 'browsedir' */
@@ -6605,7 +6587,6 @@ did_set_string_option(opt_idx, varp, new
     }
 #endif
 
-#ifdef FEAT_VISUAL
     /* 'keymodel' */
     else if (varp == &p_km)
     {
@@ -6617,7 +6598,6 @@ did_set_string_option(opt_idx, varp, new
 	    km_startsel = (vim_strchr(p_km, 'a') != NULL);
 	}
     }
-#endif
 
     /* 'mousemodel' */
     else if (varp == &p_mousem)
--- a/src/option.h
+++ b/src/option.h
@@ -572,9 +572,7 @@ EXTERN char_u	*p_isi;		/* 'isident' */
 EXTERN char_u	*p_isp;		/* 'isprint' */
 EXTERN int	p_js;		/* 'joinspaces' */
 EXTERN char_u	*p_kp;		/* 'keywordprg' */
-#ifdef FEAT_VISUAL
 EXTERN char_u	*p_km;		/* 'keymodel' */
-#endif
 #ifdef FEAT_LANGMAP
 EXTERN char_u	*p_langmap;	/* 'langmap'*/
 #endif
@@ -681,10 +679,8 @@ EXTERN char_u	*p_sbo;		/* 'scrollopt' */
 #endif
 EXTERN char_u	*p_sections;	/* 'sections' */
 EXTERN int	p_secure;	/* 'secure' */
-#ifdef FEAT_VISUAL
 EXTERN char_u	*p_sel;		/* 'selection' */
 EXTERN char_u	*p_slm;		/* 'selectmode' */
-#endif
 #ifdef FEAT_SESSION
 EXTERN char_u	*p_ssop;	/* 'sessionoptions' */
 EXTERN unsigned	ssop_flags;
--- a/src/os_msdos.c
+++ b/src/os_msdos.c
@@ -2270,9 +2270,7 @@ clip_mch_request_selection(VimClipboard 
 		default:
 		case 'L':	type = MLINE;	break;
 		case 'C':	type = MCHAR;	break;
-#ifdef FEAT_VISUAL
 		case 'B':	type = MBLOCK;	break;
-#endif
 	    }
 	}
 
@@ -2799,9 +2797,7 @@ Win16SetClipboardData(
 	    default:
 	    case MLINE:	    clip_sel_type = "L";	break;
 	    case MCHAR:	    clip_sel_type = "C";	break;
-#ifdef FEAT_VISUAL
 	    case MBLOCK:    clip_sel_type = "B";	break;
-#endif
 	}
 
 	movedata(
--- a/src/os_qnx.c
+++ b/src/os_qnx.c
@@ -78,9 +78,7 @@ clip_mch_request_selection(VimClipboard 
 		default: /* fallthrough to line type */
 		case 'L': type = MLINE; break;
 		case 'C': type = MCHAR; break;
-#ifdef FEAT_VISUAL
 		case 'B': type = MBLOCK; break;
-#endif
 	    }
 	    is_type_set = TRUE;
 	}
@@ -143,9 +141,7 @@ clip_mch_set_selection(VimClipboard *cbd
 		default: /* fallthrough to MLINE */
 		case MLINE:	*vim_clip = 'L'; break;
 		case MCHAR:	*vim_clip = 'C'; break;
-#ifdef FEAT_VISUAL
 		case MBLOCK:	*vim_clip = 'B'; break;
-#endif
 	    }
 
 	    vim_strncpy(text_clip, str, len);
--- a/src/os_win32.h
+++ b/src/os_win32.h
@@ -68,7 +68,7 @@
 #endif
 
 #define USE_FNAME_CASE		/* adjust case of file names */
-#if !defined(FEAT_CLIPBOARD) && defined(FEAT_VISUAL) && defined(FEAT_MOUSE)
+#if !defined(FEAT_CLIPBOARD) && defined(FEAT_MOUSE)
 # define FEAT_CLIPBOARD		/* include clipboard support */
 #endif
 #if defined(__DATE__) && defined(__TIME__)
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -2347,9 +2347,7 @@ ex_copen(eap)
     else
 	height = QF_WINHEIGHT;
 
-#ifdef FEAT_VISUAL
     reset_VIsual_and_resel();			/* stop Visual mode */
-#endif
 #ifdef FEAT_GUI
     need_mouse_correct = TRUE;
 #endif
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -4179,9 +4179,8 @@ reg_prev_class()
 			    - (*mb_head_off)(regline, reginput - 1), reg_buf);
     return -1;
 }
-
-#endif
-#ifdef FEAT_VISUAL
+#endif
+
 static int reg_match_visual __ARGS((void));
 
 /*
@@ -4258,7 +4257,6 @@ reg_match_visual()
     }
     return TRUE;
 }
-#endif
 
 #define ADVANCE_REGINPUT() mb_ptr_adv(reginput)
 
@@ -4440,9 +4438,7 @@ regmatch(scan)
 	    break;
 
 	  case RE_VISUAL:
-#ifdef FEAT_VISUAL
 	    if (!reg_match_visual())
-#endif
 		status = RA_NOMATCH;
 	    break;
 
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -6403,14 +6403,12 @@ nfa_regmatch(prog, start, submatch, m)
 		break;
 
 	    case NFA_VISUAL:
-#ifdef FEAT_VISUAL
 		result = reg_match_visual();
 		if (result)
 		{
 		    add_here = TRUE;
 		    add_state = t->state->out;
 		}
-#endif
 		break;
 
 	    case NFA_MOPEN1:
--- a/src/screen.c
+++ b/src/screen.c
@@ -446,8 +446,6 @@ redrawWinline(lnum, invalid)
 #endif
 }
 
-#if defined(FEAT_RUBY) || defined(FEAT_PERL) || defined(FEAT_VISUAL) || \
-    (defined(FEAT_CLIPBOARD) && defined(FEAT_X11)) || defined(PROTO)
 /*
  * update all windows that are editing the current buffer
  */
@@ -458,7 +456,6 @@ update_curbuf(type)
     redraw_curbuf_later(type);
     update_screen(type);
 }
-#endif
 
 /*
  * update_screen()
@@ -596,14 +593,12 @@ update_screen(type)
 		    && curwin->w_botfill == curwin->w_old_botfill
 #endif
 		    && curwin->w_topline == curwin->w_lines[0].wl_lnum)
-#ifdef FEAT_VISUAL
 		|| (type == INVERTED
 		    && VIsual_active
 		    && curwin->w_old_cursor_lnum == curwin->w_cursor.lnum
 		    && curwin->w_old_visual_mode == VIsual_mode
 		    && (curwin->w_valid & VALID_VIRTCOL)
 		    && curwin->w_old_curswant == curwin->w_curswant)
-#endif
 		))
 	curwin->w_redr_type = type;
 
@@ -1030,10 +1025,8 @@ win_update(wp)
 				   updating.  0 when no mid area updating. */
     int		bot_start = 999;/* first row of the bot area that needs
 				   updating.  999 when no bot area updating */
-#ifdef FEAT_VISUAL
     int		scrolled_down = FALSE;	/* TRUE when scrolled down when
 					   w_topline got smaller a bit */
-#endif
 #ifdef FEAT_SEARCH_EXTRA
     matchitem_T *cur;		/* points to the match list */
     int		top_to_mod = FALSE;    /* redraw above mod_top */
@@ -1354,9 +1347,7 @@ win_update(wp)
 			    /* Need to update rows that are new, stop at the
 			     * first one that scrolled down. */
 			    top_end = i;
-#ifdef FEAT_VISUAL
 			    scrolled_down = TRUE;
-#endif
 
 			    /* Move the entries that were scrolled, disable
 			     * the entries for the lines to be redrawn. */
@@ -1513,7 +1504,6 @@ win_update(wp)
 	type = NOT_VALID;
     }
 
-#ifdef FEAT_VISUAL
     /* check if we are updating or removing the inverted part */
     if ((VIsual_active && buf == curwin->w_buffer)
 	    || (wp->w_old_cursor_lnum != 0 && type != NOT_VALID))
@@ -1708,7 +1698,6 @@ win_update(wp)
 	wp->w_old_visual_lnum = 0;
 	wp->w_old_visual_col = 0;
     }
-#endif /* FEAT_VISUAL */
 
 #if defined(FEAT_SYN_HL) || defined(FEAT_SEARCH_EXTRA)
     /* reset got_int, otherwise regexp won't work */
@@ -2670,7 +2659,6 @@ fold_line(wp, fold_count, foldinfo, lnum
      * 6. set highlighting for the Visual area an other text.
      * If all folded lines are in the Visual area, highlight the line.
      */
-#ifdef FEAT_VISUAL
     if (VIsual_active && wp->w_buffer == curwin->w_buffer)
     {
 	if (ltoreq(curwin->w_cursor, VIsual))
@@ -2718,7 +2706,6 @@ fold_line(wp, fold_count, foldinfo, lnum
 	    }
 	}
     }
-#endif
 
 #ifdef FEAT_SYN_HL
     /* Show 'cursorcolumn' in the fold line. */
@@ -2876,10 +2863,8 @@ win_line(wp, lnum, startrow, endrow, noc
     int		fromcol, tocol;		/* start/end of inverting */
     int		fromcol_prev = -2;	/* start of inverting after cursor */
     int		noinvcur = FALSE;	/* don't invert the cursor */
-#ifdef FEAT_VISUAL
     pos_T	*top, *bot;
     int		lnum_in_visual_area = FALSE;
-#endif
     pos_T	pos;
     long	v;
 
@@ -3090,7 +3075,6 @@ win_line(wp, lnum, startrow, endrow, noc
      */
     fromcol = -10;
     tocol = MAXCOL;
-#ifdef FEAT_VISUAL
     if (VIsual_active && wp->w_buffer == curwin->w_buffer)
     {
 					/* Visual is after curwin->w_cursor */
@@ -3183,9 +3167,7 @@ win_line(wp, lnum, startrow, endrow, noc
     /*
      * handle 'incsearch' and ":s///c" highlighting
      */
-    else
-#endif /* FEAT_VISUAL */
-	if (highlight_match
+    else if (highlight_match
 	    && wp == curwin
 	    && lnum >= curwin->w_cursor.lnum
 	    && lnum <= curwin->w_cursor.lnum + search_match_lines)
@@ -3324,7 +3306,6 @@ win_line(wp, lnum, startrow, endrow, noc
 	    mb_ptr_adv(ptr);
 	}
 
-#if defined(FEAT_SYN_HL) || defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
 	/* When:
 	 * - 'cuc' is set, or
 	 * - 'colorcolumn' is set, or
@@ -3333,27 +3314,16 @@ win_line(wp, lnum, startrow, endrow, noc
 	 * the end of the line may be before the start of the displayed part.
 	 */
 	if (vcol < v && (
-# ifdef FEAT_SYN_HL
-	     wp->w_p_cuc
-	     || draw_color_col
-#  if defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
-	     ||
-#  endif
-# endif
-# ifdef FEAT_VIRTUALEDIT
-	     virtual_active()
-#  ifdef FEAT_VISUAL
-	     ||
-#  endif
-# endif
-# ifdef FEAT_VISUAL
-	     (VIsual_active && wp->w_buffer == curwin->w_buffer)
-# endif
-	     ))
+#ifdef FEAT_SYN_HL
+	     wp->w_p_cuc || draw_color_col ||
+#endif
+#ifdef FEAT_VIRTUALEDIT
+	     virtual_active() ||
+#endif
+	     (VIsual_active && wp->w_buffer == curwin->w_buffer)))
 	{
 	    vcol = v;
 	}
-#endif
 
 	/* Handle a character that's not completely on the screen: Put ptr at
 	 * that character but skip the first few screen characters. */
@@ -4500,9 +4470,7 @@ win_line(wp, lnum, startrow, endrow, noc
 			&& ((wp->w_p_list && lcs_eol > 0)
 			    || ((fromcol >= 0 || fromcol_prev >= 0)
 				&& tocol > vcol
-#ifdef FEAT_VISUAL
 				&& VIsual_mode != Ctrl_V
-#endif
 				&& (
 # ifdef FEAT_RIGHTLEFT
 				    wp->w_p_rl ? (col >= 0) :
@@ -4854,11 +4822,9 @@ win_line(wp, lnum, startrow, endrow, noc
 #endif
 	    if (lcs_eol == lcs_eol_one
 		    && ((area_attr != 0 && vcol == fromcol
-#ifdef FEAT_VISUAL
 			    && (VIsual_mode != Ctrl_V
 				|| lnum == VIsual.lnum
 				|| lnum == curwin->w_cursor.lnum)
-#endif
 			    && c == NUL)
 #ifdef FEAT_SEARCH_EXTRA
 			/* highlight 'hlsearch' match at end of line */
@@ -9659,10 +9625,7 @@ showmode()
     do_mode = ((p_smd && msg_silent == 0)
 	    && ((State & INSERT)
 		|| restart_edit
-#ifdef FEAT_VISUAL
-		|| VIsual_active
-#endif
-		));
+		|| VIsual_active));
     if (do_mode || Recording)
     {
 	/*
@@ -9790,7 +9753,6 @@ showmode()
 		if ((State & INSERT) && p_paste)
 		    MSG_PUTS_ATTR(_(" (paste)"), attr);
 
-#ifdef FEAT_VISUAL
 		if (VIsual_active)
 		{
 		    char *p;
@@ -9810,7 +9772,6 @@ showmode()
 		    }
 		    MSG_PUTS_ATTR(_(p), attr);
 		}
-#endif
 		MSG_PUTS_ATTR(" --", attr);
 	    }
 
@@ -9839,11 +9800,9 @@ showmode()
 	msg_clr_cmdline();
 
 #ifdef FEAT_CMDL_INFO
-# ifdef FEAT_VISUAL
     /* In Visual mode the size of the selected area must be redrawn. */
     if (VIsual_active)
 	clear_showcmd();
-# endif
 
     /* If the last window has no status line, the ruler is after the mode
      * message and must be redrawn */
--- a/src/search.c
+++ b/src/search.c
@@ -506,7 +506,7 @@ last_pat_prog(regmatch)
 #endif
 
 /*
- * lowest level search function.
+ * Lowest level search function.
  * Search for 'count'th occurrence of pattern 'pat' in direction 'dir'.
  * Start at position 'pos' and return the found position in 'pos'.
  *
@@ -3198,7 +3198,6 @@ current_word(oap, count, include, bigwor
     cls_bigword = bigword;
     clearpos(&start_pos);
 
-#ifdef FEAT_VISUAL
     /* Correct cursor when 'selection' is exclusive */
     if (VIsual_active && *p_sel == 'e' && lt(VIsual, curwin->w_cursor))
 	dec_cursor();
@@ -3208,7 +3207,6 @@ current_word(oap, count, include, bigwor
      * character, select the word and/or white space under the cursor.
      */
     if (!VIsual_active || equalpos(curwin->w_cursor, VIsual))
-#endif
     {
 	/*
 	 * Go to start of current word or white space.
@@ -3245,7 +3243,6 @@ current_word(oap, count, include, bigwor
 		include_white = TRUE;
 	}
 
-#ifdef FEAT_VISUAL
 	if (VIsual_active)
 	{
 	    /* should do something when inclusive == FALSE ! */
@@ -3253,7 +3250,6 @@ current_word(oap, count, include, bigwor
 	    redraw_curbuf_later(INVERTED);	/* update the inversion */
 	}
 	else
-#endif
 	{
 	    oap->start = start_pos;
 	    oap->motion_type = MCHAR;
@@ -3267,7 +3263,6 @@ current_word(oap, count, include, bigwor
     while (count > 0)
     {
 	inclusive = TRUE;
-#ifdef FEAT_VISUAL
 	if (VIsual_active && lt(curwin->w_cursor, VIsual))
 	{
 	    /*
@@ -3288,7 +3283,6 @@ current_word(oap, count, include, bigwor
 	    }
 	}
 	else
-#endif
 	{
 	    /*
 	     * Move cursor forward one word and/or white area.
@@ -3334,18 +3328,15 @@ current_word(oap, count, include, bigwor
 	    back_in_line();
 	    if (cls() == 0 && curwin->w_cursor.col > 0)
 	    {
-#ifdef FEAT_VISUAL
 		if (VIsual_active)
 		    VIsual = curwin->w_cursor;
 		else
-#endif
 		    oap->start = curwin->w_cursor;
 	    }
 	}
 	curwin->w_cursor = pos;	/* put cursor back at end */
     }
 
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	if (*p_sel == 'e' && inclusive && ltoreq(VIsual, curwin->w_cursor))
@@ -3357,7 +3348,6 @@ current_word(oap, count, include, bigwor
 	}
     }
     else
-#endif
 	oap->inclusive = inclusive;
 
     return OK;
@@ -3384,7 +3374,6 @@ current_sent(oap, count, include)
     pos = start_pos;
     findsent(FORWARD, 1L);	/* Find start of next sentence. */
 
-#ifdef FEAT_VISUAL
     /*
      * When the Visual area is bigger than one character: Extend it.
      */
@@ -3471,7 +3460,6 @@ extend:
 	}
 	return OK;
     }
-#endif
 
     /*
      * If the cursor started on a blank, check if it is just before the start
@@ -3521,7 +3509,6 @@ extend:
 	    find_first_blank(&start_pos);
     }
 
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	/* Avoid getting stuck with "is" on a single space before a sentence. */
@@ -3534,7 +3521,6 @@ extend:
 	redraw_curbuf_later(INVERTED);	/* update the inversion */
     }
     else
-#endif
     {
 	/* include a newline after the sentence, if there is one */
 	if (incl(&curwin->w_cursor) == -1)
@@ -3574,9 +3560,7 @@ current_block(oap, count, include, what,
     /*
      * If we start on '(', '{', ')', '}', etc., use the whole block inclusive.
      */
-#ifdef FEAT_VISUAL
     if (!VIsual_active || equalpos(VIsual, curwin->w_cursor))
-#endif
     {
 	setpcmark();
 	if (what == '{')		/* ignore indent */
@@ -3587,7 +3571,6 @@ current_block(oap, count, include, what,
 	    /* cursor on '(' or '{', move cursor just after it */
 	    ++curwin->w_cursor.col;
     }
-#ifdef FEAT_VISUAL
     else if (lt(VIsual, curwin->w_cursor))
     {
 	old_start = VIsual;
@@ -3595,7 +3578,6 @@ current_block(oap, count, include, what,
     }
     else
 	old_end = VIsual;
-#endif
 
     /*
      * Search backwards for unclosed '(', '{', etc..
@@ -3641,7 +3623,6 @@ current_block(oap, count, include, what,
 		if (decl(&curwin->w_cursor) != 0)
 		    break;
 	    }
-#ifdef FEAT_VISUAL
 	/*
 	 * In Visual mode, when the resulting area is not bigger than what we
 	 * started with, extend it to the next block, and then exclude again.
@@ -3666,11 +3647,9 @@ current_block(oap, count, include, what,
 	    curwin->w_cursor = *end_pos;
 	}
 	else
-#endif
 	    break;
     }
 
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	if (*p_sel == 'e')
@@ -3683,7 +3662,6 @@ current_block(oap, count, include, what,
 	showmode();
     }
     else
-#endif
     {
 	oap->start = start_pos;
 	oap->motion_type = MCHAR;
@@ -3807,17 +3785,13 @@ current_tagblock(oap, count_arg, include
     old_pos = curwin->w_cursor;
     old_end = curwin->w_cursor;		    /* remember where we started */
     old_start = old_end;
-#ifdef FEAT_VISUAL
     if (!VIsual_active || *p_sel == 'e')
-#endif
 	decl(&old_end);			    /* old_end is inclusive */
 
     /*
      * If we start on "<aaa>" select that block.
      */
-#ifdef FEAT_VISUAL
     if (!VIsual_active || equalpos(VIsual, curwin->w_cursor))
-#endif
     {
 	setpcmark();
 
@@ -3843,7 +3817,6 @@ current_tagblock(oap, count_arg, include
 	    old_end = curwin->w_cursor;
 	}
     }
-#ifdef FEAT_VISUAL
     else if (lt(VIsual, curwin->w_cursor))
     {
 	old_start = VIsual;
@@ -3851,7 +3824,6 @@ current_tagblock(oap, count_arg, include
     }
     else
 	old_end = VIsual;
-#endif
 
 again:
     /*
@@ -3951,7 +3923,6 @@ again:
 	}
     }
 
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	/* If the end is before the start there is no text between tags, select
@@ -3966,7 +3937,6 @@ again:
 	showmode();
     }
     else
-#endif
     {
 	oap->start = start_pos;
 	oap->motion_type = MCHAR;
@@ -4010,7 +3980,6 @@ current_par(oap, count, include, type)
 
     start_lnum = curwin->w_cursor.lnum;
 
-#ifdef FEAT_VISUAL
     /*
      * When visual area is more than one line: extend it.
      */
@@ -4064,7 +4033,6 @@ extend:
 	curwin->w_cursor.col = 0;
 	return retval;
     }
-#endif
 
     /*
      * First move back to the start_lnum of the paragraph or white lines
@@ -4136,7 +4104,6 @@ extend:
 	while (start_lnum > 1 && linewhite(start_lnum - 1))
 	    --start_lnum;
 
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	/* Problem: when doing "Vipipip" nothing happens in a single white
@@ -4149,7 +4116,6 @@ extend:
 	showmode();
     }
     else
-#endif
     {
 	oap->start.lnum = start_lnum;
 	oap->start.col = 0;
@@ -4247,7 +4213,6 @@ current_quote(oap, count, include, quote
     int		col_end;
     int		col_start = curwin->w_cursor.col;
     int		inclusive = FALSE;
-#ifdef FEAT_VISUAL
     int		vis_empty = TRUE;	/* Visual selection <= 1 char */
     int		vis_bef_curs = FALSE;	/* Visual starts before cursor */
     int		inside_quotes = FALSE;	/* Looks like "i'" done before */
@@ -4331,17 +4296,11 @@ current_quote(oap, count, include, quote
 	}
     }
     else
-#endif
-
-    if (line[col_start] == quotechar
-#ifdef FEAT_VISUAL
-	    || !vis_empty
-#endif
-	    )
+
+    if (line[col_start] == quotechar || !vis_empty)
     {
 	int	first_col = col_start;
 
-#ifdef FEAT_VISUAL
 	if (!vis_empty)
 	{
 	    if (vis_bef_curs)
@@ -4349,7 +4308,7 @@ current_quote(oap, count, include, quote
 	    else
 		first_col = find_prev_quote(line, col_start, quotechar, NULL);
 	}
-#endif
+
 	/* The cursor is on a quote, we don't know if it's the opening or
 	 * closing quote.  Search from the start of the line to find out.
 	 * Also do this when there is a Visual area, a' may leave the cursor
@@ -4406,14 +4365,9 @@ current_quote(oap, count, include, quote
 
     /* Set start position.  After vi" another i" must include the ".
      * For v2i" include the quotes. */
-    if (!include && count < 2
-#ifdef FEAT_VISUAL
-	    && (vis_empty || !inside_quotes)
-#endif
-	    )
+    if (!include && count < 2 && (vis_empty || !inside_quotes))
 	++col_start;
     curwin->w_cursor.col = col_start;
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	/* Set the start of the Visual area when the Visual area was empty, we
@@ -4433,7 +4387,6 @@ current_quote(oap, count, include, quote
 	}
     }
     else
-#endif
     {
 	oap->start = curwin->w_cursor;
 	oap->motion_type = MCHAR;
@@ -4441,14 +4394,10 @@ current_quote(oap, count, include, quote
 
     /* Set end position. */
     curwin->w_cursor.col = col_end;
-    if ((include || count > 1
-#ifdef FEAT_VISUAL
-		/* After vi" another i" must include the ". */
+    if ((include || count > 1 /* After vi" another i" must include the ". */
 		|| (!vis_empty && inside_quotes)
-#endif
 	) && inc_cursor() == 2)
 	inclusive = TRUE;
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	if (vis_empty || vis_bef_curs)
@@ -4480,7 +4429,6 @@ current_quote(oap, count, include, quote
 	}
     }
     else
-#endif
     {
 	/* Set inclusive and other oap's flags. */
 	oap->inclusive = inclusive;
@@ -4491,7 +4439,6 @@ current_quote(oap, count, include, quote
 
 #endif /* FEAT_TEXTOBJ */
 
-#if defined(FEAT_VISUAL) || defined(PROTO)
 static int is_one_char __ARGS((char_u *pattern));
 
 /*
@@ -4690,7 +4637,6 @@ is_one_char(pattern)
     vim_regfree(regmatch.regprog);
     return result;
 }
-#endif /* FEAT_VISUAL */
 
 #if defined(FEAT_LISP) || defined(FEAT_CINDENT) || defined(FEAT_TEXTOBJ) \
 	|| defined(PROTO)
--- a/src/spell.c
+++ b/src/spell.c
@@ -10191,7 +10191,6 @@ spell_suggest(count)
     if (no_spell_checking(curwin))
 	return;
 
-#ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	/* Use the Visually selected text as the bad word.  But reject
@@ -10209,10 +10208,8 @@ spell_suggest(count)
 	++badlen;
 	end_visual_mode();
     }
-    else
-#endif
-	/* Find the start of the badly spelled word. */
-	if (spell_move_to(curwin, FORWARD, TRUE, TRUE, NULL) == 0
+    /* Find the start of the badly spelled word. */
+    else if (spell_move_to(curwin, FORWARD, TRUE, TRUE, NULL) == 0
 	    || curwin->w_cursor.col > prev_cursor.col)
     {
 	/* No bad word or it starts after the cursor: use the word under the
--- a/src/structs.h
+++ b/src/structs.h
@@ -346,9 +346,7 @@ struct u_header
 #endif
     int		uh_flags;	/* see below */
     pos_T	uh_namedm[NMARKS];	/* marks before undo/after redo */
-#ifdef FEAT_VISUAL
     visualinfo_T uh_visual;	/* Visual areas before undo/after redo */
-#endif
     time_t	uh_time;	/* timestamp when the change was made */
     long	uh_save_nr;	/* set when the file was saved after the
 				   changes in this block */
@@ -1406,12 +1404,10 @@ struct file_buffer
 
     pos_T	b_namedm[NMARKS]; /* current named marks (mark.c) */
 
-#ifdef FEAT_VISUAL
     /* These variables are set when VIsual_active becomes FALSE */
     visualinfo_T b_visual;
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
     int		b_visual_mode_eval;  /* b_visual.vi_mode for visualmode() */
-# endif
 #endif
 
     pos_T	b_last_cursor;	/* cursor position when last unloading this
@@ -1980,7 +1976,6 @@ struct window_S
 				       time through cursupdate() to the
 				       current virtual column */
 
-#ifdef FEAT_VISUAL
     /*
      * the next six are used to update the visual part
      */
@@ -1991,7 +1986,6 @@ struct window_S
     linenr_T	w_old_visual_lnum;  /* last known start of visual part */
     colnr_T	w_old_visual_col;   /* last known start of visual part */
     colnr_T	w_old_curswant;	    /* last known value of Curswant */
-#endif
 
     /*
      * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for
@@ -2293,10 +2287,8 @@ typedef struct oparg_S
 				   (inclusive) */
     int		empty;		/* op_start and op_end the same (only used by
 				   do_change()) */
-#ifdef FEAT_VISUAL
     int		is_VIsual;	/* operator on Visual area */
     int		block_mode;	/* current operator is Visual block mode */
-#endif
     colnr_T	start_vcol;	/* start col for block mode operator */
     colnr_T	end_vcol;	/* end col for block mode operator */
 #ifdef FEAT_AUTOCMD
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -6837,10 +6837,8 @@ static char *(highlight_init_light[]) =
 	CENT("SignColumn term=standout ctermbg=Grey ctermfg=DarkBlue",
 	     "SignColumn term=standout ctermbg=Grey ctermfg=DarkBlue guibg=Grey guifg=DarkBlue"),
 #endif
-#ifdef FEAT_VISUAL
 	CENT("Visual term=reverse",
 	     "Visual term=reverse guibg=LightGrey"),
-#endif
 #ifdef FEAT_DIFF
 	CENT("DiffAdd term=bold ctermbg=LightBlue",
 	     "DiffAdd term=bold ctermbg=LightBlue guibg=LightBlue"),
@@ -6927,10 +6925,8 @@ static char *(highlight_init_dark[]) =
 	CENT("SignColumn term=standout ctermbg=DarkGrey ctermfg=Cyan",
 	     "SignColumn term=standout ctermbg=DarkGrey ctermfg=Cyan guibg=Grey guifg=Cyan"),
 #endif
-#ifdef FEAT_VISUAL
 	CENT("Visual term=reverse",
 	     "Visual term=reverse guibg=DarkGrey"),
-#endif
 #ifdef FEAT_DIFF
 	CENT("DiffAdd term=bold ctermbg=DarkBlue",
 	     "DiffAdd term=bold ctermbg=DarkBlue guibg=DarkBlue"),
--- a/src/term.c
+++ b/src/term.c
@@ -3456,12 +3456,9 @@ setmouse()
 	return;
     }
 
-#  ifdef FEAT_VISUAL
     if (VIsual_active)
 	checkfor = MOUSE_VISUAL;
-    else
-#  endif
-	if (State == HITRETURN || State == ASKMORE || State == SETWSIZE)
+    else if (State == HITRETURN || State == ASKMORE || State == SETWSIZE)
 	checkfor = MOUSE_RETURN;
     else if (State & INSERT)
 	checkfor = MOUSE_INSERT;
--- a/src/ui.c
+++ b/src/ui.c
@@ -2610,13 +2610,11 @@ retnomove:
 	if (on_sep_line)
 	    return IN_SEP_LINE;
 #endif
-#ifdef FEAT_VISUAL
 	if (flags & MOUSE_MAY_STOP_VIS)
 	{
 	    end_visual_mode();
 	    redraw_curbuf_later(INVERTED);	/* delete the inversion */
 	}
-#endif
 #if defined(FEAT_CMDWIN) && defined(FEAT_CLIPBOARD)
 	/* Continue a modeless selection in another window. */
 	if (cmdwin_type != 0 && row < W_WINROW(curwin))
@@ -2686,32 +2684,30 @@ retnomove:
 	}
 #endif
 
-#ifdef FEAT_VISUAL
 	/* Before jumping to another buffer, or moving the cursor for a left
 	 * click, stop Visual mode. */
 	if (VIsual_active
 		&& (wp->w_buffer != curwin->w_buffer
 		    || (!on_status_line
-# ifdef FEAT_VERTSPLIT
+#ifdef FEAT_VERTSPLIT
 			&& !on_sep_line
-# endif
-# ifdef FEAT_FOLDING
+#endif
+#ifdef FEAT_FOLDING
 			&& (
-#  ifdef FEAT_RIGHTLEFT
+# ifdef FEAT_RIGHTLEFT
 			    wp->w_p_rl ? col < W_WIDTH(wp) - wp->w_p_fdc :
-#  endif
+# endif
 			    col >= wp->w_p_fdc
-#  ifdef FEAT_CMDWIN
+# ifdef FEAT_CMDWIN
 				  + (cmdwin_type == 0 && wp == curwin ? 0 : 1)
-#  endif
+# endif
 			    )
-# endif
+#endif
 			&& (flags & MOUSE_MAY_STOP_VIS))))
 	{
 	    end_visual_mode();
 	    redraw_curbuf_later(INVERTED);	/* delete the inversion */
 	}
-#endif
 #ifdef FEAT_CMDWIN
 	if (cmdwin_type != 0 && wp != curwin)
 	{
@@ -2801,14 +2797,12 @@ retnomove:
 #endif
     else /* keep_window_focus must be TRUE */
     {
-#ifdef FEAT_VISUAL
 	/* before moving the cursor for a left click, stop Visual mode */
 	if (flags & MOUSE_MAY_STOP_VIS)
 	{
 	    end_visual_mode();
 	    redraw_curbuf_later(INVERTED);	/* delete the inversion */
 	}
-#endif
 
 #if defined(FEAT_CMDWIN) && defined(FEAT_CLIPBOARD)
 	/* Continue a modeless selection in another window. */
@@ -2933,7 +2927,6 @@ retnomove:
     if (mouse_comp_pos(curwin, &row, &col, &curwin->w_cursor.lnum))
 	mouse_past_bottom = TRUE;
 
-#ifdef FEAT_VISUAL
     /* Start Visual mode before coladvance(), for when 'sel' != "old" */
     if ((flags & MOUSE_MAY_VIS) && !VIsual_active)
     {
@@ -2947,7 +2940,6 @@ retnomove:
 	if (p_smd && msg_silent == 0)
 	    redraw_cmdline = TRUE;	/* show visual mode later */
     }
-#endif
 
     curwin->w_curswant = col;
     curwin->w_set_curswant = FALSE;	/* May still have been TRUE */
--- a/src/undo.c
+++ b/src/undo.c
@@ -532,9 +532,7 @@ u_savecommon(top, bot, newbot, reload)
 
 	/* save named marks and Visual marks for undo */
 	mch_memmove(uhp->uh_namedm, curbuf->b_namedm, sizeof(pos_T) * NMARKS);
-#ifdef FEAT_VISUAL
 	uhp->uh_visual = curbuf->b_visual;
-#endif
 
 	curbuf->b_u_newhead = uhp;
 	if (curbuf->b_u_oldhead == NULL)
@@ -1014,16 +1012,7 @@ serialize_uhp(fp, buf, uhp)
     /* Assume NMARKS will stay the same. */
     for (i = 0; i < NMARKS; ++i)
 	serialize_pos(uhp->uh_namedm[i], fp);
-#ifdef FEAT_VISUAL
     serialize_visualinfo(&uhp->uh_visual, fp);
-#else
-    {
-	visualinfo_T info;
-
-	memset(&info, 0, sizeof(visualinfo_T));
-	serialize_visualinfo(&info, fp);
-    }
-#endif
     put_time(fp, uhp->uh_time);
 
     /* Optional fields. */
@@ -1082,14 +1071,7 @@ unserialize_uhp(fp, file_name)
     uhp->uh_flags = get2c(fp);
     for (i = 0; i < NMARKS; ++i)
 	unserialize_pos(&uhp->uh_namedm[i], fp);
-#ifdef FEAT_VISUAL
     unserialize_visualinfo(&uhp->uh_visual, fp);
-#else
-    {
-	visualinfo_T info;
-	unserialize_visualinfo(&info, fp);
-    }
-#endif
     uhp->uh_time = get8ctime(fp);
 
     /* Optional fields. */
@@ -2406,9 +2388,7 @@ u_undoredo(undo)
     int		old_flags;
     int		new_flags;
     pos_T	namedm[NMARKS];
-#ifdef FEAT_VISUAL
     visualinfo_T visualinfo;
-#endif
     int		empty_buffer;		    /* buffer became empty */
     u_header_T	*curhead = curbuf->b_u_curhead;
 
@@ -2430,9 +2410,7 @@ u_undoredo(undo)
      * save marks before undo/redo
      */
     mch_memmove(namedm, curbuf->b_namedm, sizeof(pos_T) * NMARKS);
-#ifdef FEAT_VISUAL
     visualinfo = curbuf->b_visual;
-#endif
     curbuf->b_op_start.lnum = curbuf->b_ml.ml_line_count;
     curbuf->b_op_start.col = 0;
     curbuf->b_op_end.lnum = 0;
@@ -2602,13 +2580,11 @@ u_undoredo(undo)
 	    curbuf->b_namedm[i] = curhead->uh_namedm[i];
 	    curhead->uh_namedm[i] = namedm[i];
 	}
-#ifdef FEAT_VISUAL
     if (curhead->uh_visual.vi_start.lnum != 0)
     {
 	curbuf->b_visual = curhead->uh_visual;
 	curhead->uh_visual = visualinfo;
     }
-#endif
 
     /*
      * If the cursor is only off by one line, put it at the same position as
--- a/src/version.c
+++ b/src/version.c
@@ -642,15 +642,11 @@ static char *(features[]) =
 #else
 	"-virtualedit",
 #endif
-#ifdef FEAT_VISUAL
 	"+visual",
-# ifdef FEAT_VISUALEXTRA
+#ifdef FEAT_VISUALEXTRA
 	"+visualextra",
-# else
+#else
 	"-visualextra",
-# endif
-#else
-	"-visual",
 #endif
 #ifdef FEAT_VIMINFO
 	"+viminfo",
@@ -739,6 +735,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    212,
+/**/
     211,
 /**/
     210,
--- a/src/window.c
+++ b/src/window.c
@@ -130,9 +130,7 @@ do_window(nchar, Prenum, xchar)
     case Ctrl_S:
     case 's':
 		CHECK_CMDWIN
-#ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 #ifdef FEAT_QUICKFIX
 		/* When splitting the quickfix window open a new buffer in it,
 		 * don't replicate the quickfix buffer. */
@@ -150,9 +148,7 @@ do_window(nchar, Prenum, xchar)
     case Ctrl_V:
     case 'v':
 		CHECK_CMDWIN
-# ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-# endif
 # ifdef FEAT_QUICKFIX
 		/* When splitting the quickfix window open a new buffer in it,
 		 * don't replicate the quickfix buffer. */
@@ -170,9 +166,7 @@ do_window(nchar, Prenum, xchar)
     case Ctrl_HAT:
     case '^':
 		CHECK_CMDWIN
-#ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 		STRCPY(cbuf, "split #");
 		if (Prenum)
 		    vim_snprintf((char *)cbuf + 7, sizeof(cbuf) - 7,
@@ -184,9 +178,7 @@ do_window(nchar, Prenum, xchar)
     case Ctrl_N:
     case 'n':
 		CHECK_CMDWIN
-#ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 #ifdef FEAT_QUICKFIX
 newwindow:
 #endif
@@ -206,18 +198,14 @@ newwindow:
 /* quit current window */
     case Ctrl_Q:
     case 'q':
-#ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 		do_cmdline_cmd((char_u *)"quit");
 		break;
 
 /* close current window */
     case Ctrl_C:
     case 'c':
-#ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 		do_cmdline_cmd((char_u *)"close");
 		break;
 
@@ -226,9 +214,7 @@ newwindow:
     case Ctrl_Z:
     case 'z':
 		CHECK_CMDWIN
-#ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 		do_cmdline_cmd((char_u *)"pclose");
 		break;
 
@@ -248,9 +234,7 @@ newwindow:
     case Ctrl_O:
     case 'o':
 		CHECK_CMDWIN
-#ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 		do_cmdline_cmd((char_u *)"only");
 		break;
 
@@ -399,18 +383,14 @@ newwindow:
     case Ctrl_R:
     case 'r':
 		CHECK_CMDWIN
-#ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 		win_rotate(FALSE, (int)Prenum1);    /* downwards */
 		break;
 
 /* rotate windows upwards */
     case 'R':
 		CHECK_CMDWIN
-#ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 		win_rotate(TRUE, (int)Prenum1);	    /* upwards */
 		break;
 
@@ -499,9 +479,7 @@ newwindow:
     case ']':
     case Ctrl_RSB:
 		CHECK_CMDWIN
-#ifdef FEAT_VISUAL
 		reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 		if (Prenum)
 		    postponed_split = Prenum;
 		else
@@ -612,9 +590,7 @@ wingotofile:
 #endif
 		    case ']':
 		    case Ctrl_RSB:
-#ifdef FEAT_VISUAL
 			reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 			if (Prenum)
 			    postponed_split = Prenum;
 			else
@@ -3726,9 +3702,7 @@ leave_tabpage(new_curbuf, trigger_leave_
 {
     tabpage_T	*tp = curtab;
 
-#ifdef FEAT_VISUAL
     reset_VIsual_and_resel();	/* stop Visual mode */
-#endif
 #ifdef FEAT_AUTOCMD
     if (trigger_leave_autocmds)
     {
@@ -4029,12 +4003,10 @@ win_goto(wp)
 	return;
 #endif
 
-#ifdef FEAT_VISUAL
     if (wp->w_buffer != curbuf)
 	reset_VIsual_and_resel();
     else if (VIsual_active)
 	wp->w_cursor = curwin->w_cursor;
-#endif
 
 #ifdef FEAT_GUI
     need_mouse_correct = TRUE;
@@ -6037,7 +6009,6 @@ grab_file_name(count, file_lnum)
     long	count;
     linenr_T	*file_lnum;
 {
-# ifdef FEAT_VISUAL
     if (VIsual_active)
     {
 	int	len;
@@ -6048,7 +6019,6 @@ grab_file_name(count, file_lnum)
 	return find_file_name_in_path(ptr, len,
 		     FNAME_MESS|FNAME_EXP|FNAME_REL, count, curbuf->b_ffname);
     }
-# endif
     return file_name_at_cursor(FNAME_MESS|FNAME_HYP|FNAME_EXP|FNAME_REL, count,
 			       file_lnum);