changeset 13380:69517d67421f v8.0.1564

patch 8.0.1564: too many #ifdefs commit https://github.com/vim/vim/commit/f2bd8ef2b4507d02c6043affff8f7e85e3414d5f Author: Bram Moolenaar <Bram@vim.org> Date: Sun Mar 4 18:08:14 2018 +0100 patch 8.0.1564: too many #ifdefs Problem: Too many #ifdefs. Solution: Graduate the +autocmd feature. Takes away 450 #ifdefs and increases code size of tiny Vim by only 40 Kbyte.
author Christian Brabandt <cb@256bit.org>
date Sun, 04 Mar 2018 18:15:08 +0100
parents 0f9dd1b43244
children ead6bec510f0
files src/buffer.c src/diff.c src/edit.c src/eval.c src/evalfunc.c src/ex_cmds.c src/ex_cmds2.c src/ex_docmd.c src/ex_getln.c src/feature.h src/fileio.c src/getchar.c src/globals.h src/gui.c src/gui_mac.c src/if_cscope.c src/if_xcmdsrv.c src/main.c src/mbyte.c src/memline.c src/menu.c src/misc1.c src/misc2.c src/move.c src/netbeans.c src/normal.c src/ops.c src/option.c src/option.h src/os_amiga.c src/os_mswin.c src/os_unix.c src/os_win32.c src/quickfix.c src/screen.c src/search.c src/spell.c src/structs.h src/syntax.c src/tag.c src/term.c src/terminal.c src/ui.c src/undo.c src/userfunc.c src/version.c src/vim.h src/window.c
diffstat 48 files changed, 341 insertions(+), 1172 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -63,9 +63,7 @@ static void insert_sign(buf_T *buf, sign
 static char *msg_loclist = N_("[Location List]");
 static char *msg_qflist = N_("[Quickfix List]");
 #endif
-#ifdef FEAT_AUTOCMD
 static char *e_auabort = N_("E855: Autocommands caused command to abort");
-#endif
 
 /* Number of times free_buffer() was called. */
 static int	buf_free_count = 0;
@@ -116,17 +114,15 @@ read_buffer(
 	else if (retval == OK)
 	    unchanged(curbuf, FALSE);
 
-#ifdef FEAT_AUTOCMD
 	if (retval == OK)
 	{
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	    apply_autocmds_retval(EVENT_STDINREADPOST, NULL, NULL, FALSE,
-							curbuf, &retval);
-# else
+							      curbuf, &retval);
+#else
 	    apply_autocmds(EVENT_STDINREADPOST, NULL, NULL, FALSE, curbuf);
-# endif
+#endif
 	}
-#endif
     }
     return retval;
 }
@@ -143,9 +139,7 @@ open_buffer(
     int		flags)		    /* extra flags for readfile() */
 {
     int		retval = OK;
-#ifdef FEAT_AUTOCMD
     bufref_T	old_curbuf;
-#endif
 #ifdef FEAT_SYN_HL
     long	old_tw = curbuf->b_p_tw;
 #endif
@@ -188,12 +182,10 @@ open_buffer(
 	return FAIL;
     }
 
-#ifdef FEAT_AUTOCMD
     /* The autocommands in readfile() may change the buffer, but only AFTER
      * reading the file. */
     set_bufref(&old_curbuf, curbuf);
     modified_was_set = FALSE;
-#endif
 
     /* mark cursor position as being invalid */
     curwin->w_valid = 0;
@@ -289,11 +281,9 @@ open_buffer(
      * the changed flag.  Unless in readonly mode: "ls | gview -".
      * When interrupted and 'cpoptions' contains 'i' set changed flag. */
     if ((got_int && vim_strchr(p_cpo, CPO_INTMOD) != NULL)
-#ifdef FEAT_AUTOCMD
 		|| modified_was_set	/* ":set modified" used in autocmd */
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 		|| (aborting() && vim_strchr(p_cpo, CPO_INTMOD) != NULL)
-# endif
 #endif
        )
 	changed();
@@ -315,25 +305,22 @@ open_buffer(
     foldUpdateAll(curwin);
 #endif
 
-#ifdef FEAT_AUTOCMD
     /* need to set w_topline, unless some autocommand already did that. */
     if (!(curwin->w_valid & VALID_TOPLINE))
     {
 	curwin->w_topline = 1;
-# ifdef FEAT_DIFF
+#ifdef FEAT_DIFF
 	curwin->w_topfill = 0;
-# endif
+#endif
     }
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
     apply_autocmds_retval(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf, &retval);
-# else
+#else
     apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
-# endif
 #endif
 
     if (retval == OK)
     {
-#ifdef FEAT_AUTOCMD
 	/*
 	 * The autocommands may have changed the current buffer.  Apply the
 	 * modelines to the correct buffer, if it still exists and is loaded.
@@ -344,22 +331,19 @@ open_buffer(
 
 	    /* Go to the buffer that was opened. */
 	    aucmd_prepbuf(&aco, old_curbuf.br_buf);
-#endif
 	    do_modelines(0);
 	    curbuf->b_flags &= ~(BF_CHECK_RO | BF_NEVERLOADED);
 
-#ifdef FEAT_AUTOCMD
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	    apply_autocmds_retval(EVENT_BUFWINENTER, NULL, NULL, FALSE, curbuf,
-								    &retval);
-# else
+								      &retval);
+#else
 	    apply_autocmds(EVENT_BUFWINENTER, NULL, NULL, FALSE, curbuf);
-# endif
+#endif
 
 	    /* restore curwin/curbuf and a few other things */
 	    aucmd_restbuf(&aco);
 	}
-#endif
     }
 
     return retval;
@@ -454,14 +438,12 @@ close_buffer(
     int		action,
     int		abort_if_last UNUSED)
 {
-#ifdef FEAT_AUTOCMD
     int		is_curbuf;
     int		nwindows;
     bufref_T	bufref;
     int		is_curwin = (curwin != NULL && curwin->w_buffer == buf);
     win_T	*the_curwin = curwin;
     tabpage_T	*the_curtab = curtab;
-#endif
     int		unload_buf = (action != 0);
     int		del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE);
     int		wipe_buf = (action == DOBUF_WIPE);
@@ -510,7 +492,6 @@ close_buffer(
     }
 #endif
 
-#ifdef FEAT_AUTOCMD
     /* Disallow deleting the buffer when it is locked (already being closed or
      * halfway a command that relies on it). Unloading is allowed. */
     if (buf->b_locked > 0 && (del_buf || wipe_buf))
@@ -518,7 +499,6 @@ close_buffer(
 	EMSG(_("E937: Attempt to delete a buffer that is in use"));
 	return;
     }
-#endif
 
     /* check no autocommands closed the window */
     if (win != NULL && win_valid_any_tab(win))
@@ -534,7 +514,6 @@ close_buffer(
 		    win->w_cursor.col, TRUE);
     }
 
-#ifdef FEAT_AUTOCMD
     set_bufref(&bufref, buf);
 
     /* When the buffer is no longer in a window, trigger BufWinLeave */
@@ -570,10 +549,10 @@ aucmd_abort:
 		/* Autocommands made this the only window. */
 		goto aucmd_abort;
 	}
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	if (aborting())	    /* autocmds may abort script processing */
 	    return;
-# endif
+#endif
     }
 
     /* If the buffer was in curwin and the window has changed, go back to that
@@ -587,7 +566,6 @@ aucmd_abort:
     }
 
     nwindows = buf->b_nwindows;
-#endif
 
     /* decrease the link count from windows (unless not in any window) */
     if (buf->b_nwindows > 0)
@@ -620,23 +598,20 @@ aucmd_abort:
      * Free all things allocated for this buffer.
      * Also calls the "BufDelete" autocommands when del_buf is TRUE.
      */
-#ifdef FEAT_AUTOCMD
     /* Remember if we are closing the current buffer.  Restore the number of
      * windows, so that autocommands in buf_freeall() don't get confused. */
     is_curbuf = (buf == curbuf);
     buf->b_nwindows = nwindows;
-#endif
 
     buf_freeall(buf, (del_buf ? BFA_DEL : 0) + (wipe_buf ? BFA_WIPE : 0));
 
-#ifdef FEAT_AUTOCMD
     /* Autocommands may have deleted the buffer. */
     if (!bufref_valid(&bufref))
 	return;
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
     if (aborting())	    /* autocmds may abort script processing */
 	return;
-# endif
+#endif
 
     /*
      * It's possible that autocommands change curbuf to the one being deleted.
@@ -655,7 +630,6 @@ aucmd_abort:
      * Decrement the count for the close we do here. */
     if (buf->b_nwindows > 0)
 	--buf->b_nwindows;
-#endif
 
     /*
      * Remove the buffer from the list.
@@ -732,7 +706,6 @@ buf_clear_file(buf_T *buf)
     void
 buf_freeall(buf_T *buf, int flags)
 {
-#ifdef FEAT_AUTOCMD
     int		is_curbuf = (buf == curbuf);
     bufref_T	bufref;
     int		is_curwin = (curwin != NULL && curwin->w_buffer == buf);
@@ -778,10 +751,10 @@ buf_freeall(buf_T *buf, int flags)
 	unblock_autocmds();
     }
 
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
     if (aborting())	    /* autocmds may abort script processing */
 	return;
-# endif
+#endif
 
     /*
      * It's possible that autocommands change curbuf to the one being deleted.
@@ -791,7 +764,6 @@ buf_freeall(buf_T *buf, int flags)
      */
     if (buf == curbuf && !is_curbuf)
 	return;
-#endif
 #ifdef FEAT_DIFF
     diff_buf_delete(buf);	    /* Can't use 'diff' for unloaded buffer. */
 #endif
@@ -870,7 +842,6 @@ free_buffer(buf_T *buf)
 
     buf_hashtab_remove(buf);
 
-#ifdef FEAT_AUTOCMD
     aubuflocal_remove(buf);
 
     if (autocmd_busy)
@@ -881,7 +852,6 @@ free_buffer(buf_T *buf)
 	au_pending_free_buf = buf;
     }
     else
-#endif
 	vim_free(buf);
 }
 
@@ -994,7 +964,7 @@ goto_buffer(
 # if defined(HAS_SWAP_EXISTS_ACTION)
     if (swap_exists_action == SEA_QUIT && *eap->cmd == 's')
     {
-#  if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#  if defined(FEAT_EVAL)
 	cleanup_T   cs;
 
 	/* Reset the error/interrupt/exception state here so that
@@ -1007,7 +977,7 @@ goto_buffer(
 	swap_exists_action = SEA_NONE;
 	swap_exists_did_quit = TRUE;
 
-#  if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#  if defined(FEAT_EVAL)
 	/* Restore the error/interrupt/exception state if not discarded by a
 	 * new aborting error, interrupt, or uncaught exception. */
 	leave_cleanup(&cs);
@@ -1027,17 +997,17 @@ goto_buffer(
     void
 handle_swap_exists(bufref_T *old_curbuf)
 {
-# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+# if defined(FEAT_EVAL)
     cleanup_T	cs;
 # endif
-#ifdef FEAT_SYN_HL
+# ifdef FEAT_SYN_HL
     long	old_tw = curbuf->b_p_tw;
-#endif
+# endif
     buf_T	*buf;
 
     if (swap_exists_action == SEA_QUIT)
     {
-# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+# if defined(FEAT_EVAL)
 	/* Reset the error/interrupt/exception state here so that
 	 * aborting() returns FALSE when closing a buffer. */
 	enter_cleanup(&cs);
@@ -1057,14 +1027,14 @@ handle_swap_exists(bufref_T *old_curbuf)
 	if (buf != NULL)
 	{
 	    enter_buffer(buf);
-#ifdef FEAT_SYN_HL
+# ifdef FEAT_SYN_HL
 	    if (old_tw != curbuf->b_p_tw)
 		check_colorcolumn(curwin);
-#endif
+# endif
 	}
 	/* If "old_curbuf" is NULL we are in big trouble here... */
 
-# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+# if defined(FEAT_EVAL)
 	/* Restore the error/interrupt/exception state if not discarded by a
 	 * new aborting error, interrupt, or uncaught exception. */
 	leave_cleanup(&cs);
@@ -1072,7 +1042,7 @@ handle_swap_exists(bufref_T *old_curbuf)
     }
     else if (swap_exists_action == SEA_RECOVER)
     {
-# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+# if defined(FEAT_EVAL)
 	/* Reset the error/interrupt/exception state here so that
 	 * aborting() returns FALSE when closing a buffer. */
 	enter_cleanup(&cs);
@@ -1085,7 +1055,7 @@ handle_swap_exists(bufref_T *old_curbuf)
 	cmdline_row = msg_row;
 	do_modelines(0);
 
-# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+# if defined(FEAT_EVAL)
 	/* Restore the error/interrupt/exception state if not discarded by a
 	 * new aborting error, interrupt, or uncaught exception. */
 	leave_cleanup(&cs);
@@ -1400,23 +1370,21 @@ do_buffer(
 
 	if (!forceit && bufIsChanged(buf))
 	{
-#if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
+# if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
 	    if ((p_confirm || cmdmod.confirm) && p_write)
 	    {
 		dialog_changed(buf, FALSE);
-# ifdef FEAT_AUTOCMD
 		if (!bufref_valid(&bufref))
 		    /* Autocommand deleted buffer, oops!  It's not changed
 		     * now. */
 		    return FAIL;
-# endif
 		/* If it's still changed fail silently, the dialog already
 		 * mentioned why it fails. */
 		if (bufIsChanged(buf))
 		    return FAIL;
 	    }
 	    else
-#endif
+# endif
 	    {
 		EMSGN(_("E89: No write since last change for buffer %ld (add ! to override)"),
 								 buf->b_fnum);
@@ -1444,9 +1412,7 @@ do_buffer(
 	 * a window with this buffer.
 	 */
 	while (buf == curbuf
-#ifdef FEAT_AUTOCMD
 		   && !(curwin->w_closing || curwin->w_buffer->b_locked > 0)
-#endif
 		   && (!ONE_WINDOW || first_tabpage->tp_next != NULL))
 	{
 	    if (win_close(curwin, FALSE) == FAIL)
@@ -1476,15 +1442,10 @@ do_buffer(
 	 */
 	buf = NULL;	/* selected buffer */
 	bp = NULL;	/* used when no loaded buffer found */
-#ifdef FEAT_AUTOCMD
 	if (au_new_curbuf.br_buf != NULL && bufref_valid(&au_new_curbuf))
 	    buf = au_new_curbuf.br_buf;
-# ifdef FEAT_JUMPLIST
-	else
-# endif
-#endif
 #ifdef FEAT_JUMPLIST
-	    if (curwin->w_jumplistlen > 0)
+	else if (curwin->w_jumplistlen > 0)
 	{
 	    int     jumpidx;
 
@@ -1603,17 +1564,13 @@ do_buffer(
 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
 	if ((p_confirm || cmdmod.confirm) && p_write)
 	{
-# ifdef FEAT_AUTOCMD
 	    bufref_T bufref;
 
 	    set_bufref(&bufref, buf);
-# endif
 	    dialog_changed(curbuf, FALSE);
-# ifdef FEAT_AUTOCMD
 	    if (!bufref_valid(&bufref))
 		/* Autocommand deleted buffer, oops! */
 		return FAIL;
-# endif
 	}
 	if (bufIsChanged(curbuf))
 #endif
@@ -1634,7 +1591,7 @@ do_buffer(
     }
 #endif
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
     if (aborting())	    /* autocmds may abort script processing */
 	return FAIL;
 #endif
@@ -1678,17 +1635,15 @@ set_curbuf(buf_T *buf, int action)
     set_bufref(&prevbufref, prevbuf);
     set_bufref(&newbufref, buf);
 
-#ifdef FEAT_AUTOCMD
     /* Autocommands may delete the curren buffer and/or the buffer we wan to go
      * to.  In those cases don't close the buffer. */
     if (!apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf)
 	    || (bufref_valid(&prevbufref)
 		&& bufref_valid(&newbufref)
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 		&& !aborting()
-# endif
+#endif
 	       ))
-#endif
     {
 #ifdef FEAT_SYN_HL
 	if (prevbuf == curwin->w_buffer)
@@ -1696,7 +1651,7 @@ set_curbuf(buf_T *buf, int action)
 #endif
 	if (unload)
 	    close_windows(prevbuf, FALSE);
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	if (bufref_valid(&prevbufref) && !aborting())
 #else
 	if (bufref_valid(&prevbufref))
@@ -1714,16 +1669,14 @@ set_curbuf(buf_T *buf, int action)
 	      curwin = previouswin;
 	}
     }
-#ifdef FEAT_AUTOCMD
     /* An autocommand may have deleted "buf", already entered it (e.g., when
      * it did ":bunload") or aborted the script processing.
      * If curwin->w_buffer is null, enter_buffer() will make it valid again */
     if ((buf_valid(buf) && buf != curbuf
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 		&& !aborting()
-# endif
+#endif
 	) || curwin->w_buffer == NULL)
-#endif
     {
 	enter_buffer(buf);
 #ifdef FEAT_SYN_HL
@@ -1773,9 +1726,7 @@ enter_buffer(buf_T *buf)
     curwin->w_cursor.coladd = 0;
 #endif
     curwin->w_set_curswant = TRUE;
-#ifdef FEAT_AUTOCMD
     curwin->w_topline_was_set = FALSE;
-#endif
 
     /* mark cursor position as being invalid */
     curwin->w_valid = 0;
@@ -1783,13 +1734,11 @@ enter_buffer(buf_T *buf)
     /* Make sure the buffer is loaded. */
     if (curbuf->b_ml.ml_mfp == NULL)	/* need to load the file */
     {
-#ifdef FEAT_AUTOCMD
 	/* If there is no filetype, allow for detecting one.  Esp. useful for
 	 * ":ball" used in a autocommand.  If there already is a filetype we
 	 * might prefer to keep it. */
 	if (*curbuf->b_p_ft == NUL)
 	    did_filetype = FALSE;
-#endif
 
 	open_buffer(FALSE, NULL, 0);
     }
@@ -1798,14 +1747,12 @@ enter_buffer(buf_T *buf)
 	if (!msg_silent)
 	    need_fileinfo = TRUE;	/* display file info after redraw */
 	(void)buf_check_timestamp(curbuf, FALSE); /* check if file changed */
-#ifdef FEAT_AUTOCMD
 	curwin->w_topline = 1;
-# ifdef FEAT_DIFF
+#ifdef FEAT_DIFF
 	curwin->w_topfill = 0;
-# endif
+#endif
 	apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
 	apply_autocmds(EVENT_BUFWINENTER, NULL, NULL, FALSE, curbuf);
-#endif
     }
 
     /* If autocommands did not change the cursor position, restore cursor lnum
@@ -1817,10 +1764,8 @@ enter_buffer(buf_T *buf)
 #ifdef FEAT_TITLE
     maketitle();
 #endif
-#ifdef FEAT_AUTOCMD
 	/* when autocmds didn't change it */
     if (curwin->w_topline == 1 && !curwin->w_topline_was_set)
-#endif
 	scroll_cursor_halfway(FALSE);	/* redisplay at correct position */
 
 #ifdef FEAT_NETBEANS_INTG
@@ -1948,11 +1893,9 @@ buflist_new(
 
 	if ((flags & BLN_LISTED) && !buf->b_p_bl)
 	{
-#ifdef FEAT_AUTOCMD
 	    bufref_T bufref;
-#endif
+
 	    buf->b_p_bl = TRUE;
-#ifdef FEAT_AUTOCMD
 	    set_bufref(&bufref, buf);
 	    if (!(flags & BLN_DUMMY))
 	    {
@@ -1960,7 +1903,6 @@ buflist_new(
 			&& !bufref_valid(&bufref))
 		    return NULL;
 	    }
-#endif
 	}
 	return buf;
     }
@@ -1981,21 +1923,17 @@ buflist_new(
 	    && (curbuf->b_ml.ml_mfp == NULL || BUFEMPTY()))
     {
 	buf = curbuf;
-#ifdef FEAT_AUTOCMD
 	/* It's like this buffer is deleted.  Watch out for autocommands that
 	 * change curbuf!  If that happens, allocate a new buffer anyway. */
 	if (curbuf->b_p_bl)
 	    apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf);
 	if (buf == curbuf)
 	    apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf);
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	if (aborting())		/* autocmds may abort script processing */
 	    return NULL;
-# endif
-#endif
-#ifdef FEAT_AUTOCMD
+#endif
 	if (buf == curbuf)
-#endif
 	{
 	    /* Make sure 'bufhidden' and 'buftype' are empty */
 	    clear_string_option(&buf->b_p_bh);
@@ -2049,7 +1987,7 @@ buflist_new(
 	buf_freeall(buf, 0);
 	if (buf != curbuf)	 /* autocommands deleted the buffer! */
 	    return NULL;
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	if (aborting())		/* autocmds may abort script processing */
 	    return NULL;
 #endif
@@ -2128,7 +2066,6 @@ buflist_new(
     clrallmarks(buf);			/* clear marks */
     fmarks_check_names(buf);		/* check file marks for this file */
     buf->b_p_bl = (flags & BLN_LISTED) ? TRUE : FALSE;	/* init 'buflisted' */
-#ifdef FEAT_AUTOCMD
     if (!(flags & BLN_DUMMY))
     {
 	bufref_T bufref;
@@ -2146,12 +2083,11 @@ buflist_new(
 		    && !bufref_valid(&bufref))
 		return NULL;
 	}
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	if (aborting())		/* autocmds may abort script processing */
 	    return NULL;
-# endif
+#endif
     }
-#endif
 
     return buf;
 }
@@ -2230,9 +2166,7 @@ free_buf_options(
 #ifdef FEAT_SEARCHPATH
     clear_string_option(&buf->b_p_sua);
 #endif
-#ifdef FEAT_AUTOCMD
     clear_string_option(&buf->b_p_ft);
-#endif
 #ifdef FEAT_CINDENT
     clear_string_option(&buf->b_p_cink);
     clear_string_option(&buf->b_p_cino);
@@ -2315,10 +2249,8 @@ buflist_getfile(
 	text_locked_msg();
 	return FAIL;
     }
-#ifdef FEAT_AUTOCMD
     if (curbuf_locked())
 	return FAIL;
-#endif
 
     /* altfpos may be changed by getfile(), get it now */
     if (lnum == 0)
@@ -4368,7 +4300,6 @@ build_stl_str_hl(
 							       : _("[Help]"));
 	    break;
 
-#ifdef FEAT_AUTOCMD
 	case STL_FILETYPE:
 	    if (*wp->w_buffer->b_p_ft != NUL
 		    && STRLEN(wp->w_buffer->b_p_ft) < TMPLEN - 3)
@@ -4391,7 +4322,6 @@ build_stl_str_hl(
 		str = tmp;
 	    }
 	    break;
-#endif
 
 #if defined(FEAT_QUICKFIX)
 	case STL_PREVIEWFLAG:
@@ -5013,20 +4943,18 @@ do_arg_all(
 		    if (!buf_hide(buf) && buf->b_nwindows <= 1
 							 && bufIsChanged(buf))
 		    {
-#ifdef FEAT_AUTOCMD
 			bufref_T    bufref;
 
 			set_bufref(&bufref, buf);
-#endif
+
 			(void)autowrite(buf, FALSE);
-#ifdef FEAT_AUTOCMD
+
 			/* check if autocommands removed the window */
 			if (!win_valid(wp) || !bufref_valid(&bufref))
 			{
 			    wpnext = firstwin;	/* start all over... */
 			    continue;
 			}
-#endif
 		    }
 		    /* don't close last window */
 		    if (ONE_WINDOW
@@ -5035,11 +4963,10 @@ do_arg_all(
 		    else
 		    {
 			win_close(wp, !buf_hide(buf) && !bufIsChanged(buf));
-#ifdef FEAT_AUTOCMD
+
 			/* check if autocommands removed the next window */
 			if (!win_valid(wpnext))
 			    wpnext = firstwin;	/* start all over... */
-#endif
 		    }
 		}
 	    }
@@ -5049,11 +4976,10 @@ do_arg_all(
 	if (had_tab == 0 || tpnext == NULL)
 	    break;
 
-# ifdef FEAT_AUTOCMD
 	/* check if autocommands removed the next tab page */
 	if (!valid_tabpage(tpnext))
 	    tpnext = first_tabpage;	/* start all over...*/
-# endif
+
 	goto_tabpage_tp(tpnext, TRUE, TRUE);
     }
 
@@ -5064,11 +4990,9 @@ do_arg_all(
     if (count > opened_len || count <= 0)
 	count = opened_len;
 
-#ifdef FEAT_AUTOCMD
     /* Don't execute Win/Buf Enter/Leave autocommands here. */
     ++autocmd_no_enter;
     ++autocmd_no_leave;
-#endif
     last_curwin = curwin;
     last_curtab = curtab;
     win_enter(lastwin, FALSE);
@@ -5114,10 +5038,8 @@ do_arg_all(
 		if (split_ret == FAIL)
 		    continue;
 	    }
-#ifdef FEAT_AUTOCMD
 	    else    /* first window: do autocmd for leaving this buffer */
 		--autocmd_no_leave;
-#endif
 
 	    /*
 	     * edit file "i"
@@ -5133,10 +5055,8 @@ do_arg_all(
 		      ((buf_hide(curwin->w_buffer)
 			   || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0)
 						       + ECMD_OLDBUF, curwin);
-#ifdef FEAT_AUTOCMD
 	    if (use_firstwin)
 		++autocmd_no_leave;
-#endif
 	    use_firstwin = FALSE;
 	}
 	ui_breakcheck();
@@ -5149,9 +5069,8 @@ do_arg_all(
     /* Remove the "lock" on the argument list. */
     alist_unlink(alist);
 
-#ifdef FEAT_AUTOCMD
     --autocmd_no_enter;
-#endif
+
     /* restore last referenced tabpage's curwin */
     if (last_curtab != new_curtab)
     {
@@ -5166,9 +5085,7 @@ do_arg_all(
     if (win_valid(new_curwin))
 	win_enter(new_curwin, FALSE);
 
-#ifdef FEAT_AUTOCMD
     --autocmd_no_leave;
-#endif
     vim_free(opened);
 }
 
@@ -5223,18 +5140,13 @@ ex_buffer_all(exarg_T *eap)
 							    - tabline_height()
 			: wp->w_width != Columns)
 		    || (had_tab > 0 && wp != firstwin)) && !ONE_WINDOW
-#ifdef FEAT_AUTOCMD
-		    && !(wp->w_closing || wp->w_buffer->b_locked > 0)
-#endif
-		    )
+			     && !(wp->w_closing || wp->w_buffer->b_locked > 0))
 	    {
 		win_close(wp, FALSE);
-#ifdef FEAT_AUTOCMD
 		wpnext = firstwin;	/* just in case an autocommand does
 					   something strange with windows */
 		tpnext = first_tabpage;	/* start all over...*/
 		open_wins = 0;
-#endif
 	    }
 	    else
 		++open_wins;
@@ -5251,14 +5163,10 @@ ex_buffer_all(exarg_T *eap)
      * open one.  Otherwise move the window to the right position.
      * Watch out for autocommands that delete buffers or windows!
      */
-#ifdef FEAT_AUTOCMD
     /* Don't execute Win/Buf Enter/Leave autocommands here. */
     ++autocmd_no_enter;
-#endif
     win_enter(lastwin, FALSE);
-#ifdef FEAT_AUTOCMD
     ++autocmd_no_leave;
-#endif
     for (buf = firstbuf; buf != NULL && open_wins < count; buf = buf->b_next)
     {
 	/* Check if this buffer needs a window */
@@ -5286,11 +5194,10 @@ ex_buffer_all(exarg_T *eap)
 
 	if (wp == NULL && split_ret == OK)
 	{
-#ifdef FEAT_AUTOCMD
 	    bufref_T	bufref;
 
 	    set_bufref(&bufref, buf);
-#endif
+
 	    /* Split the window and put the buffer in it */
 	    p_ea_save = p_ea;
 	    p_ea = TRUE;		/* use space from all windows */
@@ -5305,20 +5212,18 @@ ex_buffer_all(exarg_T *eap)
 	    swap_exists_action = SEA_DIALOG;
 #endif
 	    set_curbuf(buf, DOBUF_GOTO);
-#ifdef FEAT_AUTOCMD
 	    if (!bufref_valid(&bufref))
 	    {
 		/* autocommands deleted the buffer!!! */
 #if defined(HAS_SWAP_EXISTS_ACTION)
 		swap_exists_action = SEA_NONE;
-# endif
+#endif
 		break;
 	    }
-#endif
 #if defined(HAS_SWAP_EXISTS_ACTION)
 	    if (swap_exists_action == SEA_QUIT)
 	    {
-# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+# if defined(FEAT_EVAL)
 		cleanup_T   cs;
 
 		/* Reset the error/interrupt/exception state here so that
@@ -5332,7 +5237,7 @@ ex_buffer_all(exarg_T *eap)
 		swap_exists_action = SEA_NONE;
 		swap_exists_did_quit = TRUE;
 
-# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+# if defined(FEAT_EVAL)
 		/* Restore the error/interrupt/exception state if not
 		 * discarded by a new aborting error, interrupt, or uncaught
 		 * exception. */
@@ -5359,13 +5264,9 @@ ex_buffer_all(exarg_T *eap)
 	if (had_tab > 0 && tabpage_index(NULL) <= p_tpm)
 	    cmdmod.tab = 9999;
     }
-#ifdef FEAT_AUTOCMD
     --autocmd_no_enter;
-#endif
     win_enter(firstwin, FALSE);		/* back to first window */
-#ifdef FEAT_AUTOCMD
     --autocmd_no_leave;
-#endif
 
     /*
      * Close superfluous windows.
@@ -5374,15 +5275,12 @@ ex_buffer_all(exarg_T *eap)
     {
 	r = (buf_hide(wp->w_buffer) || !bufIsChanged(wp->w_buffer)
 				     || autowrite(wp->w_buffer, FALSE) == OK);
-#ifdef FEAT_AUTOCMD
 	if (!win_valid(wp))
 	{
 	    /* BufWrite Autocommands made the window invalid, start over */
 	    wp = lastwin;
 	}
-	else
-#endif
-	    if (r)
+	else if (r)
 	{
 	    win_close(wp, !buf_hide(wp->w_buffer));
 	    --open_wins;
@@ -6233,12 +6131,10 @@ set_buflisted(int on)
     if (on != curbuf->b_p_bl)
     {
 	curbuf->b_p_bl = on;
-#ifdef FEAT_AUTOCMD
 	if (on)
 	    apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, curbuf);
 	else
 	    apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf);
-#endif
     }
 }
 
@@ -6311,13 +6207,11 @@ wipe_buffer(
     if (buf->b_fnum == top_file_num - 1)
 	--top_file_num;
 
-#ifdef FEAT_AUTOCMD
     if (!aucmd)		    /* Don't trigger BufDelete autocommands here. */
 	block_autocmds();
-#endif
+
     close_buffer(NULL, buf, DOBUF_WIPE, FALSE);
-#ifdef FEAT_AUTOCMD
+
     if (!aucmd)
 	unblock_autocmds();
-#endif
 }
--- a/src/diff.c
+++ b/src/diff.c
@@ -872,13 +872,9 @@ diff_file(
 		    (diff_flags & DIFF_ICASE) ? "-i " : "",
 		    tmp_orig, tmp_new);
 	    append_redir(cmd, (int)len, p_srr, tmp_diff);
-#ifdef FEAT_AUTOCMD
 	    block_autocmds();	/* Avoid ShellCmdPost stuff */
-#endif
 	    (void)call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT);
-#ifdef FEAT_AUTOCMD
 	    unblock_autocmds();
-#endif
 	    vim_free(cmd);
 	}
     }
@@ -984,13 +980,9 @@ ex_diffpatch(exarg_T *eap)
 	 * cooked mode to allow the user to respond to prompts. */
 	vim_snprintf((char *)buf, buflen, "patch -o %s %s < %s",
 						  tmp_new, tmp_orig, esc_name);
-#ifdef FEAT_AUTOCMD
 	block_autocmds();	/* Avoid ShellCmdPost stuff */
-#endif
 	(void)call_shell(buf, SHELL_FILTER | SHELL_COOKED);
-#ifdef FEAT_AUTOCMD
 	unblock_autocmds();
-#endif
     }
 
 #ifdef UNIX
@@ -1052,11 +1044,9 @@ ex_diffpatch(exarg_T *eap)
 		    eap->arg = newname;
 		    ex_file(eap);
 
-#ifdef FEAT_AUTOCMD
 		    /* Do filetype detection with the new name. */
 		    if (au_has_group((char_u *)"filetypedetect"))
 			do_cmdline_cmd((char_u *)":doau filetypedetect BufRead");
-#endif
 		}
 	    }
 	}
--- a/src/edit.c
+++ b/src/edit.c
@@ -273,7 +273,7 @@ static int  ins_ctrl_ey(int tc);
 static void ins_try_si(int c);
 #endif
 static colnr_T get_nolist_virtcol(void);
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
 static char_u *do_insert_char_pre(int c);
 #endif
 
@@ -388,7 +388,6 @@ edit(
     ins_compl_clear();	    /* clear stuff for CTRL-X mode */
 #endif
 
-#ifdef FEAT_AUTOCMD
     /*
      * Trigger InsertEnter autocommands.  Do not do this for "r<CR>" or "grx".
      */
@@ -396,7 +395,7 @@ edit(
     {
 	pos_T   save_cursor = curwin->w_cursor;
 
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	if (cmdchar == 'R')
 	    ptr = (char_u *)"r";
 	else if (cmdchar == 'V')
@@ -405,7 +404,7 @@ edit(
 	    ptr = (char_u *)"i";
 	set_vim_var_string(VV_INSERTMODE, ptr, 1);
 	set_vim_var_string(VV_CHAR, NULL, -1);  /* clear v:char */
-# endif
+#endif
 	apply_autocmds(EVENT_INSERTENTER, NULL, NULL, FALSE, curbuf);
 
 	/* Make sure the cursor didn't move.  Do call check_cursor_col() in
@@ -415,9 +414,9 @@ edit(
 	 * line number is still valid (lines may have been deleted).
 	 * Do not restore if v:char was set to a non-empty string. */
 	if (!EQUAL_POS(curwin->w_cursor, save_cursor)
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 		&& *get_vim_var_str(VV_CHAR) == NUL
-# endif
+#endif
 		&& save_cursor.lnum <= curbuf->b_ml.ml_line_count)
 	{
 	    int save_state = State;
@@ -428,7 +427,6 @@ edit(
 	    State = save_state;
 	}
     }
-#endif
 
 #ifdef FEAT_CONCEAL
     /* Check if the cursor line needs redrawing before changing State.  If
@@ -521,7 +519,7 @@ edit(
      */
     if (curbuf->b_p_iminsert == B_IMODE_LMAP)
 	State |= LANGMAP;
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
     im_set_active(curbuf->b_p_iminsert == B_IMODE_IM);
 #endif
 
@@ -805,10 +803,8 @@ edit(
 		c = safe_vgetc();
 	    } while (c == K_IGNORE || c == K_NOP);
 
-#ifdef FEAT_AUTOCMD
 	/* Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. */
 	did_cursorhold = TRUE;
-#endif
 
 #ifdef FEAT_RIGHTLEFT
 	if (p_hkmap && KeyTyped)
@@ -856,7 +852,7 @@ edit(
 		 * completion: Add to "compl_leader". */
 		if (ins_compl_accept_char(c))
 		{
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
 		    /* Trigger InsertCharPre. */
 		    char_u *str = do_insert_char_pre(c);
 		    char_u *p;
@@ -1030,12 +1026,10 @@ doESCkey:
 
 	    if (ins_esc(&count, cmdchar, nomove))
 	    {
-#ifdef FEAT_AUTOCMD
 		if (cmdchar != 'r' && cmdchar != 'v')
 		    apply_autocmds(EVENT_INSERTLEAVE, NULL, NULL,
 							       FALSE, curbuf);
 		did_cursorhold = FALSE;
-#endif
 		return (c == Ctrl_O);
 	    }
 	    continue;
@@ -1234,12 +1228,10 @@ doESCkey:
 	case K_IGNORE:	/* Something mapped to nothing */
 	    break;
 
-#ifdef FEAT_AUTOCMD
 	case K_CURSORHOLD:	/* Didn't type something for a while. */
 	    apply_autocmds(EVENT_CURSORHOLDI, NULL, NULL, FALSE, curbuf);
 	    did_cursorhold = TRUE;
 	    break;
-#endif
 
 #ifdef FEAT_GUI_W32
 	    /* On Win32 ignore <M-F4>, we get it when closing the window was
@@ -1488,7 +1480,7 @@ normalchar:
 	    /*
 	     * Insert a normal character.
 	     */
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
 	    if (!p_paste)
 	    {
 		/* Trigger InsertCharPre. */
@@ -1565,16 +1557,14 @@ normalchar:
 	    break;
 	}   /* end of switch (c) */
 
-#ifdef FEAT_AUTOCMD
 	/* If typed something may trigger CursorHoldI again. */
 	if (c != K_CURSORHOLD
-# ifdef FEAT_COMPL_FUNC
+#ifdef FEAT_COMPL_FUNC
 		/* but not in CTRL-X mode, a script can't restore the state */
 		&& ctrl_x_mode == CTRL_X_NORMAL
-# endif
+#endif
 	       )
 	    did_cursorhold = FALSE;
-#endif
 
 	/* If the cursor was moved we didn't just insert a space */
 	if (arrow_used)
@@ -1624,25 +1614,17 @@ ins_redraw(
     if (char_avail())
 	return;
 
-#if defined(FEAT_AUTOCMD) || defined(FEAT_CONCEAL)
+#if defined(FEAT_CONCEAL)
     /* Trigger CursorMoved if the cursor moved.  Not when the popup menu is
      * visible, the command might delete it. */
-    if (ready && (
-# ifdef FEAT_AUTOCMD
-		has_cursormovedI()
-# endif
-# if defined(FEAT_AUTOCMD) && defined(FEAT_CONCEAL)
-		||
-# endif
-# ifdef FEAT_CONCEAL
-		curwin->w_p_cole > 0
+    if (ready && (has_cursormovedI()
+# if defined(FEAT_CONCEAL)
+		|| curwin->w_p_cole > 0
 # endif
 		)
-# ifdef FEAT_AUTOCMD
-	&& !EQUAL_POS(last_cursormoved, curwin->w_cursor)
-# endif
+	    && !EQUAL_POS(last_cursormoved, curwin->w_cursor)
 # ifdef FEAT_INS_EXPAND
-	&& !pum_visible()
+	    && !pum_visible()
 # endif
        )
     {
@@ -1654,7 +1636,6 @@ ins_redraw(
 	if (syntax_present(curwin) && must_redraw)
 	    update_screen(0);
 # endif
-# ifdef FEAT_AUTOCMD
 	if (has_cursormovedI())
 	{
 	    /* Make sure curswant is correct, an autocommand may call
@@ -1662,37 +1643,31 @@ ins_redraw(
 	    update_curswant();
 	    apply_autocmds(EVENT_CURSORMOVEDI, NULL, NULL, FALSE, curbuf);
 	}
-# endif
 # ifdef FEAT_CONCEAL
 	if (curwin->w_p_cole > 0)
 	{
-#  ifdef FEAT_AUTOCMD
 	    conceal_old_cursor_line = last_cursormoved.lnum;
-#  endif
 	    conceal_new_cursor_line = curwin->w_cursor.lnum;
 	    conceal_update_lines = TRUE;
 	}
 # endif
-# ifdef FEAT_AUTOCMD
 	last_cursormoved = curwin->w_cursor;
-# endif
-    }
-#endif
-
-#ifdef FEAT_AUTOCMD
+    }
+#endif
+
     /* Trigger TextChangedI if b_changedtick differs. */
     if (ready && has_textchangedI()
 	    && curbuf->b_last_changedtick != CHANGEDTICK(curbuf)
-# ifdef FEAT_INS_EXPAND
+#ifdef FEAT_INS_EXPAND
 	    && !pum_visible()
-# endif
+#endif
 	    )
     {
 	apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
 	curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
     }
 
-# ifdef FEAT_INS_EXPAND
+#ifdef FEAT_INS_EXPAND
     /* Trigger TextChangedP if b_changedtick differs. When the popupmenu closes
      * TextChangedI will need to trigger for backwards compatibility, thus use
      * different b_last_changedtick* variables. */
@@ -1703,7 +1678,6 @@ ins_redraw(
 	apply_autocmds(EVENT_TEXTCHANGEDP, NULL, NULL, FALSE, curbuf);
 	curbuf->b_last_changedtick_pum = CHANGEDTICK(curbuf);
     }
-# endif
 #endif
 
     if (must_redraw)
@@ -4001,19 +3975,15 @@ ins_compl_prep(int c)
 	    if (want_cindent && in_cinkeys(KEY_COMPLETE, ' ', inindent(0)))
 		do_c_expr_indent();
 #endif
-#ifdef FEAT_AUTOCMD
 	    /* Trigger the CompleteDone event to give scripts a chance to act
 	     * upon the completion. */
 	    apply_autocmds(EVENT_COMPLETEDONE, NULL, NULL, FALSE, curbuf);
-#endif
-	}
-    }
-#ifdef FEAT_AUTOCMD
+	}
+    }
     else if (ctrl_x_mode == CTRL_X_LOCAL_MSG)
 	/* Trigger the CompleteDone event to give scripts a chance to act
 	 * upon the (possibly failed) completion. */
 	apply_autocmds(EVENT_COMPLETEDONE, NULL, NULL, FALSE, curbuf);
-#endif
 
     /* reset continue_* if we left expansion-mode, if we stay they'll be
      * (re)set properly in ins_complete() */
@@ -6224,10 +6194,7 @@ insertchar(
 #ifdef FEAT_RIGHTLEFT
 	    && !p_ri
 #endif
-#ifdef FEAT_AUTOCMD
-	    && !has_insertcharpre()
-#endif
-	       )
+	    && !has_insertcharpre())
     {
 #define INPUT_BUFLEN 100
 	char_u		buf[INPUT_BUFLEN + 1];
@@ -8404,7 +8371,7 @@ ins_reg(void)
     ++no_u_sync;
     if (regname == '=')
     {
-# ifdef FEAT_MBYTE
+# ifdef HAVE_INPUT_METHOD
 	int	im_on = im_get_status();
 # endif
 	/* Sync undo when evaluating the expression calls setline() or
@@ -8412,7 +8379,7 @@ ins_reg(void)
 	u_sync_once = 2;
 
 	regname = get_expr_register();
-# ifdef FEAT_MBYTE
+# ifdef HAVE_INPUT_METHOD
 	/* Restore the Input Method. */
 	if (im_on)
 	    im_set_active(TRUE);
@@ -8541,12 +8508,12 @@ ins_ctrl_hat(void)
 	{
 	    curbuf->b_p_iminsert = B_IMODE_LMAP;
 	    State |= LANGMAP;
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
 	    im_set_active(FALSE);
 #endif
 	}
     }
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
     else
     {
 	/* There are no ":lmap" mappings, toggle IM */
@@ -8693,7 +8660,7 @@ ins_esc(
 	}
     }
 
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
     /* Disable IM to allow typing English directly for Normal mode commands.
      * When ":lmap" is enabled don't change 'iminsert' (IM can be enabled as
      * well). */
@@ -8843,7 +8810,6 @@ ins_insert(int replaceState)
     }
 #endif
 
-#ifdef FEAT_AUTOCMD
 # ifdef FEAT_EVAL
     set_vim_var_string(VV_INSERTMODE,
 		   (char_u *)((State & REPLACE_FLAG) ? "i" :
@@ -8853,7 +8819,6 @@ ins_insert(int replaceState)
 			    "r"), 1);
 # endif
     apply_autocmds(EVENT_INSERTCHANGE, NULL, NULL, FALSE, curbuf);
-#endif
     if (State & REPLACE_FLAG)
 	State = INSERT | (State & LANGMAP);
     else
@@ -10573,7 +10538,7 @@ get_nolist_virtcol(void)
     return curwin->w_virtcol;
 }
 
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
 /*
  * Handle the InsertCharPre autocommand.
  * "c" is the character that was typed.
@@ -10590,11 +10555,11 @@ do_insert_char_pre(int c)
     if (!has_insertcharpre())
 	return NULL;
 
-#ifdef FEAT_MBYTE
+# ifdef FEAT_MBYTE
     if (has_mbyte)
 	buf[(*mb_char2bytes)(c, buf)] = NUL;
     else
-#endif
+# endif
     {
 	buf[0] = c;
 	buf[1] = NUL;
--- a/src/eval.c
+++ b/src/eval.c
@@ -5125,11 +5125,9 @@ garbage_collect(int testing)
     FOR_ALL_TAB_WINDOWS(tp, wp)
 	abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID,
 								  NULL, NULL);
-#ifdef FEAT_AUTOCMD
     if (aucmd_win != NULL)
 	abort = abort || set_ref_in_item(&aucmd_win->w_winvar.di_tv, copyID,
 								  NULL, NULL);
-#endif
 
     /* tabpage-local variables */
     FOR_ALL_TABPAGES(tp)
@@ -6560,7 +6558,6 @@ v_throwpoint(char_u *oldval)
     return NULL;
 }
 
-#if defined(FEAT_AUTOCMD) || defined(PROTO)
 /*
  * Set v:cmdarg.
  * If "eap" != NULL, use "eap" to generate the value and return the old value.
@@ -6618,7 +6615,7 @@ set_cmdarg(exarg_T *eap, char_u *oldarg)
     if (eap->force_ff != 0)
 	sprintf((char *)newval + STRLEN(newval), " ++ff=%s",
 						eap->cmd + eap->force_ff);
-# ifdef FEAT_MBYTE
+#ifdef FEAT_MBYTE
     if (eap->force_enc != 0)
 	sprintf((char *)newval + STRLEN(newval), " ++enc=%s",
 					       eap->cmd + eap->force_enc);
@@ -6628,11 +6625,10 @@ set_cmdarg(exarg_T *eap, char_u *oldarg)
 	STRCPY(newval + STRLEN(newval), " ++bad=drop");
     else if (eap->bad_char != 0)
 	sprintf((char *)newval + STRLEN(newval), " ++bad=%c", eap->bad_char);
-# endif
+#endif
     vimvars[VV_CMDARG].vv_str = newval;
     return oldval;
 }
-#endif
 
 /*
  * Get the value of internal variable "name".
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -2668,9 +2668,7 @@ f_delete(typval_T *argvars, typval_T *re
     static void
 f_did_filetype(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
-#ifdef FEAT_AUTOCMD
     rettv->vval.v_number = did_filetype;
-#endif
 }
 
 /*
@@ -3053,12 +3051,10 @@ f_exists(typval_T *argvars, typval_T *re
     }
     else if (*p == '#')
     {
-#ifdef FEAT_AUTOCMD
 	if (p[1] == '#')
 	    n = autocmd_supported(p + 2);
 	else
 	    n = au_exists(p + 1);
-#endif
     }
     else				/* internal variable */
     {
@@ -5797,9 +5793,7 @@ f_has(typval_T *argvars, typval_T *rettv
 #ifdef FEAT_ARABIC
 	"arabic",
 #endif
-#ifdef FEAT_AUTOCMD
 	"autocmd",
-#endif
 #ifdef FEAT_AUTOSERVERNAME
 	"autoservername",
 #endif
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -28,9 +28,7 @@ static int read_viminfo_up_to_marks(vir_
 #endif
 
 static int check_readonly(int *forceit, buf_T *buf);
-#ifdef FEAT_AUTOCMD
 static void delbuf_msg(char_u *name);
-#endif
 static int
 #ifdef __BORLANDC__
     _RTLENTRYF
@@ -1148,9 +1146,7 @@ do_bang(
 	/* Careful: This may recursively call do_bang() again! (because of
 	 * autocommands) */
 	do_filter(line1, line2, eap, newcmd, do_in, do_out);
-#ifdef FEAT_AUTOCMD
 	apply_autocmds(EVENT_SHELLFILTERPOST, NULL, NULL, FALSE, curbuf);
-#endif
     }
     if (free_newcmd)
 	vim_free(newcmd);
@@ -1186,9 +1182,7 @@ do_filter(
     linenr_T	read_linecount;
     pos_T	cursor_save;
     char_u	*cmd_buf;
-#ifdef FEAT_AUTOCMD
     buf_T	*old_curbuf = curbuf;
-#endif
     int		shell_flags = 0;
 
     if (*cmd == NUL)	    /* no filter command */
@@ -1259,16 +1253,14 @@ do_filter(
     {
 	msg_putchar('\n');		/* keep message from buf_write() */
 	--no_wait_return;
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	if (!aborting())
 #endif
 	    (void)EMSG2(_(e_notcreate), itmp);	/* will call wait_return */
 	goto filterend;
     }
-#ifdef FEAT_AUTOCMD
     if (curbuf != old_curbuf)
 	goto filterend;
-#endif
 
     if (!do_out)
 	msg_putchar('\n');
@@ -1334,7 +1326,7 @@ do_filter(
 	    if (readfile(otmp, NULL, line2, (linenr_T)0, (linenr_T)MAXLNUM,
 						    eap, READ_FILTER) != OK)
 	    {
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 		if (!aborting())
 #endif
 		{
@@ -1343,10 +1335,8 @@ do_filter(
 		}
 		goto error;
 	    }
-#ifdef FEAT_AUTOCMD
 	    if (curbuf != old_curbuf)
 		goto filterend;
-#endif
 	}
 
 	read_linecount = curbuf->b_ml.ml_line_count - read_linecount;
@@ -1426,13 +1416,11 @@ error:
 
 filterend:
 
-#ifdef FEAT_AUTOCMD
     if (curbuf != old_curbuf)
     {
 	--no_wait_return;
 	EMSG(_("E135: *Filter* Autocommands must not change current buffer"));
     }
-#endif
     if (itmp != NULL)
 	mch_remove(itmp);
     if (otmp != NULL)
@@ -1482,9 +1470,7 @@ do_shell(
      * avoid having to type return below.
      */
     msg_putchar('\r');			/* put cursor at start of line */
-#ifdef FEAT_AUTOCMD
     if (!autocmd_busy)
-#endif
     {
 #ifdef MSWIN
 	if (!winstart)
@@ -1497,11 +1483,7 @@ do_shell(
 	msg_putchar('\n');		/* may shift screen one line up */
 
     /* warning message before calling the shell */
-    if (p_warn
-#ifdef FEAT_AUTOCMD
-		&& !autocmd_busy
-#endif
-		&& msg_silent == 0)
+    if (p_warn && !autocmd_busy && msg_silent == 0)
 	FOR_ALL_BUFFERS(buf)
 	    if (bufIsChangedNotTerm(buf))
 	    {
@@ -1536,14 +1518,12 @@ do_shell(
 	msg_col = 0;
     }
 
-#ifdef FEAT_AUTOCMD
     if (autocmd_busy)
     {
 	if (msg_silent == 0)
 	    redraw_later_clear();
     }
     else
-#endif
     {
 	/*
 	 * For ":sh" there is no need to call wait_return(), just redraw.
@@ -1612,9 +1592,7 @@ do_shell(
     /* display any error messages now */
     display_errors();
 
-#ifdef FEAT_AUTOCMD
     apply_autocmds(EVENT_SHELLCMDPOST, NULL, NULL, FALSE, curbuf);
-#endif
 }
 
 /*
@@ -2979,16 +2957,14 @@ rename_buffer(char_u *new_fname)
     char_u	*fname, *sfname, *xfname;
     buf_T	*buf;
 
-#ifdef FEAT_AUTOCMD
     buf = curbuf;
     apply_autocmds(EVENT_BUFFILEPRE, NULL, NULL, FALSE, curbuf);
     /* buffer changed, don't change name now */
     if (buf != curbuf)
 	return FAIL;
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
     if (aborting())	    /* autocmds may abort script processing */
 	return FAIL;
-# endif
 #endif
     /*
      * The name of the current buffer will be changed.
@@ -3017,9 +2993,8 @@ rename_buffer(char_u *new_fname)
     }
     vim_free(fname);
     vim_free(sfname);
-#ifdef FEAT_AUTOCMD
     apply_autocmds(EVENT_BUFFILEPOST, NULL, NULL, FALSE, curbuf);
-#endif
+
     /* Change directories when the 'acd' option is set. */
     DO_AUTOCHDIR
     return OK;
@@ -3198,22 +3173,20 @@ do_write(exarg_T *eap)
     {
 	if (eap->cmdidx == CMD_saveas && alt_buf != NULL)
 	{
-#ifdef FEAT_AUTOCMD
 	    buf_T	*was_curbuf = curbuf;
 
 	    apply_autocmds(EVENT_BUFFILEPRE, NULL, NULL, FALSE, curbuf);
 	    apply_autocmds(EVENT_BUFFILEPRE, NULL, NULL, FALSE, alt_buf);
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	    if (curbuf != was_curbuf || aborting())
-# else
+#else
 	    if (curbuf != was_curbuf)
-# endif
+#endif
 	    {
 		/* buffer changed, don't change name now */
 		retval = FAIL;
 		goto theend;
 	    }
-#endif
 	    /* Exchange the file names for the current and the alternate
 	     * buffer.  This makes it look like we are now editing the buffer
 	     * under the new name.  Must be done before buf_write(), because
@@ -3229,7 +3202,7 @@ do_write(exarg_T *eap)
 	    alt_buf->b_sfname = curbuf->b_sfname;
 	    curbuf->b_sfname = fname;
 	    buf_name_changed(curbuf);
-#ifdef FEAT_AUTOCMD
+
 	    apply_autocmds(EVENT_BUFFILEPOST, NULL, NULL, FALSE, curbuf);
 	    apply_autocmds(EVENT_BUFFILEPOST, NULL, NULL, FALSE, alt_buf);
 	    if (!alt_buf->b_p_bl)
@@ -3237,11 +3210,11 @@ do_write(exarg_T *eap)
 		alt_buf->b_p_bl = TRUE;
 		apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, alt_buf);
 	    }
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	    if (curbuf != was_curbuf || aborting())
-# else
+#else
 	    if (curbuf != was_curbuf)
-# endif
+#endif
 	    {
 		/* buffer changed, don't write the file */
 		retval = FAIL;
@@ -3260,7 +3233,6 @@ do_write(exarg_T *eap)
 	    /* Autocommands may have changed buffer names, esp. when
 	     * 'autochdir' is set. */
 	    fname = curbuf->b_sfname;
-#endif
 	}
 
 	name_was_missing = curbuf->b_ffname == NULL;
@@ -3489,18 +3461,14 @@ do_wqall(exarg_T *eap)
 	    }
 	    else
 	    {
-#ifdef FEAT_AUTOCMD
 		bufref_T bufref;
 
 		set_bufref(&bufref, buf);
-#endif
 		if (buf_write_all(buf, eap->forceit) == FAIL)
 		    ++error;
-#ifdef FEAT_AUTOCMD
 		/* an autocommand may have deleted the buffer */
 		if (!bufref_valid(&bufref))
 		    buf = firstbuf;
-#endif
 	    }
 	    eap->forceit = save_forceit;    /* check_overwrite() may set it */
 	}
@@ -3604,10 +3572,8 @@ getfile(
 
     if (text_locked())
 	return GETFILE_ERROR;
-#ifdef FEAT_AUTOCMD
     if (curbuf_locked())
 	return GETFILE_ERROR;
-#endif
 
     if (fnum == 0)
     {
@@ -3702,17 +3668,15 @@ do_ecmd(
 {
     int		other_file;		/* TRUE if editing another file */
     int		oldbuf;			/* TRUE if using existing buffer */
-#ifdef FEAT_AUTOCMD
     int		auto_buf = FALSE;	/* TRUE if autocommands brought us
 					   into the buffer unexpectedly */
     char_u	*new_name = NULL;
+#if defined(FEAT_EVAL)
     int		did_set_swapcommand = FALSE;
 #endif
     buf_T	*buf;
     bufref_T	bufref;
-#if defined(FEAT_AUTOCMD) || defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
     bufref_T	old_curbuf;
-#endif
     char_u	*free_fname = NULL;
 #ifdef FEAT_BROWSE
     char_u	*browse_file = NULL;
@@ -3736,9 +3700,7 @@ do_ecmd(
 
     if (eap != NULL)
 	command = eap->do_ecmd_cmd;
-#if defined(FEAT_AUTOCMD) || defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
     set_bufref(&old_curbuf, curbuf);
-#endif
 
     if (fnum != 0)
     {
@@ -3751,11 +3713,10 @@ do_ecmd(
 #ifdef FEAT_BROWSE
 	if (cmdmod.browse)
 	{
-# ifdef FEAT_AUTOCMD
 	    if (
-#  ifdef FEAT_GUI
+# ifdef FEAT_GUI
 		!gui.in_use &&
-#  endif
+# endif
 		    au_has_group((char_u *)"FileExplorer"))
 	    {
 		/* No browsing supported but we do have the file explorer:
@@ -3764,7 +3725,6 @@ do_ecmd(
 		    ffname = (char_u *)".";
 	    }
 	    else
-# endif
 	    {
 		browse_file = do_browse(0, (char_u *)_("Edit File"), ffname,
 						    NULL, NULL, NULL, curbuf);
@@ -3838,7 +3798,7 @@ do_ecmd(
      */
     reset_VIsual();
 
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
     if ((command != NULL || newlnum > (linenr_T)0)
 	    && *get_vim_var_str(VV_SWAPCOMMAND) == NUL)
     {
@@ -3901,12 +3861,11 @@ do_ecmd(
 #endif
 	    buf = buflist_new(ffname, sfname, 0L,
 		    BLN_CURBUF | ((flags & ECMD_SET_HELP) ? 0 : BLN_LISTED));
-#ifdef FEAT_AUTOCMD
+
 	    /* autocommands may change curwin and curbuf */
 	    if (oldwin != NULL)
 		oldwin = curwin;
 	    set_bufref(&old_curbuf, curbuf);
-#endif
 	}
 	if (buf == NULL)
 	    goto theend;
@@ -3921,11 +3880,7 @@ do_ecmd(
 	    (void)buf_check_timestamp(buf, FALSE);
 	    /* Check if autocommands made the buffer invalid or changed the
 	     * current buffer. */
-	    if (!bufref_valid(&bufref)
-#ifdef FEAT_AUTOCMD
-		    || curbuf != old_curbuf.br_buf
-#endif
-		    )
+	    if (!bufref_valid(&bufref) || curbuf != old_curbuf.br_buf)
 		goto theend;
 #ifdef FEAT_EVAL
 	    if (aborting())	    /* autocmds may abort script processing */
@@ -3950,7 +3905,6 @@ do_ecmd(
 	 */
 	if (buf != curbuf)
 	{
-#ifdef FEAT_AUTOCMD
 	    /*
 	     * Be careful: The autocommands may delete any buffer and change
 	     * the current buffer.
@@ -3971,13 +3925,13 @@ do_ecmd(
 		delbuf_msg(new_name);	/* frees new_name */
 		goto theend;
 	    }
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	    if (aborting())	    /* autocmds may abort script processing */
 	    {
 		vim_free(new_name);
 		goto theend;
 	    }
-# endif
+#endif
 	    if (buf == curbuf)		/* already in new buffer */
 		auto_buf = TRUE;
 	    else
@@ -3990,7 +3944,6 @@ do_ecmd(
 		++buf->b_locked;
 
 		if (curbuf == old_curbuf.br_buf)
-#endif
 		    buf_copy_options(buf, BCO_ENTER);
 
 		/* Close the link to the current buffer. This will set
@@ -3999,18 +3952,17 @@ do_ecmd(
 		close_buffer(oldwin, curbuf,
 			       (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD, FALSE);
 
-#ifdef FEAT_AUTOCMD
 		the_curwin->w_closing = FALSE;
 		--buf->b_locked;
 
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 		/* autocmds may abort script processing */
 		if (aborting() && curwin->w_buffer != NULL)
 		{
 		    vim_free(new_name);
 		    goto theend;
 		}
-# endif
+#endif
 		/* Be careful again, like above. */
 		if (!bufref_valid(&au_new_curbuf))
 		{
@@ -4021,7 +3973,6 @@ do_ecmd(
 		if (buf == curbuf)		/* already in new buffer */
 		    auto_buf = TRUE;
 		else
-#endif
 		{
 #ifdef FEAT_SYN_HL
 		    /*
@@ -4054,13 +4005,10 @@ do_ecmd(
 #ifdef FEAT_SPELL
 		did_get_winopts = TRUE;
 #endif
-
-#ifdef FEAT_AUTOCMD
 	    }
 	    vim_free(new_name);
 	    au_new_curbuf.br_buf = NULL;
 	    au_new_curbuf.br_buf_free_count = 0;
-#endif
 	}
 
 	curwin->w_pcmark.lnum = 1;
@@ -4083,9 +4031,7 @@ do_ecmd(
     ++RedrawingDisabled;
     did_inc_redrawing_disabled = TRUE;
 
-#ifdef FEAT_AUTOCMD
     buf = curbuf;
-#endif
     if ((flags & ECMD_SET_HELP) || keep_help_flag)
     {
 	prepare_help_buffer();
@@ -4098,21 +4044,19 @@ do_ecmd(
 	    set_buflisted(TRUE);
     }
 
-#ifdef FEAT_AUTOCMD
     /* If autocommands change buffers under our fingers, forget about
      * editing the file. */
     if (buf != curbuf)
 	goto theend;
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
     if (aborting())	    /* autocmds may abort script processing */
 	goto theend;
-# endif
+#endif
 
     /* Since we are starting to edit a file, consider the filetype to be
      * unset.  Helps for when an autocommand changes files and expects syntax
      * highlighting to work in the other file. */
     did_filetype = FALSE;
-#endif
 
 /*
  * other_file	oldbuf
@@ -4129,14 +4073,13 @@ do_ecmd(
 	    newlnum = curwin->w_cursor.lnum;
 	    solcol = curwin->w_cursor.col;
 	}
-#ifdef FEAT_AUTOCMD
 	buf = curbuf;
 	if (buf->b_fname != NULL)
 	    new_name = vim_strsave(buf->b_fname);
 	else
 	    new_name = NULL;
 	set_bufref(&bufref, buf);
-#endif
+
 	if (p_ur < 0 || curbuf->b_ml.ml_line_count <= p_ur)
 	{
 	    /* Save all the text, so that the reload can be undone.
@@ -4145,9 +4088,7 @@ do_ecmd(
 	    if (u_savecommon(0, curbuf->b_ml.ml_line_count + 1, 0, TRUE)
 								     == FAIL)
 	    {
-#ifdef FEAT_AUTOCMD
 		vim_free(new_name);
-#endif
 		goto theend;
 	    }
 	    u_unchanged(curbuf);
@@ -4158,7 +4099,7 @@ do_ecmd(
 	}
 	else
 	    buf_freeall(curbuf, 0);   /* free all things for buffer */
-#ifdef FEAT_AUTOCMD
+
 	/* If autocommands deleted the buffer we were going to re-edit, give
 	 * up and jump to the end. */
 	if (!bufref_valid(&bufref))
@@ -4173,10 +4114,9 @@ do_ecmd(
 	 * the autocommands changed the buffer... */
 	if (buf != curbuf)
 	    goto theend;
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	if (aborting())	    /* autocmds may abort script processing */
 	    goto theend;
-# endif
 #endif
 	buf_clear_file(curbuf);
 	curbuf->b_op_start.lnum = 0;	/* clear '[ and '] marks */
@@ -4194,9 +4134,7 @@ do_ecmd(
      */
     check_arg_idx(curwin);
 
-#ifdef FEAT_AUTOCMD
     if (!auto_buf)
-#endif
     {
 	/*
 	 * Set cursor and init window before reading the file and executing
@@ -4237,7 +4175,7 @@ do_ecmd(
 	    /*
 	     * Open the buffer and read the file.
 	     */
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	    if (should_abort(open_buffer(FALSE, eap, readfile_flags)))
 		retval = FAIL;
 #else
@@ -4250,7 +4188,6 @@ do_ecmd(
 	    handle_swap_exists(&old_curbuf);
 #endif
 	}
-#ifdef FEAT_AUTOCMD
 	else
 	{
 	    /* Read the modelines, but only to set window-local options.  Any
@@ -4264,7 +4201,6 @@ do_ecmd(
 								    &retval);
 	}
 	check_arg_idx(curwin);
-#endif
 
 	/* If autocommands change the cursor position or topline, we should
 	 * keep it.  Also when it moves within a line. */
@@ -4342,11 +4278,7 @@ do_ecmd(
      * Did not read the file, need to show some info about the file.
      * Do this after setting the cursor.
      */
-    if (oldbuf
-#ifdef FEAT_AUTOCMD
-		&& !auto_buf
-#endif
-			    )
+    if (oldbuf && !auto_buf)
     {
 	int	msg_scroll_save = msg_scroll;
 
@@ -4430,7 +4362,7 @@ do_ecmd(
 theend:
     if (did_inc_redrawing_disabled)
 	--RedrawingDisabled;
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
     if (did_set_swapcommand)
 	set_vim_var_string(VV_SWAPCOMMAND, NULL, -1);
 #endif
@@ -4441,7 +4373,6 @@ theend:
     return retval;
 }
 
-#ifdef FEAT_AUTOCMD
     static void
 delbuf_msg(char_u *name)
 {
@@ -4451,7 +4382,6 @@ delbuf_msg(char_u *name)
     au_new_curbuf.br_buf = NULL;
     au_new_curbuf.br_buf_free_count = 0;
 }
-#endif
 
 static int append_indent = 0;	    /* autoindent for first line */
 
@@ -5156,7 +5086,7 @@ do_sub(exarg_T *eap)
      */
     line2 = eap->line2;
     for (lnum = eap->line1; lnum <= line2 && !(got_quit
-#if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD)
+#if defined(FEAT_EVAL)
 		|| aborting()
 #endif
 		); ++lnum)
@@ -6870,7 +6800,6 @@ fix_help_buffer(void)
     char_u	*rt;
     int		mustfree;
 
-#ifdef FEAT_AUTOCMD
     /* Set filetype to "help" if still needed. */
     if (STRCMP(curbuf->b_p_ft, "help") != 0)
     {
@@ -6878,7 +6807,6 @@ fix_help_buffer(void)
 	set_option_value((char_u *)"ft", 0L, (char_u *)"help", OPT_LOCAL);
 	--curbuf_lock;
     }
-#endif
 
 #ifdef FEAT_SYN_HL
     if (!syntax_present(curwin))
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -2045,17 +2045,15 @@ autowrite_all(void)
     FOR_ALL_BUFFERS(buf)
 	if (bufIsChanged(buf) && !buf->b_p_ro)
 	{
-#ifdef FEAT_AUTOCMD
 	    bufref_T	bufref;
 
 	    set_bufref(&bufref, buf);
-#endif
+
 	    (void)buf_write_all(buf, FALSE);
-#ifdef FEAT_AUTOCMD
+
 	    /* an autocommand may have deleted the buffer */
 	    if (!bufref_valid(&bufref))
 		buf = firstbuf;
-#endif
 	}
 }
 
@@ -2067,11 +2065,9 @@ autowrite_all(void)
 check_changed(buf_T *buf, int flags)
 {
     int		forceit = (flags & CCGD_FORCEIT);
-#ifdef FEAT_AUTOCMD
     bufref_T	bufref;
 
     set_bufref(&bufref, buf);
-#endif
 
     if (       !forceit
 	    && bufIsChanged(buf)
@@ -2093,17 +2089,15 @@ check_changed(buf_T *buf, int flags)
 # endif
 					))
 			++count;
-# ifdef FEAT_AUTOCMD
 	    if (!bufref_valid(&bufref))
 		/* Autocommand deleted buffer, oops!  It's not changed now. */
 		return FALSE;
-# endif
+
 	    dialog_changed(buf, count > 1);
-# ifdef FEAT_AUTOCMD
+
 	    if (!bufref_valid(&bufref))
 		/* Autocommand deleted buffer, oops!  It's not changed now. */
 		return FALSE;
-# endif
 	    return bufIsChanged(buf);
 	}
 #endif
@@ -2197,11 +2191,9 @@ dialog_changed(
 			)
 		    && !buf2->b_p_ro)
 	    {
-#ifdef FEAT_AUTOCMD
 		bufref_T bufref;
 
 		set_bufref(&bufref, buf2);
-#endif
 #ifdef FEAT_BROWSE
 		/* May get file name, when there is none */
 		browse_save_fname(buf2);
@@ -2210,11 +2202,10 @@ dialog_changed(
 				  buf2->b_fname, buf2->b_ffname, FALSE) == OK)
 		    /* didn't hit Cancel */
 		    (void)buf_write_all(buf2, FALSE);
-#ifdef FEAT_AUTOCMD
+
 		/* an autocommand may have deleted the buffer */
 		if (!bufref_valid(&bufref))
 		    buf2 = firstbuf;
-#endif
 	    }
 	}
     }
@@ -2370,19 +2361,15 @@ check_changed_any(
 	FOR_ALL_TAB_WINDOWS(tp, wp)
 	    if (wp->w_buffer == buf)
 	    {
-#ifdef FEAT_AUTOCMD
 		bufref_T bufref;
 
 		set_bufref(&bufref, buf);
-#endif
+
 		goto_tabpage_win(tp, wp);
-#ifdef FEAT_AUTOCMD
+
 		/* Paranoia: did autocms wipe out the buffer with changes? */
 		if (!bufref_valid(&bufref))
-		{
 		    goto theend;
-		}
-#endif
 		goto buf_found;
 	    }
 buf_found:
@@ -2420,20 +2407,16 @@ check_fname(void)
 buf_write_all(buf_T *buf, int forceit)
 {
     int	    retval;
-#ifdef FEAT_AUTOCMD
     buf_T	*old_curbuf = curbuf;
-#endif
 
     retval = (buf_write(buf, buf->b_ffname, buf->b_fname,
 				   (linenr_T)1, buf->b_ml.ml_line_count, NULL,
 						  FALSE, forceit, TRUE, FALSE));
-#ifdef FEAT_AUTOCMD
     if (curbuf != old_curbuf)
     {
 	msg_source(HL_ATTR(HLF_W));
 	MSG(_("Warning: Entered other buffer unexpectedly (check autocommands)"));
     }
-#endif
     return retval;
 }
 
@@ -3053,7 +3036,7 @@ ex_listdo(exarg_T *eap)
     tabpage_T	*tp;
     buf_T	*buf = curbuf;
     int		next_fnum = 0;
-#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
+#if defined(FEAT_SYN_HL)
     char_u	*save_ei = NULL;
 #endif
     char_u	*p_shm_save;
@@ -3071,7 +3054,7 @@ ex_listdo(exarg_T *eap)
     }
 #endif
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
+#if defined(FEAT_SYN_HL)
     if (eap->cmdidx != CMD_windo && eap->cmdidx != CMD_tabdo)
 	/* Don't do syntax HL autocommands.  Skipping the syntax file is a
 	 * great speed improvement. */
@@ -3265,7 +3248,7 @@ ex_listdo(exarg_T *eap)
 	listcmd_busy = FALSE;
     }
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
+#if defined(FEAT_SYN_HL)
     if (save_ei != NULL)
     {
 	au_event_restore(save_ei);
@@ -3660,6 +3643,8 @@ source_in_path(char_u *path, char_u *nam
 }
 
 
+#if defined(FEAT_EVAL) || defined(PROTO)
+
 /*
  * Expand wildcards in "pat" and invoke do_source() for each match.
  */
@@ -3800,7 +3785,6 @@ load_pack_plugin(char_u *fname)
     vim_snprintf((char *)pat, len, plugpat, ffname);
     source_all_matches(pat);
 
-#ifdef FEAT_AUTOCMD
     {
 	char_u *cmd = vim_strsave((char_u *)"g:did_load_filetypes");
 
@@ -3815,7 +3799,6 @@ load_pack_plugin(char_u *fname)
 	}
 	vim_free(cmd);
     }
-#endif
     vim_free(pat);
     retval = OK;
 
@@ -3911,8 +3894,9 @@ ex_packadd(exarg_T *eap)
 	vim_free(pat);
     }
 }
-
-#if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD)
+#endif
+
+#if defined(FEAT_EVAL) || defined(PROTO)
 /*
  * ":options"
  */
@@ -4308,23 +4292,21 @@ do_source(
 	goto theend;
     }
 
-#ifdef FEAT_AUTOCMD
     /* Apply SourceCmd autocommands, they should get the file and source it. */
     if (has_autocmd(EVENT_SOURCECMD, fname_exp, NULL)
 	    && apply_autocmds(EVENT_SOURCECMD, fname_exp, fname_exp,
 							       FALSE, curbuf))
     {
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	retval = aborting() ? FAIL : OK;
-# else
+#else
 	retval = OK;
-# endif
+#endif
 	goto theend;
     }
 
     /* Apply SourcePre autocommands, they may get the file. */
     apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf);
-#endif
 
 #ifdef USE_FOPEN_NOINH
     cookie.fp = fopen_noinh_readbin((char *)fname_exp);
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -81,14 +81,8 @@ static void	ex_abclear(exarg_T *eap);
 # define ex_menu		ex_ni
 # define ex_menutranslate	ex_ni
 #endif
-#ifdef FEAT_AUTOCMD
 static void	ex_autocmd(exarg_T *eap);
 static void	ex_doautocmd(exarg_T *eap);
-#else
-# define ex_autocmd		ex_ni
-# define ex_doautocmd		ex_ni
-# define ex_doautoall		ex_ni
-#endif
 #ifdef FEAT_LISTCMDS
 static void	ex_bunload(exarg_T *eap);
 static void	ex_buffer(exarg_T *eap);
@@ -234,6 +228,10 @@ static void	ex_popup(exarg_T *eap);
 # define ex_syntax		ex_ni
 # define ex_ownsyntax		ex_ni
 #endif
+#ifndef FEAT_EVAL
+# define ex_packadd		ex_ni
+# define ex_packloadall		ex_ni
+#endif
 #if !defined(FEAT_SYN_HL) || !defined(FEAT_PROFILE)
 # define ex_syntime		ex_ni
 #endif
@@ -390,13 +388,8 @@ static void	ex_viminfo(exarg_T *eap);
 # define ex_viminfo		ex_ni
 #endif
 static void	ex_behave(exarg_T *eap);
-#ifdef FEAT_AUTOCMD
 static void	ex_filetype(exarg_T *eap);
 static void	ex_setfiletype(exarg_T *eap);
-#else
-# define ex_filetype		ex_ni
-# define ex_setfiletype		ex_ni
-#endif
 #ifndef FEAT_DIFF
 # define ex_diffoff		ex_ni
 # define ex_diffpatch		ex_ni
@@ -407,7 +400,7 @@ static void	ex_setfiletype(exarg_T *eap)
 #endif
 static void	ex_digraphs(exarg_T *eap);
 static void	ex_set(exarg_T *eap);
-#if !defined(FEAT_EVAL) || !defined(FEAT_AUTOCMD)
+#if !defined(FEAT_EVAL)
 # define ex_options		ex_ni
 #endif
 #ifdef FEAT_SEARCH_EXTRA
@@ -1761,11 +1754,8 @@ do_one_cmd(
 	    /* avoid that a function call in 'statusline' does this */
 	    && !getline_equal(fgetline, cookie, get_func_line)
 #endif
-#ifdef FEAT_AUTOCMD
 	    /* avoid that an autocommand, e.g. QuitPre, does this */
-	    && !getline_equal(fgetline, cookie, getnextac)
-#endif
-	    )
+	    && !getline_equal(fgetline, cookie, getnextac))
 	--quitmore;
 
     /*
@@ -1912,7 +1902,6 @@ do_one_cmd(
 
 	    case 'n':	if (checkforcmd(&ea.cmd, "noautocmd", 3))
 			{
-#ifdef FEAT_AUTOCMD
 			    if (cmdmod.save_ei == NULL)
 			    {
 				/* Set 'eventignore' to "all". Restore the
@@ -1921,7 +1910,6 @@ do_one_cmd(
 				set_string_option_direct((char_u *)"ei", -1,
 					 (char_u *)"all", OPT_FREE, SID_NONE);
 			    }
-#endif
 			    continue;
 			}
 			if (!checkforcmd(&ea.cmd, "noswapfile", 3))
@@ -2302,7 +2290,6 @@ do_one_cmd(
 	goto doend;
     }
 
-#ifdef FEAT_AUTOCMD
     /* If this looks like an undefined user command and there are CmdUndefined
      * autocommands defined, trigger the matching autocommands. */
     if (p != NULL && ea.cmdidx == CMD_SIZE && !ea.skip
@@ -2319,9 +2306,12 @@ do_one_cmd(
 	vim_free(p);
 	/* If the autocommands did something and didn't cause an error, try
 	 * finding the command again. */
-	p = (ret && !aborting()) ? find_command(&ea, NULL) : ea.cmd;
-    }
-#endif
+	p = (ret
+#ifdef FEAT_EVAL
+		&& !aborting()
+#endif
+		) ? find_command(&ea, NULL) : ea.cmd;
+    }
 
 #ifdef FEAT_USR_CMDS
     if (p == NULL)
@@ -2421,7 +2411,6 @@ do_one_cmd(
 	    errormsg = (char_u *)_(get_text_locked_msg());
 	    goto doend;
 	}
-#ifdef FEAT_AUTOCMD
 	/* Disallow editing another buffer when "curbuf_lock" is set.
 	 * Do allow ":edit" (check for argument later).
 	 * Do allow ":checktime" (it's postponed). */
@@ -2431,7 +2420,6 @@ do_one_cmd(
 		&& !IS_USER_CMDIDX(ea.cmdidx)
 		&& curbuf_locked())
 	    goto doend;
-#endif
 
 	if (!ni && !(ea.argt & RANGE) && ea.addr_count > 0)
 	{
@@ -2971,7 +2959,7 @@ doend:
 
     if (verbose_save >= 0)
 	p_verbose = verbose_save;
-#ifdef FEAT_AUTOCMD
+
     if (cmdmod.save_ei != NULL)
     {
 	/* Restore 'eventignore' to the value before ":noautocmd". */
@@ -2979,7 +2967,7 @@ doend:
 							  OPT_FREE, SID_NONE);
 	free_string_option(cmdmod.save_ei);
     }
-#endif
+
     if (cmdmod.filter_regmatch.regprog != NULL)
 	vim_regfree(cmdmod.filter_regmatch.regprog);
 
@@ -4025,14 +4013,12 @@ set_one_cmd_context(
 		}
 	    }
 	    break;
-#ifdef FEAT_AUTOCMD
+
 	case CMD_autocmd:
 	    return set_context_in_autocmd(xp, arg, FALSE);
-
 	case CMD_doautocmd:
 	case CMD_doautoall:
 	    return set_context_in_autocmd(xp, arg, TRUE);
-#endif
 	case CMD_set:
 	    set_context_in_set_cmd(xp, arg, 0);
 	    break;
@@ -5500,7 +5486,6 @@ ex_abclear(exarg_T *eap)
     map_clear(eap->cmd, eap->arg, TRUE, TRUE);
 }
 
-#if defined(FEAT_AUTOCMD) || defined(PROTO)
     static void
 ex_autocmd(exarg_T *eap)
 {
@@ -5534,7 +5519,6 @@ ex_doautocmd(exarg_T *eap)
     if (call_do_modelines && did_aucmd)
 	do_modelines(0);
 }
-#endif
 
 #ifdef FEAT_LISTCMDS
 /*
@@ -7234,7 +7218,6 @@ ex_quit(exarg_T *eap)
     else
 	wp = curwin;
 
-#ifdef FEAT_AUTOCMD
     /* Refuse to quit when locked. */
     if (curbuf_locked())
 	return;
@@ -7245,7 +7228,6 @@ ex_quit(exarg_T *eap)
     if (!win_valid(wp)
 	    || (wp->w_buffer->b_nwindows == 1 && wp->w_buffer->b_locked > 0))
 	return;
-#endif
 
 #ifdef FEAT_NETBEANS_INTG
     netbeansForcedQuit = eap->forceit;
@@ -7318,13 +7300,11 @@ ex_quit_all(exarg_T *eap)
 	text_locked_msg();
 	return;
     }
-#ifdef FEAT_AUTOCMD
     apply_autocmds(EVENT_QUITPRE, NULL, NULL, FALSE, curbuf);
     /* Refuse to quit when locked or when the buffer in the last window is
      * being closed (can only happen in autocommands). */
     if (curbuf_locked() || (curbuf->b_nwindows == 1 && curbuf->b_locked > 0))
 	return;
-#endif
 
     exiting = TRUE;
     if (eap->forceit || !check_changed_any(FALSE, FALSE))
@@ -7345,11 +7325,7 @@ ex_close(exarg_T *eap)
 	cmdwin_result = Ctrl_C;
     else
 #endif
-	if (!text_locked()
-#ifdef FEAT_AUTOCMD
-		&& !curbuf_locked()
-#endif
-		)
+	if (!text_locked() && !curbuf_locked())
 	{
 	    if (eap->addr_count == 0)
 		ex_win_close(eap->forceit, curwin, NULL);
@@ -7565,11 +7541,7 @@ ex_tabclose(exarg_T *eap)
 		    tabpage_close_other(tp, eap->forceit);
 		    return;
 		}
-		else if (!text_locked()
-#ifdef FEAT_AUTOCMD
-			&& !curbuf_locked()
-#endif
-		)
+		else if (!text_locked() && !curbuf_locked())
 		    tabpage_close(eap->forceit);
 	    }
 	}
@@ -7662,9 +7634,7 @@ tabpage_close_other(tabpage_T *tp, int f
 	    break;
     }
 
-#ifdef FEAT_AUTOCMD
     apply_autocmds(EVENT_TABCLOSED, NULL, NULL, FALSE, curbuf);
-#endif
 
     redraw_tabline = TRUE;
     if (h != tabline_height())
@@ -7790,13 +7760,11 @@ ex_exit(exarg_T *eap)
 	text_locked_msg();
 	return;
     }
-#ifdef FEAT_AUTOCMD
     apply_autocmds(EVENT_QUITPRE, NULL, NULL, FALSE, curbuf);
     /* Refuse to quit when locked or when the buffer in the last window is
      * being closed (can only happen in autocommands). */
     if (curbuf_locked() || (curbuf->b_nwindows == 1 && curbuf->b_locked > 0))
 	return;
-#endif
 
     /*
      * if more files or windows we won't exit
@@ -7901,10 +7869,9 @@ handle_drop(
     /* Postpone this while editing the command line. */
     if (text_locked())
 	return;
-#ifdef FEAT_AUTOCMD
     if (curbuf_locked())
 	return;
-#endif
+
     /* When the screen is being updated we should not change buffers and
      * windows structures, it may cause freed memory to be used. */
     if (updating_screen)
@@ -8072,9 +8039,7 @@ alist_set(
 
     if (recursive)
     {
-#ifdef FEAT_AUTOCMD
 	EMSG(_(e_au_recursive));
-#endif
 	return;
     }
     ++recursive;
@@ -8251,11 +8216,10 @@ ex_splitview(exarg_T *eap)
 	    && eap->cmdidx != CMD_vnew
 	    && eap->cmdidx != CMD_new)
     {
-# ifdef FEAT_AUTOCMD
 	if (
-#  ifdef FEAT_GUI
+# ifdef FEAT_GUI
 	    !gui.in_use &&
-#  endif
+# endif
 		au_has_group((char_u *)"FileExplorer"))
 	{
 	    /* No browsing supported but we do have the file explorer:
@@ -8264,7 +8228,6 @@ ex_splitview(exarg_T *eap)
 		eap->arg = (char_u *)".";
 	}
 	else
-# endif
 	{
 	    fname = do_browse(0, (char_u *)_("Edit File in new window"),
 					  eap->arg, NULL, NULL, NULL, curbuf);
@@ -8668,12 +8631,11 @@ do_exedit(
 #endif
 	    )
     {
-#ifdef FEAT_AUTOCMD
 	/* Can't edit another file when "curbuf_lock" is set.  Only ":edit"
 	 * can bring us here, others are stopped earlier. */
 	if (*eap->arg != NUL && curbuf_locked())
 	    return;
-#endif
+
 	n = readonlymode;
 	if (eap->cmdidx == CMD_view || eap->cmdidx == CMD_sview)
 	    readonlymode = TRUE;
@@ -8702,7 +8664,7 @@ do_exedit(
 		need_hide = (curbufIsChanged() && curbuf->b_nwindows <= 1);
 		if (!need_hide || buf_hide(curbuf))
 		{
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 		    cleanup_T   cs;
 
 		    /* Reset the error/interrupt/exception state here so that
@@ -8714,7 +8676,7 @@ do_exedit(
 #endif
 		    win_close(curwin, !need_hide && !buf_hide(curbuf));
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 		    /* Restore the error/interrupt/exception state if not
 		     * discarded by a new aborting error, interrupt, or
 		     * uncaught exception. */
@@ -8927,7 +8889,7 @@ ex_read(exarg_T *eap)
 	}
 	if (i != OK)
 	{
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	    if (!aborting())
 #endif
 		EMSG2(_(e_notopen), eap->arg);
@@ -9013,10 +8975,8 @@ ex_cd(exarg_T *eap)
     else
 #endif
     {
-#ifdef FEAT_AUTOCMD
 	if (allbuf_locked())
 	    return;
-#endif
 	if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged()
 							     && !eap->forceit)
 	{
@@ -9073,11 +9033,9 @@ ex_cd(exarg_T *eap)
 	    /* Echo the new current directory if the command was typed. */
 	    if (KeyTyped || p_verbose >= 5)
 		ex_pwd(eap);
-#ifdef FEAT_AUTOCMD
 	    apply_autocmds(EVENT_DIRCHANGED,
 		    is_local_chdir ? (char_u *)"window" : (char_u *)"global",
 		    new_dir, FALSE, curbuf);
-#endif
 	}
 	vim_free(tofree);
     }
@@ -10588,21 +10546,15 @@ find_cmdline_var(char_u *src, int *usedl
 #define SPEC_SFILE  (SPEC_CFILE + 1)
 		    "<slnum>",		/* ":so" file line number */
 #define SPEC_SLNUM  (SPEC_SFILE + 1)
-#ifdef FEAT_AUTOCMD
 		    "<afile>",		/* autocommand file name */
-# define SPEC_AFILE (SPEC_SLNUM + 1)
+#define SPEC_AFILE (SPEC_SLNUM + 1)
 		    "<abuf>",		/* autocommand buffer number */
-# define SPEC_ABUF  (SPEC_AFILE + 1)
+#define SPEC_ABUF  (SPEC_AFILE + 1)
 		    "<amatch>",		/* autocommand match name */
-# define SPEC_AMATCH (SPEC_ABUF + 1)
-#endif
+#define SPEC_AMATCH (SPEC_ABUF + 1)
 #ifdef FEAT_CLIENTSERVER
 		    "<client>"
-# ifdef FEAT_AUTOCMD
-#  define SPEC_CLIENT (SPEC_AMATCH + 1)
-# else
-#  define SPEC_CLIENT (SPEC_SLNUM + 1)
-# endif
+# define SPEC_CLIENT (SPEC_AMATCH + 1)
 #endif
     };
 
@@ -10801,7 +10753,6 @@ eval_vars(
 		break;
 #endif
 
-#ifdef FEAT_AUTOCMD
 	case SPEC_AFILE:	/* file name for autocommand */
 		result = autocmd_fname;
 		if (result != NULL && !autocmd_fname_full)
@@ -10840,7 +10791,6 @@ eval_vars(
 		}
 		break;
 
-#endif
 	case SPEC_SFILE:	/* file name for ":so" command */
 		result = sourcing_name;
 		if (result == NULL)
@@ -10976,7 +10926,6 @@ arg_all(void)
     return retval;
 }
 
-#if defined(FEAT_AUTOCMD) || defined(PROTO)
 /*
  * Expand the <sfile> string in "arg".
  *
@@ -11038,7 +10987,6 @@ expand_sfile(char_u *arg)
 
     return result;
 }
-#endif
 
 #ifdef FEAT_SESSION
 static int ses_winsizes(FILE *fd, int restore_size,
@@ -12070,7 +12018,6 @@ get_mapclear_arg(expand_T *xp UNUSED, in
     return NULL;
 }
 
-#ifdef FEAT_AUTOCMD
 static int filetype_detect = FALSE;
 static int filetype_plugin = FALSE;
 static int filetype_indent = FALSE;
@@ -12184,7 +12131,6 @@ ex_setfiletype(exarg_T *eap)
 	    did_filetype = FALSE;
     }
 }
-#endif
 
     static void
 ex_digraphs(exarg_T *eap UNUSED)
@@ -12208,7 +12154,7 @@ ex_set(exarg_T *eap)
 	flags = OPT_LOCAL;
     else if (eap->cmdidx == CMD_setglobal)
 	flags = OPT_GLOBAL;
-#if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD) && defined(FEAT_BROWSE)
+#if defined(FEAT_EVAL) && defined(FEAT_BROWSE)
     if (cmdmod.browse && flags == 0)
 	ex_options(eap);
     else
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -146,7 +146,6 @@ static void set_search_match(pos_T *t);
 #endif
 
 
-#ifdef FEAT_AUTOCMD
     static void
 trigger_cmd_autocmd(int typechar, int evt)
 {
@@ -156,7 +155,6 @@ trigger_cmd_autocmd(int typechar, int ev
     typestr[1] = NUL;
     apply_autocmds(evt, typestr, typestr, FALSE, curbuf);
 }
-#endif
 
 /*
  * Abandon the command line.
@@ -266,9 +264,7 @@ getcmdline(
      * custom status line may invoke ":normal". */
     struct cmdline_info save_ccline;
 #endif
-#ifdef FEAT_AUTOCMD
     int		cmdline_type;
-#endif
 
 #ifdef FEAT_EVAL
     if (firstc == -1)
@@ -376,11 +372,11 @@ getcmdline(
 	    b_im_ptr = &curbuf->b_p_imsearch;
 	if (*b_im_ptr == B_IMODE_LMAP)
 	    State |= LANGMAP;
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
 	im_set_active(*b_im_ptr == B_IMODE_IM);
 #endif
     }
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
     else if (p_imcmdline)
 	im_set_active(TRUE);
 #endif
@@ -396,11 +392,9 @@ getcmdline(
      * terminal mode set to cooked.  Need to set raw mode here then. */
     settmode(TMODE_RAW);
 
-#ifdef FEAT_AUTOCMD
     /* Trigger CmdlineEnter autocommands. */
     cmdline_type = firstc == NUL ? '-' : firstc;
     trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINEENTER);
-#endif
 
 #ifdef FEAT_CMDHIST
     init_history();
@@ -1132,7 +1126,7 @@ getcmdline(
 		{
 		    /* ":lmap" mappings exists, toggle use of mappings. */
 		    State ^= LANGMAP;
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
 		    im_set_active(FALSE);	/* Disable input method */
 #endif
 		    if (b_im_ptr != NULL)
@@ -1143,7 +1137,7 @@ getcmdline(
 			    *b_im_ptr = B_IMODE_NONE;
 		    }
 		}
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
 		else
 		{
 		    /* There are no ":lmap" mappings, toggle IM.  When
@@ -1946,10 +1940,8 @@ cmdline_not_changed:
 #endif
 
 cmdline_changed:
-#ifdef FEAT_AUTOCMD
 	/* Trigger CmdlineChanged autocommands. */
 	trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED);
-#endif
 
 #ifdef FEAT_SEARCH_EXTRA
 	/*
@@ -2160,13 +2152,11 @@ returncmd:
     if (some_key_typed)
 	need_wait_return = FALSE;
 
-#ifdef FEAT_AUTOCMD
     /* Trigger CmdlineLeave autocommands. */
     trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINELEAVE);
-#endif
 
     State = save_State;
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
     if (b_im_ptr != NULL && *b_im_ptr != B_IMODE_LMAP)
 	im_save_status(b_im_ptr);
     im_set_active(FALSE);
@@ -2266,7 +2256,6 @@ get_text_locked_msg(void)
     return e_secure;
 }
 
-#if defined(FEAT_AUTOCMD) || defined(PROTO)
 /*
  * Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is
  * and give an error message.
@@ -2296,7 +2285,6 @@ allbuf_locked(void)
     }
     return FALSE;
 }
-#endif
 
     static int
 cmdline_charsize(int idx)
@@ -4983,10 +4971,8 @@ ExpandFromContext(
 	    {EXPAND_SYNTIME, get_syntime_arg, TRUE, TRUE},
 #endif
 	    {EXPAND_HIGHLIGHT, get_highlight_name, TRUE, TRUE},
-#ifdef FEAT_AUTOCMD
 	    {EXPAND_EVENTS, get_event_name, TRUE, TRUE},
 	    {EXPAND_AUGROUP, get_augroup_name, TRUE, TRUE},
-#endif
 #ifdef FEAT_CSCOPE
 	    {EXPAND_CSCOPE, get_cscope_name, TRUE, TRUE},
 #endif
@@ -6930,10 +6916,9 @@ open_cmdwin(void)
     /* Save current window sizes. */
     win_size_save(&winsizes);
 
-# ifdef FEAT_AUTOCMD
     /* Don't execute autocommands while creating the window. */
     block_autocmds();
-# endif
+
     /* don't use a new tab page */
     cmdmod.tab = 0;
     cmdmod.noswapfile = 1;
@@ -6942,9 +6927,7 @@ open_cmdwin(void)
     if (win_split((int)p_cwh, WSP_BOT) == FAIL)
     {
 	beep_flush();
-# ifdef FEAT_AUTOCMD
 	unblock_autocmds();
-# endif
 	return K_IGNORE;
     }
     cmdwin_type = get_cmdline_type();
@@ -6963,12 +6946,10 @@ open_cmdwin(void)
 # endif
     RESET_BINDING(curwin);
 
-# ifdef FEAT_AUTOCMD
     /* Do execute autocommands for setting the filetype (load syntax). */
     unblock_autocmds();
     /* But don't allow switching to another buffer. */
     ++curbuf_lock;
-# endif
 
     /* Showing the prompt may have set need_wait_return, reset it. */
     need_wait_return = FALSE;
@@ -6983,9 +6964,7 @@ open_cmdwin(void)
 	}
 	set_option_value((char_u *)"ft", 0L, (char_u *)"vim", OPT_LOCAL);
     }
-# ifdef FEAT_AUTOCMD
     --curbuf_lock;
-# endif
 
     /* Reset 'textwidth' after setting 'filetype' (the Vim filetype plugin
      * sets 'textwidth' to 78). */
@@ -7031,12 +7010,10 @@ open_cmdwin(void)
     setmouse();
 # endif
 
-# ifdef FEAT_AUTOCMD
     /* Trigger CmdwinEnter autocommands. */
     trigger_cmd_autocmd(cmdwin_type, EVENT_CMDWINENTER);
     if (restart_edit != 0)	/* autocmd with ":startinsert" */
 	stuffcharReadbuff(K_NOP);
-# endif
 
     i = RedrawingDisabled;
     RedrawingDisabled = 0;
@@ -7049,20 +7026,16 @@ open_cmdwin(void)
 
     RedrawingDisabled = i;
 
-# ifdef FEAT_AUTOCMD
-
-#  ifdef FEAT_FOLDING
+# ifdef FEAT_FOLDING
     save_KeyTyped = KeyTyped;
-#  endif
+# endif
 
     /* Trigger CmdwinLeave autocommands. */
     trigger_cmd_autocmd(cmdwin_type, EVENT_CMDWINLEAVE);
 
-#  ifdef FEAT_FOLDING
+# ifdef FEAT_FOLDING
     /* Restore KeyTyped in case it is modified by autocommands */
     KeyTyped = save_KeyTyped;
-#  endif
-
 # endif
 
     /* Restore the command line info. */
@@ -7080,7 +7053,7 @@ open_cmdwin(void)
     }
     else
     {
-# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+# if defined(FEAT_EVAL)
 	/* autocmds may abort script processing */
 	if (aborting() && cmdwin_result != K_IGNORE)
 	    cmdwin_result = Ctrl_C;
@@ -7141,10 +7114,8 @@ open_cmdwin(void)
 	    }
 	}
 
-# ifdef FEAT_AUTOCMD
 	/* Don't execute autocommands while deleting the window. */
 	block_autocmds();
-# endif
 # ifdef FEAT_CONCEAL
 	/* Avoid command-line window first character being concealed. */
 	curwin->w_p_cole = 0;
@@ -7162,9 +7133,7 @@ open_cmdwin(void)
 	/* Restore window sizes. */
 	win_size_restore(&winsizes);
 
-# ifdef FEAT_AUTOCMD
 	unblock_autocmds();
-# endif
     }
 
     ga_clear(&winsizes);
--- a/src/feature.h
+++ b/src/feature.h
@@ -440,17 +440,10 @@
 #endif
 
 /*
- * +autocmd		":autocmd" command
- */
-#ifdef FEAT_NORMAL
-# define FEAT_AUTOCMD
-#endif
-
-/*
  * +diff		Displaying diffs in a nice way.
  *			Requires +windows and +autocmd.
  */
-#if defined(FEAT_NORMAL) && defined(FEAT_AUTOCMD)
+#if defined(FEAT_NORMAL)
 # define FEAT_DIFF
 #endif
 
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -47,14 +47,12 @@ static int msg_add_fileformat(int eol_ty
 static void msg_add_eol(void);
 static int check_mtime(buf_T *buf, stat_T *s);
 static int time_differs(long t1, long t2);
-#ifdef FEAT_AUTOCMD
 static int apply_autocmds_exarg(event_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, exarg_T *eap);
 static int au_find_group(char_u *name);
 
 # define AUGROUP_DEFAULT    -1	    /* default autocmd group */
 # define AUGROUP_ERROR	    -2	    /* erroneous autocmd group */
 # define AUGROUP_ALL	    -3	    /* all autocmd groups */
-#endif
 
 #if defined(FEAT_CRYPT) || defined(FEAT_MBYTE)
 # define HAS_BW_FLAGS
@@ -135,11 +133,8 @@ static int move_lines(buf_T *frombuf, bu
 #ifdef TEMPDIRNAMES
 static void vim_settempdir(char_u *tempdir);
 #endif
-#ifdef FEAT_AUTOCMD
 static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
-#endif
-
-#ifdef FEAT_AUTOCMD
+
 /*
  * Set by the apply_autocmds_group function if the given event is equal to
  * EVENT_FILETYPE. Used by the readfile function in order to determine if
@@ -149,7 +144,6 @@ static char *e_auchangedbuf = N_("E812: 
  * apply_autocmds_group.
  */
 static int au_did_filetype INIT(= FALSE);
-#endif
 
     void
 filemess(
@@ -307,17 +301,13 @@ readfile(
     char_u	conv_rest[CONV_RESTLEN];
     int		conv_restlen = 0;	/* nr of bytes in conv_rest[] */
 #endif
-#ifdef FEAT_AUTOCMD
     buf_T	*old_curbuf;
     char_u	*old_b_ffname;
     char_u	*old_b_fname;
     int		using_b_ffname;
     int		using_b_fname;
-#endif
-
-#ifdef FEAT_AUTOCMD
+
     au_did_filetype = FALSE; /* reset before triggering any autocommands */
-#endif
 
     curbuf->b_no_eol_lnum = 0;	/* in case it was set by the previous read */
 
@@ -337,7 +327,6 @@ readfile(
 	    return FAIL;
     }
 
-#ifdef FEAT_AUTOCMD
     /* Remember the initial values of curbuf, curbuf->b_ffname and
      * curbuf->b_fname to detect whether they are altered as a result of
      * executing nasty autocommands.  Also check if "fname" and "sfname"
@@ -348,7 +337,6 @@ readfile(
     using_b_ffname = (fname == curbuf->b_ffname)
 					      || (sfname == curbuf->b_ffname);
     using_b_fname = (fname == curbuf->b_fname) || (sfname == curbuf->b_fname);
-#endif
 
     /* After reading a file the cursor line changes but we don't want to
      * display the line. */
@@ -369,7 +357,6 @@ readfile(
     fname = sfname;
 #endif
 
-#ifdef FEAT_AUTOCMD
     /*
      * The BufReadCmd and FileReadCmd events intercept the reading process by
      * executing the associated commands instead.
@@ -404,7 +391,6 @@ readfile(
 
 	curbuf->b_op_start = pos;
     }
-#endif
 
     if ((shortmess(SHM_OVER) || curbuf->b_help) && p_verbose == 0)
 	msg_scroll = FALSE;	/* overwrite previous file message */
@@ -613,7 +599,6 @@ readfile(
 #endif
 		    {
 			check_need_swap(newfile);
-#ifdef FEAT_AUTOCMD
 			/* SwapExists autocommand may mess things up */
 			if (curbuf != old_curbuf
 				|| (using_b_ffname
@@ -624,7 +609,6 @@ readfile(
 			    EMSG(_(e_auchangedbuf));
 			    return FAIL;
 			}
-#endif
 		    }
 		    if (dir_of_file_exists(fname))
 			filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
@@ -641,14 +625,12 @@ readfile(
 		    if (eap != NULL)
 			set_forced_fenc(eap);
 #endif
-#ifdef FEAT_AUTOCMD
 		    apply_autocmds_exarg(EVENT_BUFNEWFILE, sfname, sfname,
 							  FALSE, curbuf, eap);
-#endif
 		    /* remember the current fileformat */
 		    save_file_ff(curbuf);
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 		    if (aborting())   /* autocmds may abort script processing */
 			return FAIL;
 #endif
@@ -701,7 +683,6 @@ readfile(
 #endif
     {
 	check_need_swap(newfile);
-#ifdef FEAT_AUTOCMD
 	if (!read_stdin && (curbuf != old_curbuf
 		|| (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
 		|| (using_b_fname && (old_b_fname != curbuf->b_fname))))
@@ -711,7 +692,6 @@ readfile(
 		close(fd);
 	    return FAIL;
 	}
-#endif
 #ifdef UNIX
 	/* Set swap file protection bits after creating it. */
 	if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL
@@ -764,7 +744,6 @@ readfile(
     try_dos = (vim_strchr(p_ffs, 'd') != NULL);
     try_unix = (vim_strchr(p_ffs, 'x') != NULL);
 
-#ifdef FEAT_AUTOCMD
     if (!read_buffer)
     {
 	int	m = msg_scroll;
@@ -834,7 +813,6 @@ readfile(
 	    return FAIL;
 	}
     }
-#endif /* FEAT_AUTOCMD */
 
     /* Autocommands may add lines to the file, need to check if it is empty */
     wasempty = (curbuf->b_ml.ml_flags & ML_EMPTY);
@@ -2704,7 +2682,6 @@ failed:
     }
 #endif
 
-#ifdef FEAT_AUTOCMD
     if (!read_stdin && !read_fifo && (!read_buffer || sfname != NULL))
     {
 	int m = msg_scroll;
@@ -2746,7 +2723,6 @@ failed:
 	    return FAIL;
 # endif
     }
-#endif
 
     if (recoverymode && error)
 	return FAIL;
@@ -3197,9 +3173,7 @@ buf_write(
 #endif
 					/* writing everything */
     int		    whole = (start == 1 && end == buf->b_ml.ml_line_count);
-#ifdef FEAT_AUTOCMD
     linenr_T	    old_line_count = buf->b_ml.ml_line_count;
-#endif
     int		    attr;
     int		    fileformat;
     int		    write_bin;
@@ -3319,7 +3293,6 @@ buf_write(
     buf->b_op_end.lnum = end;
     buf->b_op_end.col = 0;
 
-#ifdef FEAT_AUTOCMD
     {
 	aco_save_T	aco;
 	int		buf_ffname = FALSE;
@@ -3509,7 +3482,6 @@ buf_write(
 	if (buf_fname_s)
 	    fname = buf->b_sfname;
     }
-#endif
 
 #ifdef FEAT_NETBEANS_INTG
     if (netbeans_active() && isNetbeansBuffer(buf))
@@ -5020,12 +4992,10 @@ restore_backup:
 	    )
     {
 	unchanged(buf, TRUE);
-#ifdef FEAT_AUTOCMD
 	/* b:changedtick is always incremented in unchanged() but that
 	 * should not trigger a TextChanged event. */
 	if (buf->b_last_changedtick + 1 == CHANGEDTICK(buf))
 	    buf->b_last_changedtick = CHANGEDTICK(buf);
-#endif
 	u_unchanged(buf);
 	u_update_save_nr(buf);
     }
@@ -5194,7 +5164,6 @@ nofail:
     }
 #endif
 
-#ifdef FEAT_AUTOCMD
 #ifdef FEAT_EVAL
     if (!should_abort(retval))
 #else
@@ -5232,7 +5201,6 @@ nofail:
 	    retval = FALSE;
 #endif
     }
-#endif
 
     got_int |= prev_got_int;
 
@@ -5246,37 +5214,34 @@ nofail:
     static int
 set_rw_fname(char_u *fname, char_u *sfname)
 {
-#ifdef FEAT_AUTOCMD
     buf_T	*buf = curbuf;
 
     /* It's like the unnamed buffer is deleted.... */
     if (curbuf->b_p_bl)
 	apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf);
     apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf);
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
     if (aborting())	    /* autocmds may abort script processing */
 	return FAIL;
-# endif
+#endif
     if (curbuf != buf)
     {
 	/* We are in another buffer now, don't do the renaming. */
 	EMSG(_(e_auchangedbuf));
 	return FAIL;
     }
-#endif
 
     if (setfname(curbuf, fname, sfname, FALSE) == OK)
 	curbuf->b_flags |= BF_NOTEDITED;
 
-#ifdef FEAT_AUTOCMD
     /* ....and a new named one is created */
     apply_autocmds(EVENT_BUFNEW, NULL, NULL, FALSE, curbuf);
     if (curbuf->b_p_bl)
 	apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, curbuf);
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
     if (aborting())	    /* autocmds may abort script processing */
 	return FAIL;
-# endif
+#endif
 
     /* Do filetype detection now if 'filetype' is empty. */
     if (*curbuf->b_p_ft == NUL)
@@ -5285,7 +5250,6 @@ set_rw_fname(char_u *fname, char_u *sfna
 	    (void)do_doautocmd((char_u *)"filetypedetect BufRead", FALSE, NULL);
 	do_modelines(0);
     }
-#endif
 
     return OK;
 }
@@ -6105,8 +6069,6 @@ make_bom(char_u *buf, char_u *name)
 }
 #endif
 
-#if defined(FEAT_VIMINFO) || defined(FEAT_BROWSE) || \
-    defined(FEAT_QUICKFIX) || defined(FEAT_AUTOCMD) || defined(PROTO)
 /*
  * Try to find a shortname by comparing the fullname with the current
  * directory.
@@ -6130,7 +6092,6 @@ shorten_fname1(char_u *full_path)
     vim_free(dirname);
     return p;
 }
-#endif
 
 /*
  * Try to find a shortname by comparing the fullname with the current
@@ -6781,10 +6742,7 @@ check_timestamps(
     }
 
     if (!stuff_empty() || global_busy || !typebuf_typed()
-#ifdef FEAT_AUTOCMD
-			|| autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
-#endif
-					)
+			|| autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0)
 	need_check_timestamps = TRUE;		/* check later */
     else
     {
@@ -6898,14 +6856,14 @@ buf_check_timestamp(
 #ifdef FEAT_GUI
     int		save_mouse_correct = need_mouse_correct;
 #endif
-#ifdef FEAT_AUTOCMD
     static int	busy = FALSE;
     int		n;
+#ifdef FEAT_EVAL
     char_u	*s;
+#endif
     bufref_T	bufref;
 
     set_bufref(&bufref, buf);
-#endif
 
     /* If there is no file name, the buffer is not loaded, 'buftype' is
      * set, we are in the middle of a save or being called recursively: ignore
@@ -6914,9 +6872,7 @@ buf_check_timestamp(
 	    || buf->b_ml.ml_mfp == NULL
 	    || *buf->b_p_bt != NUL
 	    || buf->b_saving
-#ifdef FEAT_AUTOCMD
 	    || busy
-#endif
 #ifdef FEAT_NETBEANS_INTG
 	    || isNetbeansBuffer(buf)
 #endif
@@ -6977,17 +6933,16 @@ buf_check_timestamp(
 	    else
 		reason = "time";
 
-#ifdef FEAT_AUTOCMD
 	    /*
 	     * Only give the warning if there are no FileChangedShell
 	     * autocommands.
 	     * Avoid being called recursively by setting "busy".
 	     */
 	    busy = TRUE;
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	    set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
 	    set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
-# endif
+#endif
 	    ++allbuf_lock;
 	    n = apply_autocmds(EVENT_FILECHANGEDSHELL,
 				      buf->b_fname, buf->b_fname, FALSE, buf);
@@ -6997,18 +6952,17 @@ buf_check_timestamp(
 	    {
 		if (!bufref_valid(&bufref))
 		    EMSG(_("E246: FileChangedShell autocommand deleted buffer"));
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 		s = get_vim_var_str(VV_FCS_CHOICE);
 		if (STRCMP(s, "reload") == 0 && *reason != 'd')
 		    reload = TRUE;
 		else if (STRCMP(s, "ask") == 0)
 		    n = FALSE;
 		else
-# endif
+#endif
 		    return 2;
 	    }
 	    if (!n)
-#endif
 	    {
 		if (*reason == 'd')
 		    mesg = _("E211: File \"%s\" no longer available");
@@ -7100,9 +7054,7 @@ buf_check_timestamp(
 	    }
 	    else
 	    {
-# ifdef FEAT_AUTOCMD
 		if (!autocmd_busy)
-# endif
 		{
 		    msg_start();
 		    msg_puts_attr(tbuf, HL_ATTR(HLF_E) + MSG_HIST);
@@ -7114,9 +7066,9 @@ buf_check_timestamp(
 		    if (emsg_silent == 0)
 		    {
 			out_flush();
-# ifdef FEAT_GUI
+#ifdef FEAT_GUI
 			if (!focus)
-# endif
+#endif
 			    /* give the user some time to think about it */
 			    ui_delay(1000L, TRUE);
 
@@ -7151,12 +7103,10 @@ buf_check_timestamp(
 #endif
     }
 
-#ifdef FEAT_AUTOCMD
     /* Trigger FileChangedShell when the file was changed in any way. */
     if (bufref_valid(&bufref) && retval != 0)
 	(void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST,
 				      buf->b_fname, buf->b_fname, FALSE, buf);
-#endif
 #ifdef FEAT_GUI
     /* restore this in case an autocommand has set it; it would break
      * 'mousefocus' */
@@ -7240,14 +7190,12 @@ buf_reload(buf_T *buf, int orig_mode)
 	if (saved == OK)
 	{
 	    curbuf->b_flags |= BF_CHECK_RO;	/* check for RO again */
-#ifdef FEAT_AUTOCMD
 	    keep_filetype = TRUE;		/* don't detect 'filetype' */
-#endif
 	    if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
 			(linenr_T)0,
 			(linenr_T)MAXLNUM, &ea, flags) != OK)
 	    {
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 		if (!aborting())
 #endif
 		    EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
@@ -7296,9 +7244,7 @@ buf_reload(buf_T *buf, int orig_mode)
 	curwin->w_cursor = old_cursor;
 	check_cursor();
 	update_topline();
-#ifdef FEAT_AUTOCMD
 	keep_filetype = FALSE;
-#endif
 #ifdef FEAT_FOLDING
 	{
 	    win_T	*wp;
@@ -7672,11 +7618,7 @@ forward_slash(char_u *fname)
 
 /*
  * Code for automatic commands.
- *
- * Only included when "FEAT_AUTOCMD" has been defined.
- */
-
-#if defined(FEAT_AUTOCMD) || defined(PROTO)
+ */
 
 /*
  * The autocommands are stored in a list for each event.
@@ -7914,9 +7856,7 @@ static int au_get_grouparg(char_u **argp
 static int do_autocmd_event(event_T event, char_u *pat, int nested, char_u *cmd, int forceit, int group);
 static int apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io, int force, int group, buf_T *buf, exarg_T *eap);
 static void auto_next_pat(AutoPatCmd *apc, int stop_at_last);
-#if defined(FEAT_AUTOCMD) || defined(FEAT_WILDIGN)
 static int match_file_pat(char_u *pattern, regprog_T **prog, char_u *fname, char_u *sfname, char_u *tail, int allow_dirs);
-#endif
 
 
 static event_T	last_event;
@@ -9014,7 +8954,6 @@ check_nomodeline(char_u **argp)
  * Search for a visible window containing the current buffer.  If there isn't
  * one then use "aucmd_win".
  * Set "curbuf" and "curwin" to match "buf".
- * When FEAT_AUTOCMD is not defined another version is used, see below.
  */
     void
 aucmd_prepbuf(
@@ -9067,7 +9006,9 @@ aucmd_prepbuf(
 	aco->use_aucmd_win = TRUE;
 	aucmd_win_used = TRUE;
 	aucmd_win->w_buffer = buf;
+#if defined(FEAT_SYN_HL) || defined(FEAT_SPELL)
 	aucmd_win->w_s = &buf->b_s;
+#endif
 	++buf->b_nwindows;
 	win_init_empty(aucmd_win); /* set cursor and topline to safe values */
 
@@ -9108,7 +9049,6 @@ aucmd_prepbuf(
 /*
  * Cleanup after executing autocommands for a (hidden) buffer.
  * Restore the window as it was (if possible).
- * When FEAT_AUTOCMD is not defined another version is used, see below.
  */
     void
 aucmd_restbuf(
@@ -9406,13 +9346,13 @@ has_textyankpost(void)
     static int
 apply_autocmds_group(
     event_T	event,
-    char_u	*fname,	    /* NULL or empty means use actual file name */
-    char_u	*fname_io,  /* fname to use for <afile> on cmdline, NULL means
+    char_u	*fname,	     /* NULL or empty means use actual file name */
+    char_u	*fname_io,   /* fname to use for <afile> on cmdline, NULL means
 			       use fname */
-    int		force,	    /* when TRUE, ignore autocmd_busy */
-    int		group,	    /* group ID, or AUGROUP_ALL */
-    buf_T	*buf,	    /* buffer for <abuf> */
-    exarg_T	*eap)	    /* command arguments */
+    int		force,	     /* when TRUE, ignore autocmd_busy */
+    int		group,	     /* group ID, or AUGROUP_ALL */
+    buf_T	*buf,	     /* buffer for <abuf> */
+    exarg_T	*eap UNUSED) /* command arguments */
 {
     char_u	*sfname = NULL;	/* short file name */
     char_u	*tail;
@@ -10210,43 +10150,7 @@ theend:
     return retval;
 }
 
-#else	/* FEAT_AUTOCMD */
-
-/*
- * Prepare for executing commands for (hidden) buffer "buf".
- * This is the non-autocommand version, it simply saves "curbuf" and sets
- * "curbuf" and "curwin" to match "buf".
- */
-    void
-aucmd_prepbuf(
-    aco_save_T	*aco,		/* structure to save values in */
-    buf_T	*buf)		/* new curbuf */
-{
-    aco->save_curbuf = curbuf;
-    --curbuf->b_nwindows;
-    curbuf = buf;
-    curwin->w_buffer = buf;
-    ++curbuf->b_nwindows;
-}
-
-/*
- * Restore after executing commands for a (hidden) buffer.
- * This is the non-autocommand version.
- */
-    void
-aucmd_restbuf(
-    aco_save_T	*aco)		/* structure holding saved values */
-{
-    --curbuf->b_nwindows;
-    curbuf = aco->save_curbuf;
-    curwin->w_buffer = curbuf;
-    ++curbuf->b_nwindows;
-}
-
-#endif	/* FEAT_AUTOCMD */
-
-
-#if defined(FEAT_AUTOCMD) || defined(FEAT_WILDIGN) || defined(PROTO)
+
 /*
  * Try matching a filename with a "pattern" ("prog" is NULL), or use the
  * precompiled regprog "prog" ("pattern" is NULL).  That avoids calling
@@ -10292,7 +10196,6 @@ match_file_pat(
 	vim_regfree(regmatch.regprog);
     return result;
 }
-#endif
 
 #if defined(FEAT_WILDIGN) || defined(PROTO)
 /*
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -516,7 +516,6 @@ CancelRedo(void)
     }
 }
 
-#if defined(FEAT_AUTOCMD) || defined(FEAT_EVAL) || defined(PROTO)
 /*
  * Save redobuff and old_redobuff to save_redobuff and save_old_redobuff.
  * Used before executing autocommands and user functions.
@@ -552,7 +551,6 @@ restoreRedobuff(save_redo_T *save_redo)
     free_buff(&old_redobuff);
     old_redobuff = save_redo->sr_old_redobuff;
 }
-#endif
 
 /*
  * Append "s" to the redo buffer.
@@ -2891,7 +2889,7 @@ vgetorpeek(int advance)
 						     + typebuf.tb_len] != NUL)
 			typebuf.tb_noremap[typebuf.tb_off
 						 + typebuf.tb_len++] = RM_YES;
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
 		    /* Get IM status right after getting keys, not after the
 		     * timeout for a mapping (focus may be lost by then). */
 		    vgetc_im_active = im_get_status();
@@ -3122,10 +3120,8 @@ fix_input_buffer(char_u *buf, int len)
 	else
 #endif
 	if (p[0] == NUL || (p[0] == K_SPECIAL
-#ifdef FEAT_AUTOCMD
 		    /* timeout may generate K_CURSORHOLD */
 		    && (i < 2 || p[1] != KS_EXTRA || p[2] != (int)KE_CURSORHOLD)
-#endif
 #if defined(WIN3264) && !defined(FEAT_GUI)
 		    /* Win32 console passes modifiers */
 		    && (i < 2 || p[1] != KS_MODIFIER)
--- a/src/globals.h
+++ b/src/globals.h
@@ -385,7 +385,6 @@ EXTERN guicolor_T cterm_normal_bg_gui_co
 EXTERN int	is_mac_terminal INIT(= FALSE);  /* recognized Terminal.app */
 #endif
 
-#ifdef FEAT_AUTOCMD
 EXTERN int	autocmd_busy INIT(= FALSE);	/* Is apply_autocmds() busy? */
 EXTERN int	autocmd_no_enter INIT(= FALSE); /* *Enter autocmds disabled */
 EXTERN int	autocmd_no_leave INIT(= FALSE); /* *Leave autocmds disabled */
@@ -405,7 +404,6 @@ EXTERN bufref_T	au_new_curbuf INIT(= {NU
  * Free the buffer/window when autocmd_busy is being set to FALSE. */
 EXTERN buf_T	*au_pending_free_buf INIT(= NULL);
 EXTERN win_T	*au_pending_free_win INIT(= NULL);
-#endif
 
 #ifdef FEAT_MOUSE
 /*
@@ -572,10 +570,8 @@ EXTERN win_T	*prevwin INIT(= NULL);	/* p
 
 EXTERN win_T	*curwin;	/* currently active window */
 
-#ifdef FEAT_AUTOCMD
 EXTERN win_T	*aucmd_win;	/* window used in aucmd_prepbuf() */
 EXTERN int	aucmd_win_used INIT(= FALSE);	/* aucmd_win is being used */
-#endif
 
 /*
  * The window layout is kept in a tree of frames.  topframe points to the top
@@ -639,6 +635,7 @@ EXTERN int	exiting INIT(= FALSE);
 EXTERN int	really_exiting INIT(= FALSE);
 				/* TRUE when we are sure to exit, e.g., after
 				 * a deadly signal */
+EXTERN int	v_dying INIT(= 0); /* internal value of v:dying */
 EXTERN int	stdout_isatty INIT(= TRUE);	/* is stdout a terminal? */
 
 #if defined(FEAT_AUTOCHDIR)
@@ -664,7 +661,6 @@ EXTERN int	textlock INIT(= 0);
 				/* non-zero when changing text and jumping to
 				 * another window or buffer is not allowed */
 
-#ifdef FEAT_AUTOCMD
 EXTERN int	curbuf_lock INIT(= 0);
 				/* non-zero when the current buffer can't be
 				 * changed.  Used for FileChangedRO. */
@@ -673,7 +669,6 @@ EXTERN int	allbuf_lock INIT(= 0);
 				 * changed, no buffer can be deleted and
 				 * current directory can't be changed.
 				 * Used for SwapExists et al. */
-#endif
 #ifdef FEAT_EVAL
 # define HAVE_SANDBOX
 EXTERN int	sandbox INIT(= 0);
@@ -986,15 +981,12 @@ EXTERN int	emsg_silent INIT(= 0);	/* don
 EXTERN int	emsg_noredir INIT(= 0);	/* don't redirect error messages */
 EXTERN int	cmd_silent INIT(= FALSE); /* don't echo the command line */
 
-#if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) \
-	|| defined(FEAT_AUTOCMD)
 # define HAS_SWAP_EXISTS_ACTION
 EXTERN int	swap_exists_action INIT(= SEA_NONE);
 					/* For dialog when swap file already
 					 * exists. */
 EXTERN int	swap_exists_did_quit INIT(= FALSE);
 					/* Selected "quit" at the dialog. */
-#endif
 
 EXTERN char_u	*IObuff;		/* sprintf's are done in this buffer,
 					   size is IOSIZE */
@@ -1022,7 +1014,7 @@ EXTERN int	stop_insert_mode;	/* for ":st
 
 EXTERN int	KeyTyped;		/* TRUE if user typed current char */
 EXTERN int	KeyStuffed;		/* TRUE if current char from stuffbuf */
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
 EXTERN int	vgetc_im_active;	/* Input Method was active for last
 					   character obtained from vgetc() */
 #endif
@@ -1075,7 +1067,6 @@ EXTERN char_u	*repeat_cmdline INIT(= NUL
 #ifdef FEAT_CMDHIST
 EXTERN char_u	*new_last_cmdline INIT(= NULL);	/* new value for last_cmdline */
 #endif
-#ifdef FEAT_AUTOCMD
 EXTERN char_u	*autocmd_fname INIT(= NULL); /* fname for <afile> on cmdline */
 EXTERN int	autocmd_fname_full;	     /* autocmd_fname is full path */
 EXTERN int	autocmd_bufnr INIT(= 0);     /* fnum for <abuf> on cmdline */
@@ -1086,7 +1077,6 @@ EXTERN pos_T	last_cursormoved	      /* f
 			= INIT_POS_T(0, 0, 0)
 # endif
 			;
-#endif
 
 EXTERN int	postponed_split INIT(= 0);  /* for CTRL-W CTRL-] command */
 EXTERN int	postponed_split_flags INIT(= 0);  /* args for win_split() */
@@ -1595,9 +1585,7 @@ EXTERN char_u e_notset[]	INIT(= N_("E764
 EXTERN char_u e_invalidreg[]    INIT(= N_("E850: Invalid register name"));
 #endif
 EXTERN char_u e_dirnotf[]	INIT(= N_("E919: Directory not found in '%s': \"%s\""));
-#ifdef FEAT_AUTOCMD
 EXTERN char_u e_au_recursive[]	INIT(= N_("E952: Autocommand caused recursive behavior"));
-#endif
 
 #ifdef FEAT_GUI_MAC
 EXTERN short disallow_gui	INIT(= FALSE);
--- a/src/gui.c
+++ b/src/gui.c
@@ -132,13 +132,11 @@ gui_start(void)
 
     vim_free(old_term);
 
-#ifdef FEAT_AUTOCMD
     /* If the GUI started successfully, trigger the GUIEnter event, otherwise
      * the GUIFailed event. */
     gui_mch_update();
     apply_autocmds(gui.in_use ? EVENT_GUIENTER : EVENT_GUIFAILED,
 						   NULL, NULL, FALSE, curbuf);
-#endif
     --recursive;
 }
 
@@ -2954,7 +2952,7 @@ gui_wait_for_chars_or_timer(long wtime)
 gui_wait_for_chars(long wtime, int tb_change_cnt)
 {
     int	    retval;
-#if defined(ELAPSED_FUNC) && defined(FEAT_AUTOCMD)
+#if defined(ELAPSED_FUNC)
     ELAPSED_TYPE start_tv;
 #endif
 
@@ -2986,7 +2984,7 @@ gui_wait_for_chars(long wtime, int tb_ch
 	return retval;
     }
 
-#if defined(ELAPSED_FUNC) && defined(FEAT_AUTOCMD)
+#if defined(ELAPSED_FUNC)
     ELAPSED_INIT(start_tv);
 #endif
 
@@ -3003,11 +3001,10 @@ gui_wait_for_chars(long wtime, int tb_ch
      */
     if (gui_wait_for_chars_or_timer(p_ut) == OK)
 	retval = OK;
-#ifdef FEAT_AUTOCMD
     else if (trigger_cursorhold()
-# ifdef ELAPSED_FUNC
+#ifdef ELAPSED_FUNC
 	    && ELAPSED_FUNC(start_tv) >= p_ut
-# endif
+#endif
 	    && typebuf.tb_change_cnt == tb_change_cnt)
     {
 	char_u	buf[3];
@@ -3020,7 +3017,6 @@ gui_wait_for_chars(long wtime, int tb_ch
 
 	retval = OK;
     }
-#endif
 
     if (retval == FAIL && typebuf.tb_change_cnt == tb_change_cnt)
     {
@@ -5131,34 +5127,24 @@ no_console_input(void)
     void
 gui_update_screen(void)
 {
-#ifdef FEAT_CONCEAL
+# ifdef FEAT_CONCEAL
     linenr_T	conceal_old_cursor_line = 0;
     linenr_T	conceal_new_cursor_line = 0;
     int		conceal_update_lines = FALSE;
-#endif
+# endif
 
     update_topline();
     validate_cursor();
 
-#if defined(FEAT_AUTOCMD) || defined(FEAT_CONCEAL)
     /* Trigger CursorMoved if the cursor moved. */
-    if (!finish_op && (
-# ifdef FEAT_AUTOCMD
-		has_cursormoved()
+    if (!finish_op && (has_cursormoved()
+# ifdef FEAT_CONCEAL
+		|| curwin->w_p_cole > 0
 # endif
-# if defined(FEAT_AUTOCMD) && defined(FEAT_CONCEAL)
-		||
-# endif
-# ifdef FEAT_CONCEAL
-		curwin->w_p_cole > 0
-# endif
-		)
-		     && !EQUAL_POS(last_cursormoved, curwin->w_cursor))
+		) && !EQUAL_POS(last_cursormoved, curwin->w_cursor))
     {
-# ifdef FEAT_AUTOCMD
 	if (has_cursormoved())
 	    apply_autocmds(EVENT_CURSORMOVED, NULL, NULL, FALSE, curbuf);
-# endif
 # ifdef FEAT_CONCEAL
 	if (curwin->w_p_cole > 0)
 	{
@@ -5169,11 +5155,10 @@ gui_update_screen(void)
 # endif
 	last_cursormoved = curwin->w_cursor;
     }
-#endif
 
     update_screen(0);	/* may need to update the screen */
     setcursor();
-# if defined(FEAT_CONCEAL)
+# ifdef FEAT_CONCEAL
     if (conceal_update_lines
 	    && (conceal_old_cursor_line != conceal_new_cursor_line
 		|| conceal_cursor_line(curwin)
--- a/src/gui_mac.c
+++ b/src/gui_mac.c
@@ -6232,7 +6232,7 @@ char_u *FullPathFromFSSpec_save(FSSpec f
 #endif
 }
 
-#if (defined(FEAT_MBYTE) || defined(PROTO)) && defined(USE_CARBONKEYHANDLER)
+#if (defined(FEAT_MBYTE) && defined(USE_CARBONKEYHANDLER)) || defined(PROTO)
 /*
  * Input Method Control functions.
  */
--- a/src/if_cscope.c
+++ b/src/if_cscope.c
@@ -1147,17 +1147,15 @@ cs_find_common(
 	    return FALSE;
 	}
 
-# ifdef FEAT_AUTOCMD
 	if (*qfpos != '0'
 		&& apply_autocmds(EVENT_QUICKFIXCMDPRE, (char_u *)"cscope",
 					       curbuf->b_fname, TRUE, curbuf))
 	{
-#  ifdef FEAT_EVAL
+# ifdef FEAT_EVAL
 	    if (aborting())
 		return FALSE;
-#  endif
+# endif
 	}
-# endif
     }
 #endif
 
@@ -1251,10 +1249,8 @@ cs_find_common(
 		    postponed_split = 0;
 		}
 
-# ifdef FEAT_AUTOCMD
 		apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)"cscope",
 					       curbuf->b_fname, TRUE, curbuf);
-# endif
 		if (use_ll)
 		    /*
 		     * In the location list window, use the displayed location
--- a/src/if_xcmdsrv.c
+++ b/src/if_xcmdsrv.c
@@ -1480,14 +1480,12 @@ server_parse_message(
 		ga_concat(&(r->strings), str);
 		ga_append(&(r->strings), NUL);
 	    }
-#ifdef FEAT_AUTOCMD
 	    {
 		char_u	winstr[30];
 
 		sprintf((char *)winstr, "0x%x", (unsigned int)win);
 		apply_autocmds(EVENT_REMOTEREPLY, winstr, str, TRUE, curbuf);
 	    }
-#endif
 	    vim_free(tofree);
 	}
 	else
--- a/src/main.c
+++ b/src/main.c
@@ -748,10 +748,8 @@ vim_main2(void)
     if (exmode_active)
 	curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
 
-#ifdef FEAT_AUTOCMD
     apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
     TIME_MSG("BufEnter autocommands");
-#endif
     setpcmark();
 
 #ifdef FEAT_QUICKFIX
@@ -843,10 +841,8 @@ vim_main2(void)
 #ifdef FEAT_EVAL
     set_vim_var_nr(VV_VIM_DID_ENTER, 1L);
 #endif
-#ifdef FEAT_AUTOCMD
     apply_autocmds(EVENT_VIMENTER, NULL, NULL, FALSE, curbuf);
     TIME_MSG("VimEnter autocommands");
-#endif
 
 #if defined(FEAT_EVAL) && defined(FEAT_CLIPBOARD)
     /* Adjust default register name for "unnamed" in 'clipboard'. Can only be
@@ -1162,50 +1158,33 @@ main_loop(
 	    skip_redraw = FALSE;
 	else if (do_redraw || stuff_empty())
 	{
-# ifdef FEAT_GUI
+#ifdef FEAT_GUI
 	    /* If ui_breakcheck() was used a resize may have been postponed. */
 	    gui_may_resize_shell();
-# endif
-#if defined(FEAT_AUTOCMD) || defined(FEAT_CONCEAL)
+#endif
 	    /* Trigger CursorMoved if the cursor moved. */
 	    if (!finish_op && (
-# ifdef FEAT_AUTOCMD
 			has_cursormoved()
-# endif
-# if defined(FEAT_AUTOCMD) && defined(FEAT_CONCEAL)
-			||
-# endif
-# ifdef FEAT_CONCEAL
-			curwin->w_p_cole > 0
-# endif
+#ifdef FEAT_CONCEAL
+			|| curwin->w_p_cole > 0
+#endif
 			)
-# ifdef FEAT_AUTOCMD
-		 && !EQUAL_POS(last_cursormoved, curwin->w_cursor)
-# endif
-		 )
+		 && !EQUAL_POS(last_cursormoved, curwin->w_cursor))
 	    {
-# ifdef FEAT_AUTOCMD
 		if (has_cursormoved())
 		    apply_autocmds(EVENT_CURSORMOVED, NULL, NULL,
 							       FALSE, curbuf);
-# endif
 # ifdef FEAT_CONCEAL
 		if (curwin->w_p_cole > 0)
 		{
-#  ifdef FEAT_AUTOCMD
 		    conceal_old_cursor_line = last_cursormoved.lnum;
-#  endif
 		    conceal_new_cursor_line = curwin->w_cursor.lnum;
 		    conceal_update_lines = TRUE;
 		}
 # endif
-# ifdef FEAT_AUTOCMD
 		last_cursormoved = curwin->w_cursor;
-# endif
 	    }
-#endif
-
-#ifdef FEAT_AUTOCMD
+
 	    /* Trigger TextChanged if b:changedtick differs. */
 	    if (!finish_op && has_textchanged()
 		    && curbuf->b_last_changedtick != CHANGEDTICK(curbuf))
@@ -1213,7 +1192,6 @@ main_loop(
 		apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL, FALSE, curbuf);
 		curbuf->b_last_changedtick = CHANGEDTICK(curbuf);
 	    }
-#endif
 
 #if defined(FEAT_DIFF) && defined(FEAT_SCROLLBIND)
 	    /* Scroll-binding for diff mode may have been postponed until
@@ -1292,7 +1270,7 @@ main_loop(
 	    may_clear_sb_text();	/* clear scroll-back text on next msg */
 	    showruler(FALSE);
 
-# if defined(FEAT_CONCEAL)
+#if defined(FEAT_CONCEAL)
 	    if (conceal_update_lines
 		    && (conceal_old_cursor_line != conceal_new_cursor_line
 			|| conceal_cursor_line(curwin)
@@ -1307,7 +1285,7 @@ main_loop(
 		mch_enable_flush();
 		curwin->w_valid &= ~VALID_CROW;
 	    }
-# endif
+#endif
 	    setcursor();
 	    cursor_on();
 
@@ -1405,11 +1383,10 @@ getout_preserve_modified(int exitval)
     void
 getout(int exitval)
 {
-#ifdef FEAT_AUTOCMD
+    tabpage_T	*tp;
+    tabpage_T	*next_tp;
     buf_T	*buf;
     win_T	*wp;
-    tabpage_T	*tp, *next_tp;
-#endif
 
     exiting = TRUE;
 
@@ -1434,8 +1411,7 @@ getout(int exitval)
     msg_didany = FALSE;
 #endif
 
-#ifdef FEAT_AUTOCMD
-    if (get_vim_var_nr(VV_DYING) <= 1)
+    if (v_dying <= 1)
     {
 	/* Trigger BufWinLeave for all windows, but only once per buffer. */
 	for (tp = first_tabpage; tp != NULL; tp = next_tp)
@@ -1479,7 +1455,6 @@ getout(int exitval)
 	    }
 	apply_autocmds(EVENT_VIMLEAVEPRE, NULL, NULL, FALSE, curbuf);
     }
-#endif
 
 #ifdef FEAT_VIMINFO
     if (*p_viminfo != NUL)
@@ -1487,10 +1462,8 @@ getout(int exitval)
 	write_viminfo(NULL, FALSE);
 #endif
 
-#ifdef FEAT_AUTOCMD
-    if (get_vim_var_nr(VV_DYING) <= 1)
+    if (v_dying <= 1)
 	apply_autocmds(EVENT_VIMLEAVE, NULL, NULL, FALSE, curbuf);
-#endif
 
 #ifdef FEAT_PROFILE
     profile_dump();
@@ -1507,13 +1480,11 @@ getout(int exitval)
 	wait_return(FALSE);
     }
 
-#ifdef FEAT_AUTOCMD
     /* Position the cursor again, the autocommands may have moved it */
-# ifdef FEAT_GUI
+#ifdef FEAT_GUI
     if (!gui.in_use)
-# endif
+#endif
 	windgoto((int)Rows - 1, 0);
-#endif
 
 #ifdef FEAT_JOB_CHANNEL
     job_stop_on_exit();
@@ -2701,13 +2672,11 @@ create_windows(mparm_T *parmp UNUSED)
 	 * Commands in the .vimrc might have loaded a file or split the window.
 	 * Watch out for autocommands that delete a window.
 	 */
-#ifdef FEAT_AUTOCMD
 	/*
 	 * Don't execute Win/Buf Enter/Leave autocommands here
 	 */
 	++autocmd_no_enter;
 	++autocmd_no_leave;
-#endif
 	dorewind = TRUE;
 	while (done++ < 1000)
 	{
@@ -2767,9 +2736,7 @@ create_windows(mparm_T *parmp UNUSED)
 		else
 		    handle_swap_exists(NULL);
 #endif
-#ifdef FEAT_AUTOCMD
 		dorewind = TRUE;		/* start again */
-#endif
 	    }
 	    ui_breakcheck();
 	    if (got_int)
@@ -2783,10 +2750,8 @@ create_windows(mparm_T *parmp UNUSED)
 	else
 	    curwin = firstwin;
 	curbuf = curwin->w_buffer;
-#ifdef FEAT_AUTOCMD
 	--autocmd_no_enter;
 	--autocmd_no_leave;
-#endif
     }
 }
 
@@ -2804,13 +2769,11 @@ edit_buffers(
     int		advance = TRUE;
     win_T	*win;
 
-# ifdef FEAT_AUTOCMD
     /*
      * Don't execute Win/Buf Enter/Leave autocommands here
      */
     ++autocmd_no_enter;
     ++autocmd_no_leave;
-# endif
 
     /* When w_arg_idx is -1 remove the window (see create_windows()). */
     if (curwin->w_arg_idx == -1)
@@ -2891,9 +2854,7 @@ edit_buffers(
 
     if (parmp->window_layout == WIN_TABS)
 	goto_tabpage(1);
-# ifdef FEAT_AUTOCMD
     --autocmd_no_enter;
-# endif
 
     /* make the first window the current window */
     win = firstwin;
@@ -2911,9 +2872,7 @@ edit_buffers(
 #endif
     win_enter(win, FALSE);
 
-#ifdef FEAT_AUTOCMD
     --autocmd_no_leave;
-#endif
     TIME_MSG("editing files in windows");
     if (parmp->window_count > 1 && parmp->window_layout != WIN_TABS)
 	win_equal(curwin, FALSE, 'b');	/* adjust heights */
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -799,11 +799,9 @@ codepage_invalid:
 	fix_arg_enc();
 #endif
 
-#ifdef FEAT_AUTOCMD
     /* Fire an autocommand to let people do custom font setup. This must be
      * after Vim has been setup for the new encoding. */
     apply_autocmds(EVENT_ENCODINGCHANGED, NULL, (char_u *)"", FALSE, curbuf);
-#endif
 
 #ifdef FEAT_SPELL
     /* Need to reload spell dictionaries */
@@ -4792,7 +4790,8 @@ iconv_end(void)
 # define USE_IMSTATUSFUNC (*p_imsf != NUL)
 #endif
 
-#if defined(FEAT_EVAL) && defined(FEAT_MBYTE)
+#if defined(FEAT_EVAL) && defined(FEAT_MBYTE) \
+	&& (defined(FEAT_XIM) || defined(IME_WITHOUT_XIM))
     static void
 call_imactivatefunc(int active)
 {
@@ -4811,11 +4810,7 @@ call_imstatusfunc(void)
     int is_active;
 
     /* FIXME: Don't execute user function in unsafe situation. */
-    if (exiting
-#   ifdef FEAT_AUTOCMD
-	    || is_autocmd_blocked()
-#   endif
-	    )
+    if (exiting || is_autocmd_blocked())
 	return FALSE;
     /* FIXME: :py print 'xxx' is shown duplicate result.
      * Use silent to avoid it. */
@@ -5698,11 +5693,11 @@ im_synthesize_keypress(unsigned int keyv
     void
 xim_reset(void)
 {
-#ifdef FEAT_EVAL
+# ifdef FEAT_EVAL
     if (USE_IMACTIVATEFUNC)
 	call_imactivatefunc(im_is_active);
     else
-#endif
+# endif
     if (xic != NULL)
     {
 	gtk_im_context_reset(xic);
@@ -6482,11 +6477,11 @@ xim_get_status_area_height(void)
 
 #else /* !defined(FEAT_XIM) */
 
-# if !defined(FEAT_GUI_W32) || !(defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))
+# ifdef IME_WITHOUT_XIM
 static int im_was_set_active = FALSE;
 
     int
-im_get_status()
+im_get_status(void)
 {
 #  if defined(FEAT_MBYTE) && defined(FEAT_EVAL)
     if (USE_IMSTATUSFUNC)
--- a/src/memline.c
+++ b/src/memline.c
@@ -1732,13 +1732,11 @@ theend:
     }
     if (serious_error && called_from_main)
 	ml_close(curbuf, TRUE);
-#ifdef FEAT_AUTOCMD
     else
     {
 	apply_autocmds(EVENT_BUFREADPOST, NULL, curbuf->b_fname, FALSE, curbuf);
 	apply_autocmds(EVENT_BUFWINENTER, NULL, curbuf->b_fname, FALSE, curbuf);
     }
-#endif
     return;
 }
 
@@ -4071,7 +4069,7 @@ attention_message(
     --no_wait_return;
 }
 
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
 static int do_swapexists(buf_T *buf, char_u *fname);
 
 /*
@@ -4450,7 +4448,7 @@ findswapname(
 #if (defined(UNIX) || defined(VMS)) && (defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG))
 		    process_still_running = FALSE;
 #endif
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
 		    /*
 		     * If there is an SwapExists autocommand and we can handle
 		     * the response, trigger it.  It may return 0 to ask the
--- a/src/menu.c
+++ b/src/menu.c
@@ -1907,7 +1907,6 @@ show_popupmenu(void)
 	return;
     mode = menu_mode_chars[mode];
 
-# ifdef FEAT_AUTOCMD
     {
 	char_u	    ename[2];
 
@@ -1915,7 +1914,6 @@ show_popupmenu(void)
 	ename[1] = NUL;
 	apply_autocmds(EVENT_MENUPOPUP, ename, NULL, FALSE, curbuf);
     }
-# endif
 
     for (menu = root_menu; menu != NULL; menu = menu->next)
 	if (STRNCMP("PopUp", menu->name, 5) == 0 && menu->name[5] == mode)
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -3183,12 +3183,10 @@ changed_common(
     if (must_redraw < VALID)
 	must_redraw = VALID;
 
-#ifdef FEAT_AUTOCMD
     /* when the cursor line is changed always trigger CursorMoved */
     if (lnum <= curwin->w_cursor.lnum
 		 && lnume + (xtra < 0 ? -xtra : xtra) > curwin->w_cursor.lnum)
 	last_cursormoved.lnum = 0;
-#endif
 }
 
 /*
@@ -3252,18 +3250,14 @@ change_warning(
 
     if (curbuf->b_did_warn == FALSE
 	    && curbufIsChanged() == 0
-#ifdef FEAT_AUTOCMD
 	    && !autocmd_busy
-#endif
 	    && curbuf->b_p_ro)
     {
-#ifdef FEAT_AUTOCMD
 	++curbuf_lock;
 	apply_autocmds(EVENT_FILECHANGEDRO, NULL, NULL, FALSE, curbuf);
 	--curbuf_lock;
 	if (!curbuf->b_p_ro)
 	    return;
-#endif
 	/*
 	 * Do what msg() does, but with a column offset if the warning should
 	 * be after the mode message.
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1099,10 +1099,8 @@ free_all_mem(void)
 	return;
     entered_free_all_mem = TRUE;
 
-# ifdef FEAT_AUTOCMD
     /* Don't want to trigger autocommands from here on. */
     block_autocmds();
-# endif
 
     /* Close all tabs and windows.  Reset 'equalalways' to avoid redraws. */
     p_ea = FALSE;
@@ -1157,9 +1155,7 @@ free_all_mem(void)
 # endif
 
     /* Obviously named calls. */
-# if defined(FEAT_AUTOCMD)
     free_all_autocmds();
-# endif
     clear_termcodes();
     free_all_marks();
     alist_clear(&global_alist);
@@ -3403,11 +3399,9 @@ vim_chdirfile(char_u *fname, char *trigg
     vim_strncpy(dir, fname, MAXPATHL - 1);
     *gettail_sep(dir) = NUL;
     res = mch_chdir((char *)dir) == 0 ? OK : FAIL;
-#ifdef FEAT_AUTOCMD
     if (res == OK && trigger_autocmd != NULL)
 	apply_autocmds(EVENT_DIRCHANGED, (char_u *)trigger_autocmd,
 							   dir, FALSE, curbuf);
-#endif
     return res;
 }
 #endif
--- a/src/move.c
+++ b/src/move.c
@@ -538,9 +538,7 @@ set_topline(win_T *wp, linenr_T lnum)
     /* Approximate the value of w_botline */
     wp->w_botline += lnum - wp->w_topline;
     wp->w_topline = lnum;
-#ifdef FEAT_AUTOCMD
     wp->w_topline_was_set = TRUE;
-#endif
 #ifdef FEAT_DIFF
     wp->w_topfill = 0;
 #endif
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -1581,9 +1581,7 @@ nb_do_cmd(
 	    do_update = 1;
 	    buf->initDone = TRUE;
 	    nb_set_curbuf(buf->bufp);
-#if defined(FEAT_AUTOCMD)
 	    apply_autocmds(EVENT_BUFREADPOST, 0, 0, FALSE, buf->bufp);
-#endif
 
 	    /* handle any postponed key commands */
 	    handle_key_queue();
@@ -2160,17 +2158,13 @@ nb_do_cmd(
 #endif
 			)
 		{
-#ifdef FEAT_AUTOCMD
 		    bufref_T bufref;
 
 		    set_bufref(&bufref, buf->bufp);
-#endif
 		    buf_write_all(buf->bufp, FALSE);
-#ifdef FEAT_AUTOCMD
 		    /* an autocommand may have deleted the buffer */
 		    if (!bufref_valid(&bufref))
 			buf->bufp = NULL;
-#endif
 		}
 	    }
 	    else
--- a/src/normal.c
+++ b/src/normal.c
@@ -169,9 +169,7 @@ static void	nv_nbcmd(cmdarg_T *cap);
 #ifdef FEAT_DND
 static void	nv_drop(cmdarg_T *cap);
 #endif
-#ifdef FEAT_AUTOCMD
 static void	nv_cursorhold(cmdarg_T *cap);
-#endif
 static void	get_op_vcol(oparg_T *oap, colnr_T col, int initial);
 
 static char *e_noident = N_("E349: No identifier under cursor");
@@ -424,9 +422,7 @@ static const struct nv_cmd
 #ifdef FEAT_DND
     {K_DROP,	nv_drop,	NV_STS,			0},
 #endif
-#ifdef FEAT_AUTOCMD
     {K_CURSORHOLD, nv_cursorhold, NV_KEEPREG,		0},
-#endif
     {K_PS,	nv_edit,	0,			0},
 };
 
@@ -595,7 +591,6 @@ normal_cmd(
 #endif
     }
 
-#ifdef FEAT_AUTOCMD
     /* Restore counts from before receiving K_CURSORHOLD.  This means after
      * typing "3", handling K_CURSORHOLD and then typing "2" we get "32", not
      * "3 * 2". */
@@ -606,7 +601,6 @@ normal_cmd(
 	oap->prev_opcount = 0;
 	oap->prev_count0 = 0;
     }
-#endif
 
     mapped_len = typebuf_maplen();
 
@@ -737,7 +731,6 @@ getcount:
 	}
     }
 
-#ifdef FEAT_AUTOCMD
     if (c == K_CURSORHOLD)
     {
 	/* Save the count values so that ca.opcount and ca.count0 are exactly
@@ -745,9 +738,7 @@ getcount:
 	oap->prev_opcount = ca.opcount;
 	oap->prev_count0 = ca.count0;
     }
-    else
-#endif
-	if (ca.opcount != 0)
+    else if (ca.opcount != 0)
     {
 	/*
 	 * If we're in the middle of an operator (including after entering a
@@ -808,10 +799,8 @@ getcount:
 	text_locked_msg();
 	goto normal_end;
     }
-#ifdef FEAT_AUTOCMD
     if ((nv_cmds[idx].cmd_flags & NV_NCW) && curbuf_locked())
 	goto normal_end;
-#endif
 
     /*
      * In Visual/Select mode, a few keys are handled in a special way.
@@ -892,17 +881,15 @@ getcount:
 	int	lit = FALSE;	/* get extra character literally */
 	int	langmap_active = FALSE;    /* using :lmap mappings */
 	int	lang;		/* getting a text character */
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
 	int	save_smd;	/* saved value of p_smd */
 #endif
 
 	++no_mapping;
 	++allow_keys;		/* no mapping for nchar, but allow key codes */
-#ifdef FEAT_AUTOCMD
 	/* Don't generate a CursorHold event here, most commands can't handle
 	 * it, e.g., nv_replace(), nv_csearch(). */
 	did_cursorhold = TRUE;
-#endif
 	if (ca.cmdchar == 'g')
 	{
 	    /*
@@ -957,7 +944,7 @@ getcount:
 		    State = LANGMAP;
 		langmap_active = TRUE;
 	    }
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
 	    save_smd = p_smd;
 	    p_smd = FALSE;	/* Don't let the IM code show the mode here */
 	    if (lang && curbuf->b_p_iminsert == B_IMODE_IM)
@@ -973,7 +960,7 @@ getcount:
 		++allow_keys;
 		State = NORMAL_BUSY;
 	    }
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
 	    if (lang)
 	    {
 		if (curbuf->b_p_iminsert != B_IMODE_LMAP)
@@ -1102,10 +1089,8 @@ getcount:
     if (need_flushbuf)
 	out_flush();
 #endif
-#ifdef FEAT_AUTOCMD
     if (ca.cmdchar != K_IGNORE)
 	did_cursorhold = FALSE;
-#endif
 
     State = NORMAL;
 
@@ -1278,10 +1263,7 @@ normal_end:
 
 #ifdef FEAT_CMDL_INFO
     if (oap->op_type == OP_NOP && oap->regname == 0
-# ifdef FEAT_AUTOCMD
-	    && ca.cmdchar != K_CURSORHOLD
-# endif
-	    )
+	    && ca.cmdchar != K_CURSORHOLD)
 	clear_showcmd();
 #endif
 
@@ -6264,13 +6246,11 @@ nv_gotofile(cmdarg_T *cap)
 	text_locked_msg();
 	return;
     }
-#ifdef FEAT_AUTOCMD
     if (curbuf_locked())
     {
 	clearop(cap->oap);
 	return;
     }
-#endif
 
     ptr = grab_file_name(cap->count1, &lnum);
 
@@ -9597,7 +9577,6 @@ nv_drop(cmdarg_T *cap UNUSED)
 }
 #endif
 
-#ifdef FEAT_AUTOCMD
 /*
  * Trigger CursorHold event.
  * When waiting for a character for 'updatetime' K_CURSORHOLD is put in the
@@ -9610,7 +9589,6 @@ nv_cursorhold(cmdarg_T *cap)
     did_cursorhold = TRUE;
     cap->retval |= CA_COMMAND_BUSY;	/* don't call edit() now */
 }
-#endif
 
 /*
  * Calculate start/end virtual columns for operating in block mode.
--- a/src/ops.c
+++ b/src/ops.c
@@ -1651,7 +1651,7 @@ shift_delete_registers()
     y_regs[1].y_array = NULL;		/* set register one to empty */
 }
 
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
     static void
 yank_do_autocmd(oparg_T *oap, yankreg_T *reg)
 {
@@ -1866,7 +1866,7 @@ op_delete(oparg_T *oap)
 	    }
 	}
 
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
 	if (did_yank && has_textyankpost())
 	    yank_do_autocmd(oap, y_current);
 #endif
@@ -3350,7 +3350,7 @@ op_yank(oparg_T *oap, int deleting, int 
 # endif
 #endif
 
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
     if (!deleting && has_textyankpost())
 	yank_do_autocmd(oap, y_current);
 #endif
@@ -3493,11 +3493,9 @@ do_put(
 	    return;
     }
 
-#ifdef FEAT_AUTOCMD
     /* Autocommands may be executed when saving lines for undo, which may make
      * y_array invalid.  Start undo now to avoid that. */
     u_save(curwin->w_cursor.lnum, curwin->w_cursor.lnum + 1);
-#endif
 
     if (insert_string != NULL)
     {
--- a/src/option.c
+++ b/src/option.c
@@ -114,9 +114,7 @@
 #define PV_FF		OPT_BUF(BV_FF)
 #define PV_FLP		OPT_BUF(BV_FLP)
 #define PV_FO		OPT_BUF(BV_FO)
-#ifdef FEAT_AUTOCMD
-# define PV_FT		OPT_BUF(BV_FT)
-#endif
+#define PV_FT		OPT_BUF(BV_FT)
 #define PV_IMI		OPT_BUF(BV_IMI)
 #define PV_IMS		OPT_BUF(BV_IMS)
 #if defined(FEAT_CINDENT) && defined(FEAT_EVAL)
@@ -319,9 +317,7 @@ static char_u	*p_fenc;
 static char_u	*p_ff;
 static char_u	*p_fo;
 static char_u	*p_flp;
-#ifdef FEAT_AUTOCMD
 static char_u	*p_ft;
-#endif
 static long	p_iminsert;
 static long	p_imsearch;
 #if defined(FEAT_FIND_ID) && defined(FEAT_EVAL)
@@ -1125,11 +1121,7 @@ static struct vimoption options[] =
 			    (char_u *)&p_ek, PV_NONE,
 			    {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT},
     {"eventignore", "ei",   P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP,
-#ifdef FEAT_AUTOCMD
 			    (char_u *)&p_ei, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
 			    {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
     {"expandtab",   "et",   P_BOOL|P_VI_DEF|P_VIM,
 			    (char_u *)&p_et, PV_ET,
@@ -1174,13 +1166,8 @@ static struct vimoption options[] =
 #endif
 					(char_u *)0L} SCRIPTID_INIT},
     {"filetype",    "ft",   P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME,
-#ifdef FEAT_AUTOCMD
 			    (char_u *)&p_ft, PV_FT,
 			    {(char_u *)"", (char_u *)0L}
-#else
-			    (char_u *)NULL, PV_NONE,
-			    {(char_u *)0L, (char_u *)0L}
-#endif
 			    SCRIPTID_INIT},
     {"fillchars",   "fcs",  P_STRING|P_VI_DEF|P_RALL|P_ONECOMMA|P_NODUP,
 			    (char_u *)&p_fcs, PV_NONE,
@@ -3248,11 +3235,7 @@ static char *(p_scbopt_values[]) = {"ver
 #endif
 static char *(p_debug_values[]) = {"msg", "throw", "beep", NULL};
 static char *(p_ead_values[]) = {"both", "ver", "hor", NULL};
-#ifdef FEAT_AUTOCMD
 static char *(p_buftype_values[]) = {"nofile", "nowrite", "quickfix", "help", "terminal", "acwrite", NULL};
-#else
-static char *(p_buftype_values[]) = {"nofile", "nowrite", "quickfix", "help", "terminal", NULL};
-#endif
 static char *(p_bufhidden_values[]) = {"hide", "unload", "delete", "wipe", NULL};
 static char *(p_bs_values[]) = {"indent", "eol", "start", NULL};
 #ifdef FEAT_FOLDING
@@ -4339,7 +4322,7 @@ set_title_defaults(void)
 }
 #endif
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
     static void
 trigger_optionsset_string(
 	int	opt_idx,
@@ -4830,7 +4813,7 @@ do_set(
 			char_u	  *oldval = NULL; /* previous value if *varp */
 			char_u	  *newval;
 			char_u	  *origval = NULL;
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 			char_u	  *saved_origval = NULL;
 			char_u	  *saved_newval = NULL;
 #endif
@@ -5184,7 +5167,7 @@ do_set(
 			 */
 			*(char_u **)(varp) = newval;
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 			if (!starting
 # ifdef FEAT_CRYPT
 				&& options[opt_idx].indir != PV_KEY
@@ -5207,7 +5190,7 @@ do_set(
 			errmsg = did_set_string_option(opt_idx, (char_u **)varp,
 				new_value_alloced, oldval, errbuf, opt_flags);
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 			if (errmsg == NULL)
 			    trigger_optionsset_string(opt_idx, opt_flags,
 						  saved_origval, saved_newval);
@@ -5726,9 +5709,7 @@ check_buf_options(buf_T *buf)
     check_string_option(&buf->b_p_cino);
     parse_cino(buf);
 #endif
-#ifdef FEAT_AUTOCMD
     check_string_option(&buf->b_p_ft);
-#endif
 #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
     check_string_option(&buf->b_p_cinw);
 #endif
@@ -5982,7 +5963,7 @@ set_string_option(
     char_u	*s;
     char_u	**varp;
     char_u	*oldval;
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
     char_u	*saved_oldval = NULL;
     char_u	*saved_newval = NULL;
 #endif
@@ -6002,7 +5983,7 @@ set_string_option(
 	oldval = *varp;
 	*varp = s;
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	if (!starting
 # ifdef FEAT_CRYPT
 		&& options[opt_idx].indir != PV_KEY
@@ -6017,7 +5998,7 @@ set_string_option(
 							   opt_flags)) == NULL)
 	    did_set_option(opt_idx, opt_flags, TRUE);
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	/* call autocommand after handling side effects */
 	if (r == NULL)
 	    trigger_optionsset_string(opt_idx, opt_flags,
@@ -6029,7 +6010,6 @@ set_string_option(
     return r;
 }
 
-#if defined(FEAT_KEYMAP) || defined(FEAT_AUTOCMD) || defined(FEAT_SYN_HL)
 /*
  * Return TRUE if "val" is a valid 'filetype' name.
  * Also used for 'syntax' and 'keymap'.
@@ -6044,7 +6024,6 @@ valid_filetype(char_u *val)
 	    return FALSE;
     return TRUE;
 }
-#endif
 
 /*
  * Handle string options that need some action to perform when changed.
@@ -6068,9 +6047,7 @@ did_set_string_option(
     /* set when changing an option that only requires a redraw in the GUI */
     int		redraw_gui_only = FALSE;
 #endif
-#ifdef FEAT_AUTOCMD
     int		ft_changed = FALSE;
-#endif
 
     /* Get the global option to compare with, otherwise we would have to check
      * two values for all local options. */
@@ -6351,14 +6328,12 @@ did_set_string_option(
     }
 #endif
 
-#ifdef FEAT_AUTOCMD
     /* 'eventignore' */
     else if (varp == &p_ei)
     {
 	if (check_ei() == FAIL)
 	    errmsg = e_invarg;
     }
-#endif
 
 #ifdef FEAT_MBYTE
     /* 'encoding', 'fileencoding', 'termencoding' and 'makeencoding' */
@@ -7468,7 +7443,6 @@ did_set_string_option(
     }
 #endif
 
-#ifdef FEAT_AUTOCMD
     else if (gvarp == &p_ft)
     {
 	if (!valid_filetype(*varp))
@@ -7476,7 +7450,6 @@ did_set_string_option(
 	else
 	    ft_changed = STRCMP(oldval, *varp) != 0;
     }
-#endif
 
 #ifdef FEAT_SYN_HL
     else if (gvarp == &p_syn)
@@ -7593,18 +7566,17 @@ did_set_string_option(
 	else if (!(opt_flags & OPT_LOCAL) && opt_flags != OPT_GLOBAL)
 	    set_string_option_global(opt_idx, varp);
 
-#ifdef FEAT_AUTOCMD
 	/*
 	 * Trigger the autocommand only after setting the flags.
 	 */
-# ifdef FEAT_SYN_HL
+#ifdef FEAT_SYN_HL
 	/* When 'syntax' is set, load the syntax of that name */
 	if (varp == &(curbuf->b_p_syn))
 	{
 	    apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn,
 					       curbuf->b_fname, TRUE, curbuf);
 	}
-# endif
+#endif
 	else if (varp == &(curbuf->b_p_ft))
 	{
 	    /* 'filetype' is set, trigger the FileType autocommand.
@@ -7620,7 +7592,6 @@ did_set_string_option(
 		    varp = NULL;
 	    }
 	}
-#endif
 #ifdef FEAT_SPELL
 	if (varp == &(curwin->w_s->b_p_spl))
 	{
@@ -8280,14 +8251,12 @@ set_bool_option(
 #endif
     }
 
-#ifdef FEAT_AUTOCMD
     /* when 'buflisted' changes, trigger autocommands */
     else if ((int *)varp == &curbuf->b_p_bl && old_value != curbuf->b_p_bl)
     {
 	apply_autocmds(curbuf->b_p_bl ? EVENT_BUFADD : EVENT_BUFDELETE,
 						    NULL, NULL, TRUE, curbuf);
     }
-#endif
 
     /* when 'swf' is set, create swapfile, when reset remove swapfile */
     else if ((int *)varp == &curbuf->b_p_swf)
@@ -8433,9 +8402,7 @@ set_bool_option(
 #ifdef FEAT_TITLE
 	redraw_titles();
 #endif
-#ifdef FEAT_AUTOCMD
 	modified_was_set = value;
-#endif
     }
 
 #ifdef BACKSLASH_IN_FILENAME
@@ -8529,7 +8496,7 @@ set_bool_option(
     }
 #endif
 
-#ifdef FEAT_MBYTE
+#ifdef HAVE_INPUT_METHOD
     /* 'imdisable' */
     else if ((int *)varp == &p_imdisable)
     {
@@ -8739,7 +8706,7 @@ set_bool_option(
 
     options[opt_idx].flags |= P_WAS_SET;
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
     if (!starting)
     {
 	char_u buf_old[2], buf_new[2], buf_type[7];
@@ -9289,7 +9256,7 @@ set_num_option(
 
     options[opt_idx].flags |= P_WAS_SET;
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
     if (!starting && errmsg == NULL)
     {
 	char_u buf_old[11], buf_new[11], buf_type[7];
@@ -10139,22 +10106,15 @@ makeset(FILE *fd, int opt_flags, int loc
 		}
 		else    /* P_STRING */
 		{
-#if defined(FEAT_SYN_HL) || defined(FEAT_AUTOCMD)
 		    int		do_endif = FALSE;
 
 		    /* Don't set 'syntax' and 'filetype' again if the value is
 		     * already right, avoids reloading the syntax file. */
 		    if (
-# if defined(FEAT_SYN_HL)
-			    p->indir == PV_SYN
-#  if defined(FEAT_AUTOCMD)
-			    ||
-#  endif
-# endif
-# if defined(FEAT_AUTOCMD)
-			    p->indir == PV_FT
-# endif
-			    )
+#if defined(FEAT_SYN_HL)
+			    p->indir == PV_SYN ||
+#endif
+			    p->indir == PV_FT)
 		    {
 			if (fprintf(fd, "if &%s != '%s'", p->fullname,
 						       *(char_u **)(varp)) < 0
@@ -10162,17 +10122,14 @@ makeset(FILE *fd, int opt_flags, int loc
 			    return FAIL;
 			do_endif = TRUE;
 		    }
-#endif
 		    if (put_setstring(fd, cmd, p->fullname, (char_u **)varp,
 					  (p->flags & P_EXPAND) != 0) == FAIL)
 			return FAIL;
-#if defined(FEAT_SYN_HL) || defined(FEAT_AUTOCMD)
 		    if (do_endif)
 		    {
 			if (put_line(fd, "endif") == FAIL)
 			    return FAIL;
 		    }
-#endif
 		}
 	    }
 	}
@@ -10783,9 +10740,7 @@ get_varp(struct vimoption *p)
 	case PV_FENC:	return (char_u *)&(curbuf->b_p_fenc);
 #endif
 	case PV_FF:	return (char_u *)&(curbuf->b_p_ff);
-#ifdef FEAT_AUTOCMD
 	case PV_FT:	return (char_u *)&(curbuf->b_p_ft);
-#endif
 	case PV_FO:	return (char_u *)&(curbuf->b_p_fo);
 	case PV_FLP:	return (char_u *)&(curbuf->b_p_flp);
 	case PV_IMI:	return (char_u *)&(curbuf->b_p_iminsert);
@@ -11200,10 +11155,8 @@ buf_copy_options(buf_T *buf, int flags)
 	    buf->b_p_cink = vim_strsave(p_cink);
 	    buf->b_p_cino = vim_strsave(p_cino);
 #endif
-#ifdef FEAT_AUTOCMD
 	    /* Don't copy 'filetype', it must be detected */
 	    buf->b_p_ft = empty_option;
-#endif
 	    buf->b_p_pi = p_pi;
 #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
 	    buf->b_p_cinw = vim_strsave(p_cinw);
--- a/src/option.h
+++ b/src/option.h
@@ -477,9 +477,7 @@ EXTERN char_u	*p_efm;		/* 'errorformat' 
 EXTERN char_u	*p_gefm;	/* 'grepformat' */
 EXTERN char_u	*p_gp;		/* 'grepprg' */
 #endif
-#ifdef FEAT_AUTOCMD
 EXTERN char_u	*p_ei;		/* 'eventignore' */
-#endif
 EXTERN int	p_ek;		/* 'esckeys' */
 EXTERN int	p_exrc;		/* 'exrc' */
 #ifdef FEAT_MBYTE
@@ -1046,9 +1044,7 @@ enum
     , BV_FF
     , BV_FLP
     , BV_FO
-#ifdef FEAT_AUTOCMD
     , BV_FT
-#endif
     , BV_IMI
     , BV_IMS
 #if defined(FEAT_CINDENT) && defined(FEAT_EVAL)
--- a/src/os_amiga.c
+++ b/src/os_amiga.c
@@ -152,7 +152,6 @@ mch_inchar(
 	 */
 	if (WaitForChar(raw_in, p_ut * 1000L) == 0)
 	{
-#ifdef FEAT_AUTOCMD
 	    if (trigger_cursorhold() && maxlen >= 3)
 	    {
 		buf[0] = K_SPECIAL;
@@ -160,7 +159,6 @@ mch_inchar(
 		buf[2] = (int)KE_CURSORHOLD;
 		return 3;
 	    }
-#endif
 	    before_blocking();
 	}
     }
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -2163,7 +2163,6 @@ Messaging_WndProc(HWND hwnd, UINT msg, W
 			   (data->dwData == COPYDATA_RESULT ? 1 :
 							      2))) == FAIL)
 		    vim_free(str);
-#ifdef FEAT_AUTOCMD
 		else if (data->dwData == COPYDATA_REPLY)
 		{
 		    char_u	winstr[30];
@@ -2172,7 +2171,6 @@ Messaging_WndProc(HWND hwnd, UINT msg, W
 		    apply_autocmds(EVENT_REMOTEREPLY, winstr, str,
 								TRUE, curbuf);
 		}
-#endif
 	    }
 	    return 1;
 	}
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -445,7 +445,6 @@ mch_inchar(
 		{
 		    /* no character available within 'updatetime' */
 		    did_start_blocking = TRUE;
-#ifdef FEAT_AUTOCMD
 		    if (trigger_cursorhold() && maxlen >= 3
 					    && !typebuf_changed(tb_change_cnt))
 		    {
@@ -454,7 +453,6 @@ mch_inchar(
 			buf[2] = (int)KE_CURSORHOLD;
 			return 3;
 		    }
-#endif
 		    /*
 		     * If there is no character available within 'updatetime'
 		     * seconds flush all the swap files to disk.
@@ -1133,16 +1131,15 @@ deathtrap SIGDEFARG(sigarg)
     /* Remember how often we have been called. */
     ++entered;
 
-#ifdef FEAT_AUTOCMD
     /* Executing autocommands is likely to use more stack space than we have
      * available in the signal stack. */
     block_autocmds();
-#endif
 
 #ifdef FEAT_EVAL
     /* Set the v:dying variable. */
     set_vim_var_nr(VV_DYING, (long)entered);
 #endif
+    v_dying = entered;
 
 #ifdef HAVE_STACK_LIMIT
     /* Since we are now using the signal stack, need to reset the stack
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -1787,7 +1787,6 @@ mch_inchar(
 	 */
 	if (!WaitForChar(p_ut, FALSE))
 	{
-#ifdef FEAT_AUTOCMD
 	    if (trigger_cursorhold() && maxlen >= 3)
 	    {
 		buf[0] = K_SPECIAL;
@@ -1795,7 +1794,6 @@ mch_inchar(
 		buf[2] = (int)KE_CURSORHOLD;
 		return 3;
 	    }
-#endif
 	    before_blocking();
 	}
     }
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -3626,13 +3626,10 @@ qf_fill_buffer(qf_info_T *qi, buf_T *buf
 	/* Set the 'filetype' to "qf" each time after filling the buffer.
 	 * This resembles reading a file into a buffer, it's more logical when
 	 * using autocommands. */
-#ifdef FEAT_AUTOCMD
 	++curbuf_lock;
-#endif
 	set_option_value((char_u *)"ft", 0L, (char_u *)"qf", OPT_LOCAL);
 	curbuf->b_p_ma = FALSE;
 
-#ifdef FEAT_AUTOCMD
 	keep_filetype = TRUE;		/* don't detect 'filetype' */
 	apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL,
 							       FALSE, curbuf);
@@ -3640,7 +3637,7 @@ qf_fill_buffer(qf_info_T *qi, buf_T *buf
 							       FALSE, curbuf);
 	keep_filetype = FALSE;
 	--curbuf_lock;
-#endif
+
 	/* make sure it will be redrawn */
 	redraw_curbuf_later(NOT_VALID);
     }
@@ -3682,7 +3679,6 @@ ex_make(exarg_T *eap)
     win_T	*wp = NULL;
     qf_info_T	*qi = &ql_info;
     int		res;
-#ifdef FEAT_AUTOCMD
     char_u	*au_name = NULL;
 
     /* Redirect ":grep" to ":vimgrep" if 'grepprg' is "internal". */
@@ -3705,12 +3701,11 @@ ex_make(exarg_T *eap)
     if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
 					       curbuf->b_fname, TRUE, curbuf))
     {
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	if (aborting())
 	    return;
-# endif
-    }
 #endif
+    }
 #ifdef FEAT_MBYTE
     enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
 #endif
@@ -3766,7 +3761,6 @@ ex_make(exarg_T *eap)
 	qi = GET_LOC_LIST(wp);
     if (res >= 0 && qi != NULL)
 	qf_list_changed(qi, qi->qf_curlist);
-#ifdef FEAT_AUTOCMD
     if (au_name != NULL)
     {
 	apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
@@ -3776,7 +3770,6 @@ ex_make(exarg_T *eap)
 	else
 	    res = 0;
     }
-#endif
     if (res > 0 && !eap->forceit)
 	qf_jump(qi, 0, 0, FALSE);		/* display first error */
 
@@ -4105,13 +4098,10 @@ ex_cfile(exarg_T *eap)
     char_u	*enc = NULL;
     win_T	*wp = NULL;
     qf_info_T	*qi = &ql_info;
-#ifdef FEAT_AUTOCMD
     char_u	*au_name = NULL;
     int		save_qfid;
-#endif
     int		res;
 
-#ifdef FEAT_AUTOCMD
     switch (eap->cmdidx)
     {
 	case CMD_cfile:	    au_name = (char_u *)"cfile"; break;
@@ -4124,7 +4114,6 @@ ex_cfile(exarg_T *eap)
     }
     if (au_name != NULL)
 	apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, NULL, FALSE, curbuf);
-#endif
 #ifdef FEAT_MBYTE
     enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
 #endif
@@ -4164,7 +4153,6 @@ ex_cfile(exarg_T *eap)
 	qi = GET_LOC_LIST(wp);
     if (res >= 0 && qi != NULL)
 	qf_list_changed(qi, qi->qf_curlist);
-#ifdef FEAT_AUTOCMD
     if (qi != NULL)
 	save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
     if (au_name != NULL)
@@ -4174,7 +4162,6 @@ ex_cfile(exarg_T *eap)
      * is still valid. */
     if (qi != NULL && !qflist_valid(wp, save_qfid))
 	return;
-#endif
     if (res > 0 && (eap->cmdidx == CMD_cfile || eap->cmdidx == CMD_lfile))
 	qf_jump(qi, 0, 0, eap->forceit);	/* display first error */
 }
@@ -4198,11 +4185,9 @@ ex_vimgrep(exarg_T *eap)
     int		fi;
     qf_info_T	*qi = &ql_info;
     int		loclist_cmd = FALSE;
-#ifdef FEAT_AUTOCMD
     int_u	save_qfid;
     qfline_T	*cur_qf_start;
     win_T	*wp;
-#endif
     long	lnum;
     buf_T	*buf;
     int		duplicate_name = FALSE;
@@ -4212,7 +4197,7 @@ ex_vimgrep(exarg_T *eap)
     buf_T	*first_match_buf = NULL;
     time_t	seconds = 0;
     int		save_mls;
-#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
+#if defined(FEAT_SYN_HL)
     char_u	*save_ei = NULL;
 #endif
     aco_save_T	aco;
@@ -4222,7 +4207,6 @@ ex_vimgrep(exarg_T *eap)
     char_u	*dirname_start = NULL;
     char_u	*dirname_now = NULL;
     char_u	*target_dir = NULL;
-#ifdef FEAT_AUTOCMD
     char_u	*au_name =  NULL;
 
     switch (eap->cmdidx)
@@ -4240,12 +4224,11 @@ ex_vimgrep(exarg_T *eap)
     if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
 					       curbuf->b_fname, TRUE, curbuf))
     {
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	if (aborting())
 	    return;
-# endif
-    }
 #endif
+    }
 
     if (eap->cmdidx == CMD_lgrep
 	    || eap->cmdidx == CMD_lvimgrep
@@ -4325,12 +4308,10 @@ ex_vimgrep(exarg_T *eap)
      * ":lcd %:p:h" changes the meaning of short path names. */
     mch_dirname(dirname_start, MAXPATHL);
 
-#ifdef FEAT_AUTOCMD
      /* Remember the current values of the quickfix list and qf_start, so that
       * we can check for autocommands changing the current quickfix list. */
     save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
     cur_qf_start = qi->qf_lists[qi->qf_curlist].qf_start;
-#endif
 
     seconds = (time_t)0;
     for (fi = 0; fi < fcount && !got_int && tomatch > 0; ++fi)
@@ -4365,7 +4346,7 @@ ex_vimgrep(exarg_T *eap)
 	    using_dummy = TRUE;
 	    redraw_for_dummy = TRUE;
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
+#if defined(FEAT_SYN_HL)
 	    /* Don't do Filetype autocommands to avoid loading syntax and
 	     * indent scripts, a great speed improvement. */
 	    save_ei = au_event_disable(",Filetype");
@@ -4379,7 +4360,7 @@ ex_vimgrep(exarg_T *eap)
 	    buf = load_dummy_buffer(fname, dirname_start, dirname_now);
 
 	    p_mls = save_mls;
-#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
+#if defined(FEAT_SYN_HL)
 	    au_event_restore(save_ei);
 #endif
 	}
@@ -4387,7 +4368,6 @@ ex_vimgrep(exarg_T *eap)
 	    /* Use existing, loaded buffer. */
 	    using_dummy = FALSE;
 
-#ifdef FEAT_AUTOCMD
 	if (loclist_cmd)
 	{
 	    /*
@@ -4419,7 +4399,6 @@ ex_vimgrep(exarg_T *eap)
 		cur_qf_start = qi->qf_lists[qi->qf_curlist].qf_start;
 	    }
 	}
-#endif
 
 	if (buf == NULL)
 	{
@@ -4475,9 +4454,7 @@ ex_vimgrep(exarg_T *eap)
 		if (got_int)
 		    break;
 	    }
-#ifdef FEAT_AUTOCMD
 	    cur_qf_start = qi->qf_lists[qi->qf_curlist].qf_start;
-#endif
 
 	    if (using_dummy)
 	    {
@@ -4532,7 +4509,7 @@ ex_vimgrep(exarg_T *eap)
 		     * need to be done (again).  But not the window-local
 		     * options! */
 		    aucmd_prepbuf(&aco, buf);
-#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
+#if defined(FEAT_SYN_HL)
 		    apply_autocmds(EVENT_FILETYPE, buf->b_p_ft,
 						     buf->b_fname, TRUE, buf);
 #endif
@@ -4552,7 +4529,6 @@ ex_vimgrep(exarg_T *eap)
 
     qf_update_buffer(qi, NULL);
 
-#ifdef FEAT_AUTOCMD
     if (au_name != NULL)
 	apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
 					       curbuf->b_fname, TRUE, curbuf);
@@ -4563,7 +4539,6 @@ ex_vimgrep(exarg_T *eap)
     wp = loclist_cmd ? curwin : NULL;
     if (!qflist_valid(wp, save_qfid))
 	goto theend;
-#endif
 
     /* Jump to first match. */
     if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
@@ -4748,7 +4723,7 @@ wipe_dummy_buffer(buf_T *buf, char_u *di
 {
     if (curbuf != buf)		/* safety check */
     {
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	cleanup_T   cs;
 
 	/* Reset the error/interrupt/exception state here so that aborting()
@@ -4759,7 +4734,7 @@ wipe_dummy_buffer(buf_T *buf, char_u *di
 
 	wipe_buffer(buf, FALSE);
 
-#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	/* Restore the error/interrupt/exception state if not discarded by a
 	 * new aborting error, interrupt, or uncaught exception. */
 	leave_cleanup(&cs);
@@ -5598,12 +5573,9 @@ ex_cbuffer(exarg_T *eap)
 {
     buf_T	*buf = NULL;
     qf_info_T	*qi = &ql_info;
-#ifdef FEAT_AUTOCMD
     char_u	*au_name = NULL;
-#endif
     int		res;
 
-#ifdef FEAT_AUTOCMD
     switch (eap->cmdidx)
     {
 	case CMD_cbuffer:	au_name = (char_u *)"cbuffer"; break;
@@ -5617,12 +5589,11 @@ ex_cbuffer(exarg_T *eap)
     if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
 					       curbuf->b_fname, TRUE, curbuf))
     {
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	if (aborting())
 	    return;
-# endif
-    }
 #endif
+    }
 
     /* Must come after autocommands. */
     if (eap->cmdidx == CMD_lbuffer
@@ -5670,11 +5641,9 @@ ex_cbuffer(exarg_T *eap)
 						   qf_title, NULL);
 	    if (res >= 0)
 		qf_list_changed(qi, qi->qf_curlist);
-#ifdef FEAT_AUTOCMD
 	    if (au_name != NULL)
 		apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
 						curbuf->b_fname, TRUE, curbuf);
-#endif
 	    if (res > 0 && (eap->cmdidx == CMD_cbuffer ||
 						eap->cmdidx == CMD_lbuffer))
 		qf_jump(qi, 0, 0, eap->forceit);  /* display first error */
@@ -5692,12 +5661,9 @@ ex_cexpr(exarg_T *eap)
 {
     typval_T	*tv;
     qf_info_T	*qi = &ql_info;
-#ifdef FEAT_AUTOCMD
     char_u	*au_name = NULL;
-#endif
     int		res;
 
-#ifdef FEAT_AUTOCMD
     switch (eap->cmdidx)
     {
 	case CMD_cexpr:	    au_name = (char_u *)"cexpr"; break;
@@ -5711,12 +5677,11 @@ ex_cexpr(exarg_T *eap)
     if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
 					       curbuf->b_fname, TRUE, curbuf))
     {
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	if (aborting())
 	    return;
-# endif
-    }
 #endif
+    }
 
     if (eap->cmdidx == CMD_lexpr
 	    || eap->cmdidx == CMD_lgetexpr
@@ -5742,11 +5707,9 @@ ex_cexpr(exarg_T *eap)
 				 NULL);
 	    if (res >= 0)
 		qf_list_changed(qi, qi->qf_curlist);
-#ifdef FEAT_AUTOCMD
 	    if (au_name != NULL)
 		apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
 						curbuf->b_fname, TRUE, curbuf);
-#endif
 	    if (res > 0 && (eap->cmdidx == CMD_cexpr ||
 						eap->cmdidx == CMD_lexpr))
 		qf_jump(qi, 0, 0, eap->forceit);  /* display first error */
@@ -5779,16 +5742,13 @@ ex_helpgrep(exarg_T *eap)
     qf_info_T	*save_qi;
     int		new_qi = FALSE;
     win_T	*wp;
-#ifdef FEAT_AUTOCMD
     char_u	*au_name =  NULL;
-#endif
 
 #ifdef FEAT_MULTI_LANG
     /* Check for a specified language */
     lang = check_help_lang(eap->arg);
 #endif
 
-#ifdef FEAT_AUTOCMD
     switch (eap->cmdidx)
     {
 	case CMD_helpgrep:  au_name = (char_u *)"helpgrep"; break;
@@ -5798,12 +5758,11 @@ ex_helpgrep(exarg_T *eap)
     if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name,
 					       curbuf->b_fname, TRUE, curbuf))
     {
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	if (aborting())
 	    return;
-# endif
-    }
 #endif
+    }
 
     /* Make 'cpoptions' empty, the 'l' flag should not be used here. */
     save_cpo = p_cpo;
@@ -5965,7 +5924,6 @@ ex_helpgrep(exarg_T *eap)
     qf_list_changed(qi, qi->qf_curlist);
     qf_update_buffer(qi, NULL);
 
-#ifdef FEAT_AUTOCMD
     if (au_name != NULL)
     {
 	apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
@@ -5974,7 +5932,6 @@ ex_helpgrep(exarg_T *eap)
 	    /* autocommands made "qi" invalid */
 	    return;
     }
-#endif
 
     /* Jump to first match. */
     if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
--- a/src/screen.c
+++ b/src/screen.c
@@ -8767,11 +8767,9 @@ screenalloc(int doclear)
     tabpage_T	    *tp;
     static int	    entered = FALSE;		/* avoid recursiveness */
     static int	    done_outofmem_msg = FALSE;	/* did outofmem message */
-#ifdef FEAT_AUTOCMD
     int		    retry_count = 0;
 
 retry:
-#endif
     /*
      * Allocation of the screen buffers is done only when the size changes and
      * when Rows and Columns have been set and we have started doing full
@@ -8823,10 +8821,8 @@ retry:
      */
     FOR_ALL_TAB_WINDOWS(tp, wp)
 	win_free_lsize(wp);
-#ifdef FEAT_AUTOCMD
     if (aucmd_win != NULL)
 	win_free_lsize(aucmd_win);
-#endif
 
     new_ScreenLines = (schar_T *)lalloc((long_u)(
 			      (Rows + 1) * Columns * sizeof(schar_T)), FALSE);
@@ -8859,11 +8855,9 @@ retry:
 	    goto give_up;
 	}
     }
-#ifdef FEAT_AUTOCMD
     if (aucmd_win != NULL && aucmd_win->w_lines == NULL
 					&& win_alloc_lines(aucmd_win) == FAIL)
 	outofmem = TRUE;
-#endif
 give_up:
 
 #ifdef FEAT_MBYTE
@@ -9032,7 +9026,6 @@ give_up:
     entered = FALSE;
     --RedrawingDisabled;
 
-#ifdef FEAT_AUTOCMD
     /*
      * Do not apply autocommands more than 3 times to avoid an endless loop
      * in case applying autocommands always changes Rows or Columns.
@@ -9044,7 +9037,6 @@ give_up:
 	 * jump back to check if we need to allocate the screen again. */
 	goto retry;
     }
-#endif
 }
 
     void
--- a/src/search.c
+++ b/src/search.c
@@ -97,10 +97,8 @@ static char_u	lastc_bytes[MB_MAXBYTES + 
 static int	lastc_bytelen = 1;	/* >1 for multi-byte char */
 #endif
 
-#if defined(FEAT_AUTOCMD) || defined(FEAT_EVAL) || defined(PROTO)
 /* copy of spats[], for keeping the search patterns while executing autocmds */
 static struct spat  saved_spats[2];
-#endif
 # ifdef FEAT_SEARCH_EXTRA
 /* copy of spats[RE_SEARCH], for keeping the search patterns while incremental
  * searching */
@@ -300,7 +298,6 @@ save_re_pat(int idx, char_u *pat, int ma
     }
 }
 
-#if defined(FEAT_AUTOCMD) || defined(FEAT_EVAL) || defined(PROTO)
 /*
  * Save the search patterns, so they can be restored later.
  * Used before/after executing autocommands and user functions.
@@ -318,10 +315,10 @@ save_search_patterns(void)
 	saved_spats[1] = spats[1];
 	if (spats[1].pat != NULL)
 	    saved_spats[1].pat = vim_strsave(spats[1].pat);
+#ifdef FEAT_SEARCH_EXTRA
 	saved_last_idx = last_idx;
-# ifdef FEAT_SEARCH_EXTRA
 	saved_no_hlsearch = no_hlsearch;
-# endif
+#endif
     }
 }
 
@@ -332,18 +329,17 @@ restore_search_patterns(void)
     {
 	vim_free(spats[0].pat);
 	spats[0] = saved_spats[0];
-# if defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 	set_vv_searchforward();
-# endif
+#endif
 	vim_free(spats[1].pat);
 	spats[1] = saved_spats[1];
+#ifdef FEAT_SEARCH_EXTRA
 	last_idx = saved_last_idx;
-# ifdef FEAT_SEARCH_EXTRA
 	SET_NO_HLSEARCH(saved_no_hlsearch);
-# endif
+#endif
     }
 }
-#endif
 
 #if defined(EXITFREE) || defined(PROTO)
     void
--- a/src/spell.c
+++ b/src/spell.c
@@ -1849,9 +1849,7 @@ spell_load_lang(char_u *lang)
     char_u	fname_enc[85];
     int		r;
     spelload_T	sl;
-#ifdef FEAT_AUTOCMD
     int		round;
-#endif
 
     /* Copy the language name to pass it to spell_load_cb() as a cookie.
      * It's truncated when an error is detected. */
@@ -1859,11 +1857,9 @@ spell_load_lang(char_u *lang)
     sl.sl_slang = NULL;
     sl.sl_nobreak = FALSE;
 
-#ifdef FEAT_AUTOCMD
     /* We may retry when no spell file is found for the language, an
      * autocommand may load it then. */
     for (round = 1; round <= 2; ++round)
-#endif
     {
 	/*
 	 * Find the first spell file for "lang" in 'runtimepath' and load it.
@@ -1889,17 +1885,13 @@ spell_load_lang(char_u *lang)
 									lang);
 	    r = do_in_runtimepath(fname_enc, 0, spell_load_cb, &sl);
 
-#ifdef FEAT_AUTOCMD
 	    if (r == FAIL && *sl.sl_lang != NUL && round == 1
 		    && apply_autocmds(EVENT_SPELLFILEMISSING, lang,
 					      curbuf->b_fname, FALSE, curbuf))
 		continue;
 	    break;
-#endif
-	}
-#ifdef FEAT_AUTOCMD
+	}
 	break;
-#endif
     }
 
     if (r == FAIL)
@@ -2348,11 +2340,9 @@ did_set_spelllang(win_T *wp)
     static int	recursive = FALSE;
     char_u	*ret_msg = NULL;
     char_u	*spl_copy;
-#ifdef FEAT_AUTOCMD
     bufref_T	bufref;
 
     set_bufref(&bufref, wp->w_buffer);
-#endif
 
     /* We don't want to do this recursively.  May happen when a language is
      * not available and the SpellFileMissing autocommand opens a new buffer
@@ -2449,7 +2439,6 @@ did_set_spelllang(win_T *wp)
 	    else
 	    {
 		spell_load_lang(lang);
-#ifdef FEAT_AUTOCMD
 		/* SpellFileMissing autocommands may do anything, including
 		 * destroying the buffer we are using... */
 		if (!bufref_valid(&bufref))
@@ -2457,7 +2446,6 @@ did_set_spelllang(win_T *wp)
 		    ret_msg = (char_u *)N_("E797: SpellFileMissing autocommand deleted buffer");
 		    goto theend;
 		}
-#endif
 	    }
 	}
 
--- a/src/structs.h
+++ b/src/structs.h
@@ -586,9 +586,7 @@ typedef struct
     int		lockmarks;		/* TRUE when ":lockmarks" was used */
     int		keeppatterns;		/* TRUE when ":keeppatterns" was used */
     int		noswapfile;		/* TRUE when ":noswapfile" was used */
-# ifdef FEAT_AUTOCMD
     char_u	*save_ei;		/* saved value of 'eventignore' */
-# endif
     regmatch_T	filter_regmatch;	/* set by :filter /pat/ */
     int		filter_force;		/* set for :filter! */
 } cmdmod_T;
@@ -1946,10 +1944,8 @@ struct file_buffer
     int		b_nwindows;	/* nr of windows open on this buffer */
 
     int		b_flags;	/* various BF_ flags */
-#ifdef FEAT_AUTOCMD
     int		b_locked;	/* Buffer is being closed or referenced, don't
 				   let autocommands wipe it out. */
-#endif
 
     /*
      * b_ffname has the full path of the file (NULL for no name).
@@ -1986,13 +1982,11 @@ struct file_buffer
 				   incremented for each change, also for undo */
 #define CHANGEDTICK(buf) ((buf)->b_ct_di.di_tv.vval.v_number)
 
-#ifdef FEAT_AUTOCMD
     varnumber_T	b_last_changedtick; /* b:changedtick when TextChanged or
 				       TextChangedI was last triggered. */
-# ifdef FEAT_INS_EXPAND
+#ifdef FEAT_INS_EXPAND
     varnumber_T	b_last_changedtick_pum; /* b:changedtick when TextChangedP was
 					   last triggered. */
-# endif
 #endif
 
     int		b_saving;	/* Set to TRUE if we are in the middle of
@@ -2171,9 +2165,7 @@ struct file_buffer
     char_u	*b_p_fenc;	/* 'fileencoding' */
 #endif
     char_u	*b_p_ff;	/* 'fileformat' */
-#ifdef FEAT_AUTOCMD
     char_u	*b_p_ft;	/* 'filetype' */
-#endif
     char_u	*b_p_fo;	/* 'formatoptions' */
     char_u	*b_p_flp;	/* 'formatlistpat' */
     int		b_p_inf;	/* 'infercase' */
@@ -2448,12 +2440,8 @@ struct diffblock_S
 #endif
 
 #define SNAP_HELP_IDX	0
-#ifdef FEAT_AUTOCMD
-# define SNAP_AUCMD_IDX 1
-# define SNAP_COUNT	2
-#else
-# define SNAP_COUNT	1
-#endif
+#define SNAP_AUCMD_IDX 1
+#define SNAP_COUNT	2
 
 /*
  * Tab pages point to the top frame of each tab page.
@@ -2642,10 +2630,8 @@ struct window_S
 
     win_T	*w_prev;	    /* link to previous window */
     win_T	*w_next;	    /* link to next window */
-#ifdef FEAT_AUTOCMD
     int		w_closing;	    /* window is being closed, don't let
 				       autocommands close it too. */
-#endif
 
     frame_T	*w_frame;	    /* frame containing this window */
 
@@ -2676,10 +2662,8 @@ struct window_S
      */
     linenr_T	w_topline;	    /* buffer line number of the line at the
 				       top of the window */
-#ifdef FEAT_AUTOCMD
     char	w_topline_was_set;  /* flag set to TRUE when topline is set,
 				       e.g. by winrestview() */
-#endif
 #ifdef FEAT_DIFF
     int		w_topfill;	    /* number of filler lines above w_topline */
     int		w_old_topfill;	    /* w_topfill at last redraw */
@@ -2973,10 +2957,8 @@ typedef struct oparg_S
     int		block_mode;	/* current operator is Visual block mode */
     colnr_T	start_vcol;	/* start col for block mode operator */
     colnr_T	end_vcol;	/* end col for block mode operator */
-#ifdef FEAT_AUTOCMD
     long	prev_opcount;	/* ca.opcount saved for K_CURSORHOLD */
     long	prev_count0;	/* ca.count0 saved for K_CURSORHOLD */
-#endif
 } oparg_T;
 
 /*
@@ -3160,18 +3142,16 @@ typedef int vimmenu_T;
 
 /*
  * Struct to save values in before executing autocommands for a buffer that is
- * not the current buffer.  Without FEAT_AUTOCMD only "curbuf" is remembered.
+ * not the current buffer.
  */
 typedef struct
 {
     buf_T	*save_curbuf;	/* saved curbuf */
-#ifdef FEAT_AUTOCMD
     int		use_aucmd_win;	/* using aucmd_win */
     win_T	*save_curwin;	/* saved curwin */
     win_T	*new_curwin;	/* new curwin */
     bufref_T	new_curbuf;	/* new curbuf */
     char_u	*globaldir;	/* saved value of globaldir */
-#endif
 } aco_save_T;
 
 /*
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -6420,11 +6420,9 @@ ex_ownsyntax(exarg_T *eap)
     if (old_value != NULL)
 	old_value = vim_strsave(old_value);
 
-#ifdef FEAT_AUTOCMD
     /* Apply the "syntax" autocommand event, this finds and loads the syntax
      * file. */
     apply_autocmds(EVENT_SYNTAX, eap->arg, curbuf->b_fname, TRUE, curbuf);
-#endif
 
     /* move value of b:current_syntax to w:current_syntax */
     new_value = get_var_value((char_u *)"b:current_syntax");
@@ -6995,10 +6993,8 @@ static char *(highlight_init_light[]) = 
     CENT("Conceal ctermbg=DarkGrey ctermfg=LightGrey",
 	 "Conceal ctermbg=DarkGrey ctermfg=LightGrey guibg=DarkGrey guifg=LightGrey"),
 #endif
-#ifdef FEAT_AUTOCMD
     CENT("MatchParen term=reverse ctermbg=Cyan",
 	 "MatchParen term=reverse ctermbg=Cyan guibg=Cyan"),
-#endif
 #ifdef FEAT_GUI
     "Normal gui=NONE",
 #endif
@@ -7089,10 +7085,8 @@ static char *(highlight_init_dark[]) = {
     CENT("ColorColumn term=reverse ctermbg=DarkRed",
 	 "ColorColumn term=reverse ctermbg=DarkRed guibg=DarkRed"),
 #endif
-#ifdef FEAT_AUTOCMD
     CENT("MatchParen term=reverse ctermbg=DarkCyan",
 	 "MatchParen term=reverse ctermbg=DarkCyan guibg=DarkCyan"),
-#endif
 #ifdef FEAT_CONCEAL
     CENT("Conceal ctermbg=DarkGrey ctermfg=LightGrey",
 	 "Conceal ctermbg=DarkGrey ctermfg=LightGrey guibg=DarkGrey guifg=LightGrey"),
@@ -7233,9 +7227,7 @@ load_colors(char_u *name)
 	sprintf((char *)buf, "colors/%s.vim", name);
 	retval = source_runtime(buf, DIP_START + DIP_OPT);
 	vim_free(buf);
-#ifdef FEAT_AUTOCMD
 	apply_autocmds(EVENT_COLORSCHEME, name, curbuf->b_fname, FALSE, curbuf);
-#endif
     }
     recursive = FALSE;
 
--- a/src/tag.c
+++ b/src/tag.c
@@ -1017,7 +1017,7 @@ do_tag(
 		}
 	    }
 
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
 	    /* Let the SwapExists event know what tag we are jumping to. */
 	    vim_snprintf((char *)IObuff, IOSIZE, ":ta %s\r", name);
 	    set_vim_var_string(VV_SWAPCOMMAND, IObuff, -1);
@@ -1028,7 +1028,7 @@ do_tag(
 	     */
 	    i = jumpto_tag(matches[cur_match], forceit, type != DT_CSCOPE);
 
-#ifdef FEAT_AUTOCMD
+#if defined(FEAT_EVAL)
 	    set_vim_var_string(VV_SWAPCOMMAND, NULL, -1);
 #endif
 
@@ -3174,11 +3174,7 @@ jumpto_tag(
      * file.  Also accept a file name for which there is a matching BufReadCmd
      * autocommand event (e.g., http://sys/file).
      */
-    if (mch_getperm(fname) < 0
-#ifdef FEAT_AUTOCMD
-	    && !has_autocmd(EVENT_BUFREADCMD, fname, NULL)
-#endif
-       )
+    if (mch_getperm(fname) < 0 && !has_autocmd(EVENT_BUFREADCMD, fname, NULL))
     {
 	retval = NOTAGFILE;
 	vim_free(nofile_fname);
--- a/src/term.c
+++ b/src/term.c
@@ -1985,7 +1985,6 @@ set_termname(char_u *term)
 	    scroll_region_reset();		/* In case Rows changed */
 	check_map_keycodes();	/* check mappings for terminal codes used */
 
-#ifdef FEAT_AUTOCMD
 	{
 	    bufref_T	old_curbuf;
 
@@ -2003,7 +2002,6 @@ set_termname(char_u *term)
 	    if (bufref_valid(&old_curbuf))
 		curbuf = old_curbuf.br_buf;
 	}
-#endif
     }
 
 #ifdef FEAT_TERMRESPONSE
@@ -4515,9 +4513,7 @@ check_termcode(
 
 			LOG_TR("Received U7 status");
 			u7_status = STATUS_GOT;
-# ifdef FEAT_AUTOCMD
 			did_cursorhold = TRUE;
-# endif
 			if (col == 2)
 			    aw = "single";
 			else if (col == 3)
@@ -4560,9 +4556,7 @@ check_termcode(
 
 		    LOG_TR("Received CRV response");
 		    crv_status = STATUS_GOT;
-# ifdef FEAT_AUTOCMD
 		    did_cursorhold = TRUE;
-# endif
 
 		    /* If this code starts with CSI, you can bet that the
 		     * terminal uses 8-bit codes. */
@@ -4702,10 +4696,8 @@ check_termcode(
 # ifdef FEAT_EVAL
 		    set_vim_var_string(VV_TERMRESPONSE, tp, slen);
 # endif
-# ifdef FEAT_AUTOCMD
 		    apply_autocmds(EVENT_TERMRESPONSE,
 						   NULL, NULL, FALSE, curbuf);
-# endif
 		    key_name[0] = (int)KS_EXTRA;
 		    key_name[1] = (int)KE_IGNORE;
 		}
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -38,6 +38,10 @@
  * in tl_scrollback are no longer used.
  *
  * TODO:
+ * - What to store in a session file?  Shell at the prompt would be OK to
+ *   restore, but others may not.  Open the window and let the user start the
+ *   command?  Also see #2650.
+ * - Adding WinBar to terminal window doesn't display, text isn't shifted down.
  * - When using 'termguicolors' still use the 16 ANSI colors as-is.  Helps for
  *   a job that uses 16 colors while Vim is using > 256.
  * - in GUI vertical split causes problems.  Cursor is flickering. (Hirohito
@@ -46,24 +50,20 @@
  * - after resizing windows overlap. (Boris Staletic, #2164)
  * - Redirecting output does not work on MS-Windows, Test_terminal_redir_file()
  *   is disabled.
+ * - if the job in the terminal does not support the mouse, we can use the
+ *   mouse in the Terminal window for copy/paste and scrolling.
  * - cursor blinks in terminal on widows with a timer. (xtal8, #2142)
- * - What to store in a session file?  Shell at the prompt would be OK to
- *   restore, but others may not.  Open the window and let the user start the
- *   command?  Also see #2650.
  * - When closing gvim with an active terminal buffer, the dialog suggests
  *   saving the buffer.  Should say something else. (Manas Thakur, #2215)
  *   Also: #2223
  * - Termdebug does not work when Vim build with mzscheme.  gdb hangs.
  * - MS-Windows GUI: WinBar has  tearoff item
- * - Adding WinBar to terminal window doesn't display, text isn't shifted down.
  * - MS-Windows GUI: still need to type a key after shell exits?  #1924
  * - After executing a shell command the status line isn't redraw.
  * - implement term_setsize()
  * - add test for giving error for invalid 'termsize' value.
  * - support minimal size when 'termsize' is "rows*cols".
  * - support minimal size when 'termsize' is empty?
- * - if the job in the terminal does not support the mouse, we can use the
- *   mouse in the Terminal window for copy/paste and scrolling.
  * - GUI: when using tabs, focus in terminal, click on tab does not work.
  * - GUI: when 'confirm' is set and trying to exit Vim, dialog offers to save
  *   changes to "!shell".
@@ -506,14 +506,12 @@ term_start(typval_T *argvar, jobopt_T *o
 	 * a deadlock if the job is waiting for Vim to read. */
 	channel_set_nonblock(term->tl_job->jv_channel, PART_IN);
 
-#ifdef FEAT_AUTOCMD
 	if (!opt->jo_hidden)
 	{
 	    ++curbuf->b_locked;
 	    apply_autocmds(EVENT_BUFWINENTER, NULL, NULL, FALSE, curbuf);
 	    --curbuf->b_locked;
 	}
-#endif
 
 	if (old_curbuf != NULL)
 	{
@@ -938,9 +936,7 @@ term_convert_key(term_T *term, int c, ch
 #ifdef FEAT_DND
 	case K_DROP:		return 0;
 #endif
-#ifdef FEAT_AUTOCMD
 	case K_CURSORHOLD:	return 0;
-#endif
 	case K_PS:		vterm_keyboard_start_paste(vterm);
 				other = TRUE;
 				break;
--- a/src/ui.c
+++ b/src/ui.c
@@ -3299,13 +3299,11 @@ ui_focus_change(
 	last_time = time(NULL);
     }
 
-#ifdef FEAT_AUTOCMD
     /*
      * Fire the focus gained/lost autocommand.
      */
     need_redraw |= apply_autocmds(in_focus ? EVENT_FOCUSGAINED
 				: EVENT_FOCUSLOST, NULL, NULL, FALSE, curbuf);
-#endif
 
     if (need_redraw)
     {
@@ -3339,7 +3337,7 @@ ui_focus_change(
 }
 #endif
 
-#if defined(FEAT_MBYTE) || defined(PROTO)
+#if defined(HAVE_INPUT_METHOD) || defined(PROTO)
 /*
  * Save current Input Method status to specified place.
  */
--- a/src/undo.c
+++ b/src/undo.c
@@ -424,7 +424,6 @@ u_savecommon(
 	term_change_in_curbuf();
 #endif
 
-#ifdef FEAT_AUTOCMD
 	/*
 	 * Saving text for undo means we are going to make a change.  Give a
 	 * warning for a read-only file before making the change, so that the
@@ -439,7 +438,6 @@ u_savecommon(
 	    EMSG(_("E881: Line count changed unexpectedly"));
 	    return FAIL;
 	}
-#endif
     }
 
 #ifdef U_DEBUG
@@ -2631,11 +2629,9 @@ u_undoredo(int undo)
     int		empty_buffer;		    /* buffer became empty */
     u_header_T	*curhead = curbuf->b_u_curhead;
 
-#ifdef FEAT_AUTOCMD
     /* Don't want autocommands using the undo structures here, they are
      * invalid till the end. */
     block_autocmds();
-#endif
 
 #ifdef U_DEBUG
     u_check(FALSE);
@@ -2664,9 +2660,7 @@ u_undoredo(int undo)
 	if (top > curbuf->b_ml.ml_line_count || top >= bot
 				      || bot > curbuf->b_ml.ml_line_count + 1)
 	{
-#ifdef FEAT_AUTOCMD
 	    unblock_autocmds();
-#endif
 	    IEMSG(_("E438: u_undo: line numbers wrong"));
 	    changed();		/* don't want UNCHANGED now */
 	    return;
@@ -2891,9 +2885,7 @@ u_undoredo(int undo)
      * the undone/redone change. */
     curbuf->b_u_time_cur = curhead->uh_time;
 
-#ifdef FEAT_AUTOCMD
     unblock_autocmds();
-#endif
 #ifdef U_DEBUG
     u_check(FALSE);
 #endif
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1372,7 +1372,6 @@ call_func(
 	    else
 		fp = find_func(rfname);
 
-#ifdef FEAT_AUTOCMD
 	    /* Trigger FuncUndefined event, may load the function. */
 	    if (fp == NULL
 		    && apply_autocmds(EVENT_FUNCUNDEFINED,
@@ -1382,7 +1381,6 @@ call_func(
 		/* executed an autocommand, search for the function again */
 		fp = find_func(rfname);
 	    }
-#endif
 	    /* Try loading a package. */
 	    if (fp == NULL && script_autoload(rfname, TRUE) && !aborting())
 	    {
--- a/src/version.c
+++ b/src/version.c
@@ -78,11 +78,7 @@ static char *(features[]) =
 #else
 	"-arabic",
 #endif
-#ifdef FEAT_AUTOCMD
 	"+autocmd",
-#else
-	"-autocmd",
-#endif
 #ifdef FEAT_AUTOSERVERNAME
 	"+autoservername",
 #else
@@ -779,6 +775,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1564,
+/**/
     1563,
 /**/
     1562,
--- a/src/vim.h
+++ b/src/vim.h
@@ -2118,6 +2118,20 @@ typedef enum {
 # define USE_MCH_ERRMSG
 #endif
 
+/* Whether IME is supported when XIM is not used. */
+# if defined(FEAT_MBYTE_IME) && \
+    (!defined(FEAT_GUI_W32) || !(defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)))
+# define IME_WITHOUT_XIM
+#endif
+
+#if defined(FEAT_MBYTE) && (defined(FEAT_XIM) \
+	|| defined(IME_WITHOUT_XIM) \
+	|| defined(FEAT_GUI_W32) \
+	|| defined(MACOS_CONVERT))
+/* im_set_active() is available */
+# define HAVE_INPUT_METHOD
+#endif
+
 #ifndef FEAT_MBYTE
 # define after_pathsep(b, p)	vim_ispathsep(*((p) - 1))
 # define transchar_byte(c)	transchar(c)
--- a/src/window.c
+++ b/src/window.c
@@ -1437,13 +1437,11 @@ make_windows(
     if (count > 1)
 	last_status(TRUE);
 
-#ifdef FEAT_AUTOCMD
     /*
      * Don't execute autocommands while creating the windows.  Must do that
      * when putting the buffers in the windows.
      */
     block_autocmds();
-#endif
 
     /* todo is number of windows left to create */
     for (todo = count - 1; todo > 0; --todo)
@@ -1461,9 +1459,7 @@ make_windows(
 		break;
 	}
 
-#ifdef FEAT_AUTOCMD
     unblock_autocmds();
-#endif
 
     /* return actual number of windows */
     return (count - todo);
@@ -2104,19 +2100,14 @@ close_windows(
     win_T	*wp;
     tabpage_T   *tp, *nexttp;
     int		h = tabline_height();
-#ifdef FEAT_AUTOCMD
     int		count = tabpage_index(NULL);
-#endif
 
     ++RedrawingDisabled;
 
     for (wp = firstwin; wp != NULL && !ONE_WINDOW; )
     {
 	if (wp->w_buffer == buf && (!keep_curwin || wp != curwin)
-#ifdef FEAT_AUTOCMD
-		&& !(wp->w_closing || wp->w_buffer->b_locked > 0)
-#endif
-		)
+		&& !(wp->w_closing || wp->w_buffer->b_locked > 0))
 	{
 	    if (win_close(wp, FALSE) == FAIL)
 		/* If closing the window fails give up, to avoid looping
@@ -2137,10 +2128,7 @@ close_windows(
 	if (tp != curtab)
 	    for (wp = tp->tp_firstwin; wp != NULL; wp = wp->w_next)
 		if (wp->w_buffer == buf
-#ifdef FEAT_AUTOCMD
-		    && !(wp->w_closing || wp->w_buffer->b_locked > 0)
-#endif
-		    )
+		    && !(wp->w_closing || wp->w_buffer->b_locked > 0))
 		{
 		    win_close_othertab(wp, FALSE, tp);
 
@@ -2153,10 +2141,8 @@ close_windows(
 
     --RedrawingDisabled;
 
-#ifdef FEAT_AUTOCMD
     if (count != tabpage_index(NULL))
 	apply_autocmds(EVENT_TABCLOSED, NULL, NULL, FALSE, curbuf);
-#endif
 
     redraw_tabline = TRUE;
     if (h != tabline_height())
@@ -2181,7 +2167,6 @@ last_window(void)
     int
 one_window(void)
 {
-#ifdef FEAT_AUTOCMD
     win_T	*wp;
     int		seen_one = FALSE;
 
@@ -2195,9 +2180,6 @@ one_window(void)
 	}
     }
     return TRUE;
-#else
-    return ONE_WINDOW;
-#endif
 }
 
 /*
@@ -2212,9 +2194,7 @@ close_last_window_tabpage(
 {
     if (ONE_WINDOW)
     {
-#ifdef FEAT_AUTOCMD
 	buf_T	*old_curbuf = curbuf;
-#endif
 
 	/*
 	 * Closing the last window in a tab page.  First go to another tab
@@ -2239,13 +2219,11 @@ close_last_window_tabpage(
 	}
 	/* Since goto_tabpage_tp above did not trigger *Enter autocommands, do
 	 * that now. */
-#ifdef FEAT_AUTOCMD
 	apply_autocmds(EVENT_TABCLOSED, NULL, NULL, FALSE, curbuf);
 	apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf);
 	apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
 	if (old_curbuf != curbuf)
 	    apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
-#endif
 	return TRUE;
     }
     return FALSE;
@@ -2262,9 +2240,7 @@ close_last_window_tabpage(
 win_close(win_T *win, int free_buf)
 {
     win_T	*wp;
-#ifdef FEAT_AUTOCMD
     int		other_buffer = FALSE;
-#endif
     int		close_curwin = FALSE;
     int		dir;
     int		help_window = FALSE;
@@ -2277,7 +2253,6 @@ win_close(win_T *win, int free_buf)
 	return FAIL;
     }
 
-#ifdef FEAT_AUTOCMD
     if (win->w_closing || (win->w_buffer != NULL
 					       && win->w_buffer->b_locked > 0))
 	return FAIL; /* window is already being closed */
@@ -2291,7 +2266,6 @@ win_close(win_T *win, int free_buf)
 	EMSG(_("E814: Cannot close window, only autocmd window would remain"));
 	return FAIL;
     }
-#endif
 
     /* When closing the last window in a tab page first go to another tab page
      * and then close the window and the tab page to avoid that curwin and
@@ -2306,7 +2280,6 @@ win_close(win_T *win, int free_buf)
     else
 	clear_snapshot(curtab, SNAP_HELP_IDX);
 
-#ifdef FEAT_AUTOCMD
     if (win == curwin)
     {
 	/*
@@ -2337,13 +2310,12 @@ win_close(win_T *win, int free_buf)
 	win->w_closing = FALSE;
 	if (last_window())
 	    return FAIL;
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	/* autocmds may abort script processing */
 	if (aborting())
 	    return FAIL;
-# endif
-    }
 #endif
+    }
 
 #ifdef FEAT_GUI
     /* Avoid trouble with scrollbars that are going to be deleted in
@@ -2366,14 +2338,10 @@ win_close(win_T *win, int free_buf)
 	bufref_T    bufref;
 
 	set_bufref(&bufref, curbuf);
-#ifdef FEAT_AUTOCMD
 	win->w_closing = TRUE;
-#endif
 	close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, TRUE);
-#ifdef FEAT_AUTOCMD
 	if (win_valid_any_tab(win))
 	    win->w_closing = FALSE;
-#endif
 	/* Make sure curbuf is valid. It can become invalid if 'bufhidden' is
 	 * "wipe". */
 	if (!bufref_valid(&bufref))
@@ -2455,11 +2423,9 @@ win_close(win_T *win, int free_buf)
     if (close_curwin)
     {
 	win_enter_ext(wp, FALSE, TRUE, FALSE, TRUE, TRUE);
-#ifdef FEAT_AUTOCMD
 	if (other_buffer)
 	    /* careful: after this wp and win may be invalid! */
 	    apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
-#endif
     }
 
     /*
@@ -2498,13 +2464,11 @@ win_close_othertab(win_T *win, int free_
     tabpage_T   *ptp = NULL;
     int		free_tp = FALSE;
 
-#ifdef FEAT_AUTOCMD
     /* Get here with win->w_buffer == NULL when win_close() detects the tab
      * page changed. */
     if (win->w_closing || (win->w_buffer != NULL
 					       && win->w_buffer->b_locked > 0))
 	return; /* window is already being closed */
-#endif
 
     if (win->w_buffer != NULL)
 	/* Close the link to the buffer. */
@@ -2586,13 +2550,11 @@ win_free_all(void)
     while (first_tabpage->tp_next != NULL)
 	tabpage_close(TRUE);
 
-# ifdef FEAT_AUTOCMD
     if (aucmd_win != NULL)
     {
 	(void)win_free_mem(aucmd_win, &dummy, NULL);
 	aucmd_win = NULL;
     }
-# endif
 
     while (firstwin != NULL)
 	(void)win_free_mem(firstwin, &dummy, NULL);
@@ -3331,11 +3293,7 @@ close_others(
 
     if (one_window())
     {
-	if (message
-#ifdef FEAT_AUTOCMD
-		    && !autocmd_busy
-#endif
-				    )
+	if (message && !autocmd_busy)
 	    MSG(_(m_onlyone));
 	return;
     }
@@ -3349,26 +3307,22 @@ close_others(
 
 	    /* Check if it's allowed to abandon this window */
 	    r = can_abandon(wp->w_buffer, forceit);
-#ifdef FEAT_AUTOCMD
 	    if (!win_valid(wp))		/* autocommands messed wp up */
 	    {
 		nextwp = firstwin;
 		continue;
 	    }
-#endif
 	    if (!r)
 	    {
 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
 		if (message && (p_confirm || cmdmod.confirm) && p_write)
 		{
 		    dialog_changed(wp->w_buffer, FALSE);
-# ifdef FEAT_AUTOCMD
 		    if (!win_valid(wp))		/* autocommands messed wp up */
 		    {
 			nextwp = firstwin;
 			continue;
 		    }
-# endif
 		}
 		if (bufIsChanged(wp->w_buffer))
 #endif
@@ -3443,7 +3397,6 @@ win_alloc_first(void)
     return OK;
 }
 
-#if defined(FEAT_AUTOCMD) || defined(PROTO)
 /*
  * Init "aucmd_win".  This can only be done after the first
  * window is fully initialized, thus it can't be in win_alloc_first().
@@ -3459,7 +3412,6 @@ win_alloc_aucmd_win(void)
 	new_frame(aucmd_win);
     }
 }
-#endif
 
 /*
  * Allocate the first window or the first window in a new tab page.
@@ -3663,12 +3615,10 @@ win_new_tabpage(int after)
 #endif
 
 	redraw_all_later(CLEAR);
-#ifdef FEAT_AUTOCMD
 	apply_autocmds(EVENT_WINNEW, NULL, NULL, FALSE, curbuf);
 	apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf);
 	apply_autocmds(EVENT_TABNEW, NULL, NULL, FALSE, curbuf);
 	apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
-#endif
 	return OK;
     }
 
@@ -3710,21 +3660,17 @@ make_tabpages(int maxcount)
     if (count > p_tpm)
 	count = p_tpm;
 
-#ifdef FEAT_AUTOCMD
     /*
      * Don't execute autocommands while creating the tab pages.  Must do that
      * when putting the buffers in the windows.
      */
     block_autocmds();
-#endif
 
     for (todo = count - 1; todo > 0; --todo)
 	if (win_new_tabpage(0) == FAIL)
 	    break;
 
-#ifdef FEAT_AUTOCMD
     unblock_autocmds();
-#endif
 
     /* return actual number of tab pages */
     return (count - todo);
@@ -3841,7 +3787,6 @@ leave_tabpage(
     tabpage_T	*tp = curtab;
 
     reset_VIsual_and_resel();	/* stop Visual mode */
-#ifdef FEAT_AUTOCMD
     if (trigger_leave_autocmds)
     {
 	if (new_curbuf != curbuf)
@@ -3857,7 +3802,6 @@ leave_tabpage(
 	if (curtab != tp)
 	    return FAIL;
     }
-#endif
 #if defined(FEAT_GUI)
     /* Remove the scrollbars.  They may be added back later. */
     if (gui.in_use)
@@ -3929,7 +3873,6 @@ enter_tabpage(
     gui_may_update_scrollbars();
 #endif
 
-#ifdef FEAT_AUTOCMD
     /* Apply autocommands after updating the display, when 'rows' and
      * 'columns' have been set correctly. */
     if (trigger_enter_autocmds)
@@ -3938,7 +3881,6 @@ enter_tabpage(
 	if (old_curbuf != curbuf)
 	    apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
     }
-#endif
 
     redraw_all_later(CLEAR);
 }
@@ -4131,10 +4073,8 @@ win_goto(win_T *wp)
 	text_locked_msg();
 	return;
     }
-#ifdef FEAT_AUTOCMD
     if (curbuf_locked())
 	return;
-#endif
 
     if (wp->w_buffer != curbuf)
 	reset_VIsual_and_resel();
@@ -4337,14 +4277,11 @@ win_enter_ext(
     int		trigger_enter_autocmds UNUSED,
     int		trigger_leave_autocmds UNUSED)
 {
-#ifdef FEAT_AUTOCMD
     int		other_buffer = FALSE;
-#endif
 
     if (wp == curwin && !curwin_invalid)	/* nothing to do */
 	return;
 
-#ifdef FEAT_AUTOCMD
     if (!curwin_invalid && trigger_leave_autocmds)
     {
 	/*
@@ -4360,13 +4297,12 @@ win_enter_ext(
 	apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf);
 	if (!win_valid(wp))
 	    return;
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
 	/* autocmds may abort script processing */
 	if (aborting())
 	    return;
-# endif
-    }
 #endif
+    }
 
     /* sync undo before leaving the current buffer */
     if (undo_sync && curbuf != wp->w_buffer)
@@ -4417,7 +4353,6 @@ win_enter_ext(
 	shorten_fnames(TRUE);
     }
 
-#ifdef FEAT_AUTOCMD
     if (trigger_new_autocmds)
 	apply_autocmds(EVENT_WINNEW, NULL, NULL, FALSE, curbuf);
     if (trigger_enter_autocmds)
@@ -4426,7 +4361,6 @@ win_enter_ext(
 	if (other_buffer)
 	    apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
     }
-#endif
 
 #ifdef FEAT_TITLE
     maketitle();
@@ -4544,12 +4478,11 @@ win_alloc(win_T *after UNUSED, int hidde
     init_var_dict(new_wp->w_vars, &new_wp->w_winvar, VAR_SCOPE);
 #endif
 
-#ifdef FEAT_AUTOCMD
     /* Don't execute autocommands while the window is not properly
      * initialized yet.  gui_create_scrollbar() may trigger a FocusGained
      * event. */
     block_autocmds();
-#endif
+
     /*
      * link the window in the window list
      */
@@ -4585,9 +4518,7 @@ win_alloc(win_T *after UNUSED, int hidde
 #ifdef FEAT_FOLDING
     foldInitWin(new_wp);
 #endif
-#ifdef FEAT_AUTOCMD
     unblock_autocmds();
-#endif
 #ifdef FEAT_SEARCH_EXTRA
     new_wp->w_match_head = NULL;
     new_wp->w_next_match_id = 4;
@@ -4614,11 +4545,9 @@ win_free(
     /* reduce the reference count to the argument list. */
     alist_unlink(wp->w_alist);
 
-#ifdef FEAT_AUTOCMD
     /* Don't execute autocommands while the window is halfway being deleted.
      * gui_mch_destroy_scrollbar() may trigger a FocusGained event. */
     block_autocmds();
-#endif
 
 #ifdef FEAT_LUA
     lua_window_free(wp);
@@ -4708,23 +4637,17 @@ win_free(
     vim_free(wp->w_p_cc_cols);
 #endif
 
-#ifdef FEAT_AUTOCMD
     if (wp != aucmd_win)
-#endif
 	win_remove(wp, tp);
-#ifdef FEAT_AUTOCMD
     if (autocmd_busy)
     {
 	wp->w_next = au_pending_free_win;
 	au_pending_free_win = wp;
     }
     else
-#endif
 	vim_free(wp);
 
-#ifdef FEAT_AUTOCMD
     unblock_autocmds();
-#endif
 }
 
 /*
@@ -6426,11 +6349,7 @@ only_one_window(void)
 # ifdef FEAT_QUICKFIX
 		    || wp->w_p_pvw
 # endif
-	     ) || wp == curwin)
-# ifdef FEAT_AUTOCMD
-		&& wp != aucmd_win
-# endif
-	   )
+	     ) || wp == curwin) && wp != aucmd_win)
 	    ++count;
     return (count <= 1);
 }
@@ -6613,9 +6532,7 @@ switch_win(
     tabpage_T	*tp,
     int		no_display)
 {
-# ifdef FEAT_AUTOCMD
     block_autocmds();
-# endif
     *save_curwin = curwin;
     if (tp != NULL)
     {
@@ -6667,9 +6584,7 @@ restore_win(
 	curwin = save_curwin;
 	curbuf = curwin->w_buffer;
     }
-# ifdef FEAT_AUTOCMD
     unblock_autocmds();
-# endif
 }
 
 /*
@@ -6679,9 +6594,7 @@ restore_win(
     void
 switch_buffer(bufref_T *save_curbuf, buf_T *buf)
 {
-# ifdef FEAT_AUTOCMD
     block_autocmds();
-# endif
     set_bufref(save_curbuf, curbuf);
     --curbuf->b_nwindows;
     curbuf = buf;
@@ -6695,9 +6608,7 @@ switch_buffer(bufref_T *save_curbuf, buf
     void
 restore_buffer(bufref_T *save_curbuf)
 {
-# ifdef FEAT_AUTOCMD
     unblock_autocmds();
-# endif
     /* Check for valid buffer, just in case. */
     if (bufref_valid(save_curbuf))
     {