updated for version 7.0024
diff --git a/src/Makefile b/src/Makefile
index 72f0cb8..4a676c2 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -122,7 +122,7 @@
 #		make installruntime	only installs the Vim help and
 #							runtime files
 #		make installlinks	only installs the Vim binary links
-#		make installhelplinks	only installs the Vim manpage links
+#		make installmanlinks	only installs the Vim manpage links
 #		make installmacros	only installs the Vim macros
 #		make installtutor	only installs the Vim tutor
 #		make installtools	only installs xxd
@@ -848,8 +848,8 @@
 #		directories.  This directory must exist.
 #DESTDIR  = ~/pkg/vim
 
-### Location of man pages
-MANSUBDIR = $(MANDIR)/man1
+### Directory of the man pages
+MAN1DIR = /man1
 
 ### Vim version (adjusted by a script)
 VIMMAJOR = 7
@@ -1067,7 +1067,7 @@
 KDE_LIBS2	=
 KDE_INSTALL     = install_normal
 KDE_TARGETS	= installglinks installkdeicons
-KDE_MAN_TARGETS = installghelplinks
+KDE_MAN_TARGETS = yes
 KDE_TESTTARGET  = gui
 
 ### GTK GUI
@@ -1083,7 +1083,7 @@
 GTK_LIBS2	= $(GTK_LIBNAME)
 GTK_INSTALL     = install_normal
 GTK_TARGETS	= installglinks
-GTK_MAN_TARGETS = installghelplinks
+GTK_MAN_TARGETS = yes
 GTK_TESTTARGET  = gui
 
 ### Motif GUI
@@ -1097,7 +1097,7 @@
 MOTIF_LIBS2	= $(MOTIF_LIBNAME) -lXt
 MOTIF_INSTALL   = install_normal
 MOTIF_TARGETS	= installglinks
-MOTIF_MAN_TARGETS = installghelplinks
+MOTIF_MAN_TARGETS = yes
 MOTIF_TESTTARGET = gui
 
 ### Athena GUI
@@ -1126,7 +1126,7 @@
 ATHENA_LIBS2	= -lXt
 ATHENA_INSTALL  = install_normal
 ATHENA_TARGETS	= installglinks
-ATHENA_MAN_TARGETS = installghelplinks
+ATHENA_MAN_TARGETS = yes
 ATHENA_TESTTARGET = gui
 
 ### neXtaw GUI
@@ -1143,7 +1143,7 @@
 NEXTAW_LIBS2	= -lXt
 NEXTAW_INSTALL  =  install_normal
 NEXTAW_TARGETS	=  installglinks
-NEXTAW_MAN_TARGETS = installghelplinks
+NEXTAW_MAN_TARGETS = yes
 NEXTAW_TESTTARGET = gui
 
 ### (J)  Sun OpenWindows 3.2 (SunOS 4.1.x) or earlier that produce these ld
@@ -1167,7 +1167,7 @@
 BEOSGUI_LIBS2	=
 BEOSGUI_INSTALL = install_normal
 BEOSGUI_TARGETS	= installglinks
-BEOSGUI_MAN_TARGETS = installghelplinks
+BEOSGUI_MAN_TARGETS = yes
 BEOSGUI_TESTTARGET = gui
 
 # PHOTON GUI
@@ -1180,7 +1180,7 @@
 PHOTONGUI_LIBS2	=
 PHOTONGUI_INSTALL = install_normal
 PHOTONGUI_TARGETS = installglinks
-PHOTONGUI_MAN_TARGETS = installghelplinks
+PHOTONGUI_MAN_TARGETS = yes
 PHOTONGUI_TESTTARGET = gui
 
 # CARBON GUI
@@ -1277,7 +1277,9 @@
 DEST_TUTOR = $(DESTDIR)$(TUTORSUBLOC)
 DEST_SCRIPT = $(DESTDIR)$(SCRIPTLOC)
 DEST_PRINT = $(DESTDIR)$(PRINTSUBLOC)
-DEST_MAN = $(DESTDIR)$(MANSUBDIR)
+DEST_MAN_TOP = $(DESTDIR)$(MANDIR)
+DEST_MAN = $(DEST_MAN_TOP)$(MAN1DIR)
+DEST_MAN_IT = $(DEST_MAN_TOP)/it$(MAN1DIR)
 
 #	     BASIC_SRC: files that are always used
 #	       GUI_SRC: extra GUI files for current configuration
@@ -1661,7 +1663,7 @@
 
 install_normal: installvim installtools install-languages install-icons
 
-installvim: installvimbin installruntime installlinks installhelplinks installmacros installtutor
+installvim: installvimbin installruntime installlinks installmanlinks installmacros installtutor
 
 installvimbin: $(VIMTARGET) $(DESTDIR)$(exec_prefix) $(DEST_BIN)
 	-if test -f $(DEST_BIN)/$(VIMTARGET); then \
@@ -1674,37 +1676,16 @@
 # may create a link to the new executable from /usr/bin/vi
 	-$(LINKIT)
 
-# install the help files; first adjust the contents for the location
-installruntime: $(HELPSOURCE)/vim.1 $(DEST_MAN) $(DEST_VIM) $(DEST_RT) \
+# Long list of arguments for the shell script that installs the manual pages
+# for one language.
+INSTALLMANARGS = $(VIMLOC) $(SCRIPTLOC) $(VIMRCLOC) $(HELPSOURCE) $(MANMOD) \
+		$(VIMNAME) $(VIMDIFFNAME) $(EVIMNAME)
+
+# install the help files; first adjust the contents for the final location
+installruntime: $(HELPSOURCE)/vim.1 $(DEST_VIM) $(DEST_RT) \
 		$(DEST_HELP) $(DEST_PRINT) $(DEST_COL) $(DEST_SYN) $(DEST_IND) \
 		$(DEST_FTP) $(DEST_PLUG) $(DEST_TUTOR) $(DEST_COMP)
-	@echo generating $(DEST_MAN)/$(VIMNAME).1
-	@sed -e s+/usr/local/lib/vim+$(VIMLOC)+ \
-		-e s+$(VIMLOC)/doc+$(HELPSUBLOC)+ \
-		-e s+$(VIMLOC)/syntax+$(SYNSUBLOC)+ \
-		-e s+$(VIMLOC)/tutor+$(TUTORSUBLOC)+ \
-		-e s+$(VIMLOC)/vimrc+$(VIMRCLOC)/vimrc+ \
-		-e s+$(VIMLOC)/gvimrc+$(VIMRCLOC)/gvimrc+ \
-		-e s+$(VIMLOC)/menu.vim+$(SCRIPTLOC)/menu.vim+ \
-		-e s+$(VIMLOC)/bugreport.vim+$(SCRIPTLOC)/bugreport.vim+ \
-		-e s+$(VIMLOC)/filetype.vim+$(SCRIPTLOC)/filetype.vim+ \
-		-e s+$(VIMLOC)/ftoff.vim+$(SCRIPTLOC)/ftoff.vim+ \
-		-e s+$(VIMLOC)/scripts.vim+$(SCRIPTLOC)/scripts.vim+ \
-		-e s+$(VIMLOC)/optwin.vim+$(SCRIPTLOC)/optwin.vim+ \
-		-e 's+$(VIMLOC)/\*.ps+$(SCRIPTLOC)/\*.ps+' \
-		$(HELPSOURCE)/vim.1 > $(DEST_MAN)/$(VIMNAME).1
-	chmod $(MANMOD) $(DEST_MAN)/$(VIMNAME).1
-	@echo generating $(DEST_MAN)/$(VIMNAME)tutor.1
-	@sed -e s+/usr/local/lib/vim+$(VIMLOC)+ \
-		-e s+$(VIMLOC)/tutor+$(TUTORSUBLOC)+ \
-		$(HELPSOURCE)/vimtutor.1 > $(DEST_MAN)/$(VIMNAME)tutor.1
-	chmod $(MANMOD) $(DEST_MAN)/$(VIMNAME)tutor.1
-	$(INSTALL_DATA)  $(HELPSOURCE)/vimdiff.1 $(DEST_MAN)/$(VIMDIFFNAME).1
-	chmod $(MANMOD) $(DEST_MAN)/$(VIMDIFFNAME).1
-	@echo generating $(DEST_MAN)/$(EVIMNAME).1
-	@sed -e s+/usr/local/lib/vim+$(SCRIPTLOC)+ \
-		$(HELPSOURCE)/evim.1 > $(DEST_MAN)/$(EVIMNAME).1
-	chmod $(MANMOD) $(DEST_MAN)/$(EVIMNAME).1
+	-$(SHELL) ./installman.sh install $(DEST_MAN) "" $(INSTALLMANARGS)
 	@echo generating help tags
 # Generate the help tags with ":helptags" to handle all languages.
 	-@cd $(HELPSOURCE); $(MAKE) VIMEXE=$(DEST_BIN)/$(VIMTARGET) vimtags
@@ -1794,7 +1775,7 @@
 	chmod $(HELPMOD) $(DEST_TUTOR)/*
 
 # install helper program xxd
-installtools: $(TOOLS) $(DESTDIR)$(exec_prefix) $(DEST_BIN) $(DEST_MAN) \
+installtools: $(TOOLS) $(DESTDIR)$(exec_prefix) $(DEST_BIN) \
 		$(TOOLSSOURCE) $(DEST_VIM) $(DEST_RT) $(DEST_TOOLS)
 	if test -f $(DEST_BIN)/xxd$(EXEEXT); then \
 	  mv -f $(DEST_BIN)/xxd$(EXEEXT) $(DEST_BIN)/xxd.rm; \
@@ -1803,8 +1784,8 @@
 	$(INSTALL_PROG) xxd/xxd$(EXEEXT) $(DEST_BIN)
 	$(STRIP) $(DEST_BIN)/xxd$(EXEEXT)
 	chmod $(BINMOD) $(DEST_BIN)/xxd$(EXEEXT)
-	$(INSTALL_DATA) $(HELPSOURCE)/xxd.1 $(DEST_MAN)
-	chmod $(MANMOD) $(DEST_MAN)/xxd.1
+	-$(SHELL) ./installman.sh xxd $(DEST_MAN) "" $(INSTALLMANARGS)
+	-$(SHELL) ./installman.sh xxd $(DEST_MAN_IT) "-it" $(INSTALLMANARGS)
 # install the runtime tools
 	$(INSTALL_DATA_R) $(TOOLSSOURCE)/* $(DEST_TOOLS)
 # When using CVS some CVS directories might have been copied.
@@ -1822,6 +1803,9 @@
 
 # install the language specific files, if they were unpacked
 install-languages: languages $(DEST_LANG) $(DEST_KMAP)
+	-$(SHELL) ./installman.sh install $(DEST_MAN_IT) "-it" $(INSTALLMANARGS)
+	-$(SHELL) ./installml.sh install "$(GUI_MAN_TARGETS)" \
+		$(DEST_MAN_IT) $(INSTALLMLARGS)
 	if test -n "$(MAKEMO)" -a -f $(PODIR)/Makefile; then \
 	   cd $(PODIR); $(MAKE) prefix=$(DESTDIR)$(prefix) LOCALEDIR=$(DEST_LANG) \
 	   INSTALL_DATA=$(INSTALL_DATA) FILEMOD=$(FILEMOD) install; \
@@ -1877,7 +1861,8 @@
 	@echo You need to unpack the runtime archive before running "make install".
 	test -f error
 
-$(DESTDIR)$(exec_prefix) $(DEST_BIN) $(DEST_MAN) $(DEST_VIM) $(DEST_RT) $(DEST_HELP) \
+$(DESTDIR)$(exec_prefix) $(DEST_BIN) \
+		$(DEST_VIM) $(DEST_RT) $(DEST_HELP) \
 		$(DEST_PRINT) $(DEST_COL) $(DEST_SYN) $(DEST_IND) $(DEST_FTP) \
 		$(DEST_LANG) $(DEST_KMAP) $(DEST_COMP) \
 		$(DEST_MACRO) $(DEST_TOOLS) $(DEST_TUTOR) $(DEST_PLUG):
@@ -1942,69 +1927,36 @@
 
 # create links for the manual pages with various names to vim.	This is only
 # done when the links (or manpages with the same name) don't exist yet.
-installhelplinks: $(GUI_MAN_TARGETS) \
-			$(DEST_MAN)/$(EXNAME).1 \
-			$(DEST_MAN)/$(VIEWNAME).1 \
-			$(DEST_MAN)/$(RVIMNAME).1 \
-			$(DEST_MAN)/$(RVIEWNAME).1
 
-installghelplinks: $(DEST_MAN)/$(GVIMNAME).1 \
-			$(DEST_MAN)/$(GVIEWNAME).1 \
-			$(DEST_MAN)/$(RGVIMNAME).1 \
-			$(DEST_MAN)/$(RGVIEWNAME).1 \
-			$(DEST_MAN)/$(GVIMDIFFNAME).1 \
-			$(DEST_MAN)/$(EVIEWNAME).1
+INSTALLMLARGS = $(VIMNAME) $(VIMDIFFNAME) $(EVIMNAME) \
+		$(EXNAME) $(VIEWNAME) $(RVIMNAME) $(RVIEWNAME) \
+		$(GVIMNAME) $(GVIEWNAME) $(RGVIMNAME) $(RGVIEWNAME) \
+		$(GVIMDIFFNAME) $(EVIEWNAME)
 
-$(DEST_MAN)/$(EXNAME).1:
-	cd $(DEST_MAN); ln -s $(VIMNAME).1 $(EXNAME).1
-
-$(DEST_MAN)/$(VIEWNAME).1:
-	cd $(DEST_MAN); ln -s $(VIMNAME).1 $(VIEWNAME).1
-
-$(DEST_MAN)/$(GVIMNAME).1:
-	cd $(DEST_MAN); ln -s $(VIMNAME).1 $(GVIMNAME).1
-
-$(DEST_MAN)/$(GVIEWNAME).1:
-	cd $(DEST_MAN); ln -s $(VIMNAME).1 $(GVIEWNAME).1
-
-$(DEST_MAN)/$(RVIMNAME).1:
-	cd $(DEST_MAN); ln -s $(VIMNAME).1 $(RVIMNAME).1
-
-$(DEST_MAN)/$(RVIEWNAME).1:
-	cd $(DEST_MAN); ln -s $(VIMNAME).1 $(RVIEWNAME).1
-
-$(DEST_MAN)/$(RGVIMNAME).1:
-	cd $(DEST_MAN); ln -s $(VIMNAME).1 $(RGVIMNAME).1
-
-$(DEST_MAN)/$(RGVIEWNAME).1:
-	cd $(DEST_MAN); ln -s $(VIMNAME).1 $(RGVIEWNAME).1
-
-$(DEST_MAN)/$(GVIMDIFFNAME).1:
-	cd $(DEST_MAN); ln -s $(VIMDIFFNAME).1 $(GVIMDIFFNAME).1
-
-$(DEST_MAN)/$(EVIEWNAME).1:
-	cd $(DEST_MAN); ln -s $(EVIMNAME).1 $(EVIEWNAME).1
+installmanlinks: 
+	-$(SHELL) ./installml.sh install "$(GUI_MAN_TARGETS)" \
+		$(DEST_MAN) $(INSTALLMLARGS)
 
 uninstall: uninstall_runtime
 	-rm -f $(DEST_BIN)/$(VIMTARGET)
-	-rm -f $(DEST_MAN)/$(VIMNAME).1 $(DEST_MAN)/$(VIMNAME)tutor.1
 	-rm -f $(DEST_BIN)/vimtutor
-	-rm -f $(DEST_BIN)/xxd$(EXEEXT) $(DEST_MAN)/xxd.1
 	-rm -f $(DEST_BIN)/$(EXTARGET) $(DEST_BIN)/$(VIEWTARGET)
 	-rm -f $(DEST_BIN)/$(GVIMTARGET) $(DEST_BIN)/$(GVIEWTARGET)
 	-rm -f $(DEST_BIN)/$(RVIMTARGET) $(DEST_BIN)/$(RVIEWTARGET)
 	-rm -f $(DEST_BIN)/$(RGVIMTARGET) $(DEST_BIN)/$(RGVIEWTARGET)
 	-rm -f $(DEST_BIN)/$(VIMDIFFTARGET) $(DEST_BIN)/$(GVIMDIFFTARGET)
 	-rm -f $(DEST_BIN)/$(EVIMTARGET) $(DEST_BIN)/$(EVIEWTARGET)
-	-rm -f $(DEST_MAN)/$(EXNAME).1 $(DEST_MAN)/$(VIEWNAME).1
-	-rm -f $(DEST_MAN)/$(GVIMNAME).1 $(DEST_MAN)/$(GVIEWNAME).1
-	-rm -f $(DEST_MAN)/$(RVIMNAME).1 $(DEST_MAN)/$(RVIEWNAME).1
-	-rm -f $(DEST_MAN)/$(RGVIMNAME).1 $(DEST_MAN)/$(RGVIEWNAME).1
-	-rm -f $(DEST_MAN)/$(VIMDIFFNAME).1 $(DEST_MAN)/$(GVIMDIFFNAME).1
-	-rm -f $(DEST_MAN)/$(EVIMNAME).1 $(DEST_MAN)/$(EVIEWNAME).1
+	-rm -f $(DEST_BIN)/xxd$(EXEEXT)
 
 # Note: the "rmdir" will fail if any files were added after "make install"
 uninstall_runtime:
+	-$(SHELL) ./installman.sh uninstall $(DEST_MAN) "" $(INSTALLMANARGS)
+	-$(SHELL) ./installman.sh uninstall $(DEST_MAN_IT) "-it" $(INSTALLMANARGS)
+	-$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
+		$(DEST_MAN) $(INSTALLMLARGS)
+	-$(SHELL) ./installml.sh uninstall "$(GUI_MAN_TARGETS)" \
+		$(DEST_MAN_IT) $(INSTALLMLARGS)
+	-rm -f $(DEST_MAN)/xxd.1 $(DEST_MAN_IT)/xxd.1
 	-rm -f $(DEST_HELP)/*.txt $(DEST_HELP)/tags $(DEST_HELP)/*.pl
 	-rm -f $(DEST_HELP)/*.??x $(DEST_HELP)/tags-??
 	-rm -f $(SYS_MENU_FILE) $(SYS_SYNMENU_FILE) $(SYS_DELMENU_FILE)
diff --git a/src/buffer.c b/src/buffer.c
index 19dcb59..4003b9c 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -588,6 +588,9 @@
 #ifdef FEAT_RUBY
     ruby_buffer_free(buf);
 #endif
+#ifdef FEAT_AUTOCMD
+    aubuflocal_remove(buf);
+#endif
     vim_free(buf);
 }
 
diff --git a/src/charset.c b/src/charset.c
index 336eec6..4560a96 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -816,11 +816,8 @@
     colnr_T	col = 0;
     char_u	*s;
 
-    for (s = p; *s != NUL && (len == MAXCOL || s < p + len); )
-    {
+    for (s = p; *s != NUL && (len == MAXCOL || s < p + len); mb_ptr_adv(s))
 	col += win_lbr_chartabsize(wp, s, col, NULL);
-	mb_ptr_adv(s);
-    }
     return (int)col;
 }
 
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index c78c643..7a176e0 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -5216,6 +5216,28 @@
     }
 }
 
+/*
+ * ":exusage"
+ */
+/*ARGSUSED*/
+    void
+ex_exusage(eap)
+    exarg_T	*eap;
+{
+    do_cmdline_cmd((char_u *)"help ex-cmd-index");
+}
+
+/*
+ * ":viusage"
+ */
+/*ARGSUSED*/
+    void
+ex_viusage(eap)
+    exarg_T	*eap;
+{
+    do_cmdline_cmd((char_u *)"help normal-index");
+}
+
 #if defined(FEAT_EX_EXTRA) || defined(PROTO)
 static void helptags_one __ARGS((char_u *dir, char_u *ext, char_u *lang));
 
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index 5d0f081..f59d018 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -352,6 +352,8 @@
 			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
 EX(CMD_exit,		"exit",		ex_exit,
 			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN),
+EX(CMD_exusage,		"exusage",	ex_exusage,
+			TRLBAR),
 EX(CMD_file,		"file",		ex_file,
 			RANGE|NOTADR|ZEROR|BANG|FILE1|TRLBAR),
 EX(CMD_files,		"files",	buflist_list,
@@ -836,6 +838,8 @@
 			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR),
 EX(CMD_view,		"view",		ex_edit,
 			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR),
+EX(CMD_viusage,		"viusage",	ex_viusage,
+			TRLBAR),
 EX(CMD_vmap,		"vmap",		ex_map,
 			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
 EX(CMD_vmapclear,	"vmapclear",	ex_mapclear,
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 6c919ff..715bf99 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -2152,7 +2152,7 @@
 fopen_noinh_readbin(filename)
     char    *filename;
 {
-    int	fd_tmp = open(filename, O_RDONLY | O_BINARY | O_NOINHERIT);
+    int	fd_tmp = mch_open(filename, O_RDONLY | O_BINARY | O_NOINHERIT, 0);
 
     if (fd_tmp == -1)
 	return NULL;
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index a668c99..82f90dd 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -3174,7 +3174,7 @@
 	xp->xp_pattern = skipwhite(arg);
 	for (p = xp->xp_pattern; *p; )
 	{
-	    if (*p == '\\' && p[1])
+	    if (*p == '\\' && p[1] != NUL)
 		++p;
 #ifdef SPACE_IN_FILENAME
 	    else if (vim_iswhite(*p) && (!(argt & NOSPC) || usefilter))
@@ -3440,7 +3440,10 @@
 	case CMD_tjump:
 	case CMD_stjump:
 	case CMD_ptjump:
-	    xp->xp_context = EXPAND_TAGS;
+	    if (*p_wop != NUL)
+		xp->xp_context = EXPAND_TAGS_LISTFILES;
+	    else
+		xp->xp_context = EXPAND_TAGS;
 	    xp->xp_pattern = arg;
 	    break;
 	case CMD_augroup:
diff --git a/src/fileio.c b/src/fileio.c
index d33718d..98d9cff 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -6590,6 +6590,7 @@
     char	    last;		/* last pattern for apply_autocmds() */
     AutoCmd	    *cmds;		/* list of commands to do */
     struct AutoPat  *next;		/* next AutoPat in AutoPat list */
+    int		    buflocal_nr;	/* !=0 for buffer-local AutoPat */
 } AutoPat;
 
 static struct event_name
@@ -6686,8 +6687,13 @@
     char_u	*sfname;	/* sfname to match with */
     char_u	*tail;		/* tail of fname */
     EVENT_T	event;		/* current event */
+    int		arg_bufnr;	/* initially equal to <abuf>, set to zero when
+				   buf is deleted */
+    struct AutoPatCmd   *next;	/* chain of active apc-s for auto-invalidation*/
 } AutoPatCmd;
 
+AutoPatCmd *active_apc_list = NULL;	/* stack of active autocommands */
+
 /*
  * augroups stores a list of autocmd group names.
  */
@@ -6721,6 +6727,7 @@
 static int apply_autocmds_group __ARGS((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 __ARGS((AutoPatCmd *apc, int stop_at_last));
 
+
 static EVENT_T	last_event;
 static int	last_group;
 
@@ -6795,6 +6802,7 @@
 {
     vim_free(ap->pat);
     ap->pat = NULL;
+    ap->buflocal_nr = -1;
     au_need_clean = TRUE;
 }
 
@@ -6869,6 +6877,39 @@
 }
 
 /*
+ * Called when buffer is freed, to remove/invalidate related buffer-local
+ * autocmds.
+ */
+    void
+aubuflocal_remove(buf)
+    buf_T	*buf;
+{
+    AutoPat	*ap;
+    EVENT_T	event;
+    AutoPatCmd	*apc;
+
+    /* invalidate currently executing autocommands */
+    for (apc = active_apc_list; apc; apc = apc->next)
+	if (buf->b_fnum == apc->arg_bufnr)
+	    apc->arg_bufnr = 0;
+
+    /* invalidate buflocals looping through events */
+    for (event = (EVENT_T)0; (int)event < (int)NUM_EVENTS;
+					    event = (EVENT_T)((int)event + 1))
+	/* loop over all autocommand patterns */
+	for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
+	    if (ap->buflocal_nr == buf->b_fnum)
+	    {
+		au_remove_pat(ap);
+		if (p_verbose >= 6)
+		    smsg((char_u *)
+			    _("auto-removing autocommand: %s <buffer=%d>"),
+					   event_nr2name(event), buf->b_fnum);
+	    }
+    au_cleanup();
+}
+
+/*
  * Add an autocmd group name.
  * Return it's ID.  Returns AUGROUP_ERROR (< 0) for error.
  */
@@ -7292,6 +7333,9 @@
     int		findgroup;
     int		allgroups;
     int		patlen;
+    int	        is_buflocal;
+    int		buflocal_nr;
+    char_u	buflocal_pat[25];	/* for "<buffer=X>" */
 
     if (group == AUGROUP_ALL)
 	findgroup = current_augroup;
@@ -7339,6 +7383,39 @@
 	patlen = (int)(endpat - pat);
 
 	/*
+	 * detect special <buflocal[=X]> buffer-local patterns
+	 */
+	is_buflocal = FALSE;
+	buflocal_nr = 0;
+
+	if (patlen >= 7 && STRNCMP(pat, "<buffer", 7) == 0
+						    && pat[patlen - 1] == '>')
+	{
+	    /* Error will be printed only for addition. printing and removing
+	     * will proceed silently. */
+	    is_buflocal = TRUE;
+	    if (patlen == 8)
+		buflocal_nr = curbuf->b_fnum;
+	    else if (patlen > 9 && pat[7] == '=')
+	    {
+		/* <buffer=abuf> */
+		if (patlen == 13 && STRNICMP(pat, "<buffer=abuf>", 13))
+		    buflocal_nr = autocmd_bufnr;
+		/* <buffer=123> */
+		else if (skipdigits(pat + 8) == pat + patlen - 1)
+		    buflocal_nr = atoi((char *)pat + 8);
+	    }
+	}
+
+	if (is_buflocal)
+	{
+	    /* normalize pat into standard "<buffer>#N" form */
+	    sprintf((char *)buflocal_pat, "<buffer=%d>", buflocal_nr);
+	    pat = buflocal_pat;			/* can modify pat and patlen */
+	    patlen = STRLEN(buflocal_pat);	/*   but not endpat */
+	}
+
+	/*
 	 * Find AutoPat entries with this pattern.
 	 */
 	prev_ap = &first_autopat[(int)event];
@@ -7351,7 +7428,9 @@
 		 *   not specified and it's the current group, or a group was
 		 *   not specified and we are listing
 		 * - the length of the pattern matches
-		 * - the pattern matches
+		 * - the pattern matches.
+		 * For <buffer[=X]>, this condition works because we normalize
+		 * all buffer-local patterns.
 		 */
 		if ((allgroups || ap->group == findgroup)
 			&& ap->patlen == patlen
@@ -7374,7 +7453,7 @@
 		    }
 
 		    /*
-		     * Show autocmd's for this autopat
+		     * Show autocmd's for this autopat, or buflocals <buffer=X>
 		     */
 		    else if (*cmd == NUL)
 			show_autocmd(ap, event);
@@ -7401,6 +7480,15 @@
 	     */
 	    if (ap == NULL)
 	    {
+		/* refuse to add buffer-local ap if buffer number is invalid */
+		if (is_buflocal && (buflocal_nr == 0
+				      || buflist_findnr(buflocal_nr) == NULL))
+		{
+		    EMSGN(_("E680: <buffer=%d>: invalid buffer number "),
+								 buflocal_nr);
+		    return FAIL;
+		}
+
 		ap = (AutoPat *)alloc((unsigned)sizeof(AutoPat));
 		if (ap == NULL)
 		    return FAIL;
@@ -7411,13 +7499,23 @@
 		    vim_free(ap);
 		    return FAIL;
 		}
-		ap->reg_pat = file_pat_to_reg_pat(pat, endpat,
-						       &ap->allow_dirs, TRUE);
-		if (ap->reg_pat == NULL)
+
+		if (is_buflocal)
 		{
-		    vim_free(ap->pat);
-		    vim_free(ap);
-		    return FAIL;
+		    ap->buflocal_nr = buflocal_nr;
+		    ap->reg_pat = NULL;
+		}
+		else
+		{
+		    ap->buflocal_nr = 0;
+		    ap->reg_pat = file_pat_to_reg_pat(pat, endpat,
+							 &ap->allow_dirs, TRUE);
+		    if (ap->reg_pat == NULL)
+		    {
+			vim_free(ap->pat);
+			vim_free(ap);
+			return FAIL;
+		    }
 		}
 		ap->cmds = NULL;
 		*prev_ap = ap;
@@ -7786,14 +7884,14 @@
      * autocommands are blocked.
      */
     if (first_autopat[(int)event] == NULL || autocmd_block > 0)
-	return retval;
+	goto BYPASS_AU;
 
     /*
      * When autocommands are busy, new autocommands are only executed when
      * explicitly enabled with the "nested" flag.
      */
     if (autocmd_busy && !(force || autocmd_nested))
-	return retval;
+	goto BYPASS_AU;
 
 #ifdef FEAT_EVAL
     /*
@@ -7801,20 +7899,20 @@
      * occurred or an exception was thrown but not caught.
      */
     if (aborting())
-	return retval;
+	goto BYPASS_AU;
 #endif
 
     /*
      * FileChangedShell never nests, because it can create an endless loop.
      */
     if (filechangeshell_busy && event == EVENT_FILECHANGEDSHELL)
-	return retval;
+	goto BYPASS_AU;
 
     /*
      * Ignore events in 'eventignore'.
      */
     if (event_ignored(event))
-	return retval;
+	goto BYPASS_AU;
 
     /*
      * Allow nesting of autocommands, but restrict the depth, because it's
@@ -7823,7 +7921,7 @@
     if (nesting == 10)
     {
 	EMSG(_("E218: autocommand nesting too deep"));
-	return retval;
+	goto BYPASS_AU;
     }
 
     /*
@@ -7834,7 +7932,7 @@
 		&& (event == EVENT_WINENTER || event == EVENT_BUFENTER))
 	    || (autocmd_no_leave
 		&& (event == EVENT_WINLEAVE || event == EVENT_BUFLEAVE)))
-	return retval;
+	goto BYPASS_AU;
 
     /*
      * Save the autocmd_* variables and info about the current buffer.
@@ -7904,7 +8002,7 @@
 	sfname = vim_strsave(fname);
 	/* Don't try expanding FileType, Syntax or WindowID. */
 	if (event == EVENT_FILETYPE || event == EVENT_SYNTAX
-		|| event == EVENT_REMOTEREPLY)
+						|| event == EVENT_REMOTEREPLY)
 	    fname = vim_strsave(fname);
 	else
 	    fname = FullName_save(fname, FALSE);
@@ -7912,7 +8010,8 @@
     if (fname == NULL)	    /* out of memory */
     {
 	vim_free(sfname);
-	return FALSE;
+	retval = FALSE;
+	goto BYPASS_AU;
     }
 
 #ifdef BACKSLASH_IN_FILENAME
@@ -7983,11 +8082,17 @@
     patcmd.sfname = sfname;
     patcmd.tail = tail;
     patcmd.event = event;
+    patcmd.arg_bufnr = autocmd_bufnr;
+    patcmd.next = NULL;
     auto_next_pat(&patcmd, FALSE);
 
     /* found one, start executing the autocommands */
     if (patcmd.curpat != NULL)
     {
+	/* add to active_apc_list */
+	patcmd.next = active_apc_list;
+	active_apc_list = &patcmd;
+
 #ifdef FEAT_EVAL
 	/* set v:cmdarg (only when there is a matching pattern) */
 	save_cmdbang = get_vim_var_nr(VV_CMDBANG);
@@ -8015,6 +8120,9 @@
 	    set_vim_var_nr(VV_CMDBANG, save_cmdbang);
 	}
 #endif
+	/* delete from active_apc_list */
+	if (active_apc_list == &patcmd)	    /* just in case */
+	    active_apc_list = patcmd.next;
     }
 
     --RedrawingDisabled;
@@ -8065,6 +8173,13 @@
     }
 
     au_cleanup();	/* may really delete removed patterns/commands now */
+
+BYPASS_AU:
+    /* When wiping out a buffer make sure all its buffer-local autocommands
+     * are deleted. */
+    if (event == EVENT_BUFWIPEOUT && buf != NULL)
+	aubuflocal_remove(buf);
+
     return retval;
 }
 
@@ -8089,12 +8204,16 @@
 	apc->curpat = NULL;
 
 	/* only use a pattern when it has not been removed, has commands and
-	 * the group matches */
+	 * the group matches. For buffer-local autocommands only check the
+	 * buffer number. */
 	if (ap->pat != NULL && ap->cmds != NULL
 		&& (apc->group == AUGROUP_ALL || apc->group == ap->group))
 	{
-	    if (match_file_pat(ap->reg_pat, apc->fname, apc->sfname, apc->tail,
-							      ap->allow_dirs))
+	    /* execution-condition */
+	    if (ap->buflocal_nr == 0
+		    ? (match_file_pat(ap->reg_pat, apc->fname, apc->sfname,
+						   apc->tail, ap->allow_dirs))
+		    : ap->buflocal_nr == apc->arg_bufnr)
 	    {
 		name = event_nr2name(apc->event);
 		s = _("%s Auto commands for \"%s\"");
@@ -8191,11 +8310,14 @@
 
 /*
  * Return TRUE if there is a matching autocommand for "fname".
+ * To account for buffer-local autocommands, function needs to know
+ * in which buffer the file will be opened.
  */
     int
-has_autocmd(event, sfname)
+has_autocmd(event, sfname, buf)
     EVENT_T	event;
     char_u	*sfname;
+    buf_T       *buf;
 {
     AutoPat	*ap;
     char_u	*fname;
@@ -8219,8 +8341,11 @@
 
     for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
 	if (ap->pat != NULL && ap->cmds != NULL
-		&& match_file_pat(ap->reg_pat, fname, sfname, tail,
-							      ap->allow_dirs))
+            && (ap->buflocal_nr == 0
+		? match_file_pat(ap->reg_pat, fname, sfname, tail,
+							       ap->allow_dirs)
+                : buf != NULL && ap->buflocal_nr == buf->b_fnum
+	   ))
 	{
 	    retval = TRUE;
 	    break;
@@ -8327,7 +8452,9 @@
 
 /*
  * Return TRUE if an autocommand is defined for "event" and "pattern".
- * "pattern" can be NULL to accept any pattern.
+ * "pattern" can be NULL to accept any pattern. Buffer-local patterns
+ * <buffer> or <buffer=N> are accepted.
+ * Used for exists("#Event#pat")
  */
     int
 au_exists(name, name_end, pattern)
@@ -8339,6 +8466,7 @@
     char_u	*p;
     EVENT_T	event;
     AutoPat	*ap;
+    buf_T	*buflocal_buf = NULL;
 
     /* find the index (enum) for the event name */
     event_name = vim_strnsave(name, (int)(name_end - name));
@@ -8360,15 +8488,24 @@
     if (pattern == NULL)
 	return TRUE;
 
+    /* if pattern is "<buffer>", special handling is needed which uses curbuf */
+    /* for pattern "<buffer=N>, fnamecmp() will work fine */
+    if (STRICMP(pattern, "<buffer>") == 0)
+	buflocal_buf = curbuf;
+
     /* Check if there is an autocommand with the given pattern. */
     for ( ; ap != NULL; ap = ap->next)
-	/* only use a pattern when it has not been removed and has commands */
+	/* only use a pattern when it has not been removed and has commands. */
+	/* For buffer-local autocommands, fnamecmp() works fine. */
 	if (ap->pat != NULL && ap->cmds != NULL
-					   && fnamecmp(ap->pat, pattern) == 0)
+	    && (buflocal_buf == NULL
+		 ? fnamecmp(ap->pat, pattern) == 0
+		 : ap->buflocal_nr == buflocal_buf->b_fnum))
 	    return TRUE;
 
     return FALSE;
 }
+
 #endif	/* FEAT_AUTOCMD */
 
 #if defined(FEAT_AUTOCMD) || defined(FEAT_WILDIGN) || defined(PROTO)
diff --git a/src/gui_gtk.c b/src/gui_gtk.c
index e5b4259..4e4c1d9 100644
--- a/src/gui_gtk.c
+++ b/src/gui_gtk.c
@@ -2014,15 +2014,17 @@
     if (array != NULL)
     {
 	array[count++] = (char *)button_string;
-	for (p = button_string; *p != NUL; mb_ptr_adv(p))
+	for (p = button_string; *p != NUL; )
 	{
 	    if (*p == DLG_BUTTON_SEP)
 	    {
-		*p = NUL;
-		array[count++] = (char *)p + 1;
+		*p++ = NUL;
+		array[count++] = (char *)p;
 	    }
 	    else if (*p == DLG_HOTKEY_CHAR)
-		*p = '_';
+		*p++ = '_';
+	    else
+		mb_ptr_adv(p);
 	}
 	array[count] = NULL; /* currently not relied upon, but doesn't hurt */
     }
diff --git a/src/installman.sh b/src/installman.sh
new file mode 100755
index 0000000..b49d267
--- /dev/null
+++ b/src/installman.sh
@@ -0,0 +1,108 @@
+#! /bin/sh
+# installman.sh --- install or uninstall manpages for Vim
+#
+# arguments:
+# 1  what: "install", "uninstall" or "xxd"
+# 2  target directory                      e.g., "/usr/local/man/it/man1"
+# 3  language addition			   e.g., "" or "-it"
+# 4  vim location as used in manual pages  e.g., "/usr/local/share/vim"
+# 5  runtime dir for menu.vim et al.       e.g., "/usr/local/share/vim/vim70"
+# 6  runtime dir for global vimrc file     e.g., "/usr/local/share/vim"
+# 7  source dir for help files             e.g., "../runtime/doc"
+# 8  mode bits for manpages                e.g., "644"
+# 9  vim exe name                          e.g., "vim"
+# 10 name of vimdiff exe                   e.g., "vimdiff"
+# 11 name of evim exe                      e.g., "evim"
+
+errstatus=0
+
+what=$1
+destdir=$2
+langadd=$3
+vimloc=$4
+scriptloc=$5
+vimrcloc=$6
+helpsource=$7
+manmod=$8
+exename=$9
+vimdiffname=${10}
+evimname=${11}
+
+helpsubloc=$scriptloc/doc
+synsubloc=$scriptloc/syntax
+tutorsubloc=$scriptloc/tutor
+
+if test $what = "install" -o $what = "xxd"; then
+   if test ! -d $destdir; then
+      echo creating $destdir
+      ./mkinstalldirs $destdir
+   fi
+fi
+
+if test $what = "install"; then
+   # vim.1
+   echo installing $destdir/$exename.1
+   sed -e s+/usr/local/lib/vim+$vimloc+ \
+	   -e s+$vimloc/doc+$helpsubloc+ \
+	   -e s+$vimloc/syntax+$synsubloc+ \
+	   -e s+$vimloc/tutor+$tutorsubloc+ \
+	   -e s+$vimloc/vimrc+$vimrcloc/vimrc+ \
+	   -e s+$vimloc/gvimrc+$vimrcloc/gvimrc+ \
+	   -e s+$vimloc/menu.vim+$scriptloc/menu.vim+ \
+	   -e s+$vimloc/bugreport.vim+$scriptloc/bugreport.vim+ \
+	   -e s+$vimloc/filetype.vim+$scriptloc/filetype.vim+ \
+	   -e s+$vimloc/ftoff.vim+$scriptloc/ftoff.vim+ \
+	   -e s+$vimloc/scripts.vim+$scriptloc/scripts.vim+ \
+	   -e s+$vimloc/optwin.vim+$scriptloc/optwin.vim+ \
+	   -e 's+$vimloc/\*.ps+$scriptloc/\*.ps+' \
+	   $helpsource/vim$langadd.1 > $destdir/$exename.1
+   chmod $manmod $destdir/$exename.1
+
+   # vimtutor.1
+   echo installing $destdir/$exename""tutor.1
+   sed -e s+/usr/local/lib/vim+$vimloc+ \
+	   -e s+$vimloc/tutor+$tutorsubloc+ \
+	   $helpsource/vimtutor$langadd.1 > $destdir/$exename""tutor.1
+   chmod $manmod $destdir/$exename""tutor.1
+
+   # vimdiff.1
+   echo installing $destdir/$vimdiffname.1
+   cp $helpsource/vimdiff$langadd.1 $destdir/$vimdiffname.1
+   chmod $manmod $destdir/$vimdiffname.1
+
+   # evim.1
+   echo installing $destdir/$evimname.1
+   sed -e s+/usr/local/lib/vim+$vimloc+ \
+	   $helpsource/evim$langadd.1 > $destdir/$evimname.1
+   chmod $manmod $destdir/$evimname.1
+fi
+
+if test $what = "uninstall"; then
+   echo Checking for Vim manual pages in $destdir...
+   if test -r $destdir/$exename.1; then
+      echo deleting $destdir/$exename.1
+      rm -f $destdir/$exename.1
+   fi
+   if test -r $destdir/$exename""tutor.1; then
+      echo deleting $destdir/$exename""tutor.1
+      rm -f $destdir/$exename""tutor.1
+   fi
+   if test -r $destdir/$vimdiffname.1; then
+      echo deleting $destdir/$vimdiffname.1
+      rm -f $destdir/$vimdiffname.1
+   fi
+   if test -r $destdir/$evimname.1; then
+      echo deleting $destdir/$evimname.1
+      rm -f $destdir/$evimname.1
+   fi
+fi
+
+if test $what = "xxd"; then
+   echo installing $destdir/xxd.1
+   cp $helpsource/xxd$langadd.1 $destdir/xxd.1
+   chmod $manmod $destdir/xxd.1
+fi
+
+exit $errstatus
+
+# vim: set sw=3 :
diff --git a/src/installml.sh b/src/installml.sh
new file mode 100644
index 0000000..5907b26
--- /dev/null
+++ b/src/installml.sh
@@ -0,0 +1,162 @@
+#! /bin/sh
+# installml.sh --- install or uninstall manpage links for Vim
+#
+# arguments:
+# 1  what: "install" or "uninstall"
+# 2  also do GUI pages: "yes" or ""
+# 3  target directory                e.g., "/usr/local/man/it/man1"
+# 4  vim exe name                    e.g., "vim"
+# 5  vimdiff exe name                e.g., "vimdiff"
+# 6  evim exe name                   e.g., "evim"
+# 7  ex exe name                     e.g., "ex"
+# 8  view exe name                   e.g., "view"
+# 9  rvim exe name                   e.g., "rvim"
+# 10 rview exe name                  e.g., "rview"
+# 11 gvim exe name                   e.g., "gvim"
+# 12 gview exe name                  e.g., "gview"
+# 13 rgvim exe name                  e.g., "rgvim"
+# 14 rgview exe name                 e.g., "rgview"
+# 15 gvimdiff exe name               e.g., "gvimdiff"
+# 16 eview exe name                  e.g., "eview"
+
+errstatus=0
+
+what=$1
+gui=$2
+destdir=$3
+vimname=$4
+vimdiffname=$5
+evimname=$6
+exname=$7
+viewname=$8
+rvimname=$9
+rviewname=${10}
+gvimname=${11}
+gviewname=${12}
+rgvimname=${13}
+rgviewname=${14}
+gvimdiffname=${15}
+eviewname=${16}
+
+if test $what = "install"; then
+   if test ! -d $destdir; then
+      echo creating $destdir
+      ./mkinstalldirs $destdir
+   fi
+
+   # ex
+   if test ! -e $destdir/$exname.1; then
+      echo creating link $destdir/$exname.1
+      cd $destdir; ln -s $vimname.1 $exname.1
+   fi
+
+   # view
+   if test ! -e $destdir/$viewname.1; then
+      echo creating link $destdir/$viewname.1
+      cd $destdir; ln -s $vimname.1 $viewname.1
+   fi
+
+   # rvim
+   if test ! -e $destdir/$rvimname.1; then
+      echo creating link $destdir/$rvimname.1
+      cd $destdir; ln -s $vimname.1 $rvimname.1
+   fi
+
+   # rview
+   if test ! -e $destdir/$rviewname.1; then
+      echo creating link $destdir/$rviewname.1
+      cd $destdir; ln -s $vimname.1 $rviewname.1
+   fi
+
+   # GUI targets are optional
+   if test "$gui" = "yes"; then
+      # gvim
+      if test ! -e $destdir/$gvimname.1; then
+	 echo creating link $destdir/$gvimname.1
+	 cd $destdir; ln -s $vimname.1 $gvimname.1
+      fi
+
+      # gview
+      if test ! -e $destdir/$gviewname.1; then
+	 echo creating link $destdir/$gviewname.1
+	 cd $destdir; ln -s $vimname.1 $gviewname.1
+      fi
+
+      # rgvim
+      if test ! -e $destdir/$rgvimname.1; then
+	 echo creating link $destdir/$rgvimname.1
+	 cd $destdir; ln -s $vimname.1 $rgvimname.1
+      fi
+
+      # rgview
+      if test ! -e $destdir/$rgviewname.1; then
+	 echo creating link $destdir/$rgviewname.1
+	 cd $destdir; ln -s $vimname.1 $rgviewname.1
+      fi
+
+      # gvimdiff
+      if test ! -e $destdir/$gvimdiffname.1; then
+	 echo creating link $destdir/$gvimdiffname.1
+	 cd $destdir; ln -s $vimdiffname.1 $gvimdiffname.1
+      fi
+
+      # eview
+      if test ! -e $destdir/$eviewname.1; then
+	 echo creating link $destdir/$eviewname.1
+	 cd $destdir; ln -s $evimname.1 $eviewname.1
+      fi
+   fi
+fi
+
+if test $what = "uninstall"; then
+   echo Checking for Vim manual page links in $destdir...
+
+   if test -L $destdir/$exname.1; then
+      echo deleting $destdir/$exname.1
+      rm -f $destdir/$exname.1
+   fi
+   if test -L $destdir/$viewname.1; then
+      echo deleting $destdir/$viewname.1
+      rm -f $destdir/$viewname.1
+   fi
+   if test -L $destdir/$rvimname.1; then
+      echo deleting $destdir/$rvimname.1
+      rm -f $destdir/$rvimname.1
+   fi
+   if test -L $destdir/$rviewname.1; then
+      echo deleting $destdir/$rviewname.1
+      rm -f $destdir/$rviewname.1
+   fi
+
+   # GUI targets are optional
+   if test "$gui" = "yes"; then
+      if test -L $destdir/$gvimname.1; then
+	 echo deleting $destdir/$gvimname.1
+	 rm -f $destdir/$gvimname.1
+      fi
+      if test -L $destdir/$gviewname.1; then
+	 echo deleting $destdir/$gviewname.1
+	 rm -f $destdir/$gviewname.1
+      fi
+      if test -L $destdir/$rgvimname.1; then
+	 echo deleting $destdir/$rgvimname.1
+	 rm -f $destdir/$rgvimname.1
+      fi
+      if test -L $destdir/$rgviewname.1; then
+	 echo deleting $destdir/$rgviewname.1
+	 rm -f $destdir/$rgviewname.1
+      fi
+      if test -L $destdir/$gvimdiffname.1; then
+	 echo deleting $destdir/$gvimdiffname.1
+	 rm -f $destdir/$gvimdiffname.1
+      fi
+      if test -L $destdir/$eviewname.1; then
+	 echo deleting $destdir/$eviewname.1
+	 rm -f $destdir/$eviewname.1
+      fi
+   fi
+fi
+
+exit $errstatus
+
+# vim: set sw=3 :
diff --git a/src/main.c b/src/main.c
index 1335970..b35aaf9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -3113,13 +3113,13 @@
     for (i = 0; i < filec; i++)
     {
 	/* On Unix the shell has already expanded the wildcards, don't want to
-	 * do it again in the Vim server.  On MS-Windows only need to escape a
-	 * space. */
+	 * do it again in the Vim server.  On MS-Windows only escape
+	 * non-wildcard characters. */
 	p = vim_strsave_escaped((char_u *)filev[i],
 #ifdef UNIX
 		PATH_ESC_CHARS
 #else
-		(char_u *)" "
+		(char_u *)" \t%#"
 #endif
 		);
 	if (p == NULL)
diff --git a/src/normal.c b/src/normal.c
index 83759b7..9d0d8a9 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -7342,7 +7342,11 @@
 	    {
 		i = curwin->w_leftcol + W_WIDTH(curwin) - col_off - 1;
 		coladvance((colnr_T)i);
-		curwin->w_set_curswant = TRUE;
+
+		/* Make sure we stick in this column. */
+		validate_virtcol();
+		curwin->w_curswant = curwin->w_virtcol;
+		curwin->w_set_curswant = FALSE;
 	    }
 	}
 	break;
diff --git a/src/option.c b/src/option.c
index 6b59683..3cb91a4 100644
--- a/src/option.c
+++ b/src/option.c
@@ -118,6 +118,7 @@
     , PV_SCBIND
     , PV_SCROLL
     , PV_SI
+    , PV_STL
     , PV_SN
     , PV_STS
     , PV_SUA
@@ -2024,7 +2025,7 @@
 			    {(char_u *)TRUE, (char_u *)0L}},
     {"statusline"  ,"stl",  P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT,
 #ifdef FEAT_STL_OPT
-			    (char_u *)&p_stl, PV_NONE,
+			    (char_u *)&p_stl, OPT_BOTH(PV_STL),
 #else
 			    (char_u *)NULL, PV_NONE,
 #endif
@@ -2315,6 +2316,15 @@
     {"wildmode",    "wim",  P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
 			    (char_u *)&p_wim, PV_NONE,
 			    {(char_u *)"full", (char_u *)0L}},
+    {"wildoptions", "wop",  P_STRING|P_VI_DEF,
+#ifdef FEAT_CMDL_COMPL
+			    (char_u *)&p_wop, PV_NONE,
+			    {(char_u *)"", (char_u *)0L}
+#else
+			    (char_u *)NULL, PV_NONE,
+			    {(char_u *)NULL, (char_u *)0L}
+#endif
+			    },
     {"winaltkeys",  "wak",  P_STRING|P_VI_DEF,
 #ifdef FEAT_WAK
 			    (char_u *)&p_wak, PV_NONE,
@@ -2465,6 +2475,9 @@
 static char *(p_bg_values[]) = {"light", "dark", NULL};
 static char *(p_nf_values[]) = {"octal", "hex", "alpha", NULL};
 static char *(p_ff_values[]) = {FF_UNIX, FF_DOS, FF_MAC, NULL};
+#ifdef FEAT_CMDL_COMPL
+static char *(p_wop_values[]) = {"tagfile", NULL};
+#endif
 #ifdef FEAT_WAK
 static char *(p_wak_values[]) = {"yes", "menu", "no", NULL};
 #endif
@@ -4909,6 +4922,15 @@
 	    errmsg = e_invarg;
     }
 
+#ifdef FEAT_CMDL_COMPL
+    /* 'wildoptions' */
+    else if (varp == &p_wop)
+    {
+	if (check_opt_strings(p_wop, p_wop_values, TRUE) != OK)
+	    errmsg = e_invarg;
+    }
+#endif
+
 #ifdef FEAT_WAK
     /* 'winaltkeys' */
     else if (varp == &p_wak)
@@ -5563,7 +5585,7 @@
 
 #ifdef FEAT_STL_OPT
     /* 'statusline' or 'rulerformat' */
-    else if (varp == &p_stl || varp == &p_ruf)
+    else if (gvarp == &p_stl || varp == &p_ruf)
     {
 	int wid;
 
@@ -5583,7 +5605,7 @@
 	}
 	else
 	    errmsg = check_stl_option(s);
-	if (varp == &(p_ruf) && errmsg == NULL)
+	if (varp == &p_ruf && errmsg == NULL)
 	    comp_col();
     }
 #endif
@@ -7915,6 +7937,9 @@
 	    case OPT_BOTH(PV_DICT): return (char_u *)&(curbuf->b_p_dict);
 	    case OPT_BOTH(PV_TSR):  return (char_u *)&(curbuf->b_p_tsr);
 #endif
+#ifdef FEAT_STL_OPT
+	    case OPT_BOTH(PV_STL):  return (char_u *)&(curwin->w_p_stl);
+#endif
 	}
 	return NULL; /* "cannot happen" */
     }
@@ -7967,6 +7992,10 @@
 	case OPT_BOTH(PV_EFM):	return *curbuf->b_p_efm != NUL
 				    ? (char_u *)&(curbuf->b_p_efm) : p->var;
 #endif
+#ifdef FEAT_STL_OPT
+	case OPT_BOTH(PV_STL):  return *curwin->w_p_stl != NUL
+				    ? (char_u *)&(curwin->w_p_stl) : p->var;
+#endif
 
 #ifdef FEAT_ARABIC
 	case PV_ARAB:	return (char_u *)&(curwin->w_p_arab);
@@ -8168,6 +8197,9 @@
     to->wo_rl  = from->wo_rl;
     to->wo_rlc = vim_strsave(from->wo_rlc);
 #endif
+#ifdef FEAT_STL_OPT
+    to->wo_stl = vim_strsave(from->wo_stl);
+#endif
     to->wo_wrap = from->wo_wrap;
 #ifdef FEAT_LINEBREAK
     to->wo_lbr = from->wo_lbr;
@@ -8226,6 +8258,9 @@
 #ifdef FEAT_RIGHTLEFT
     check_string_option(&wop->wo_rlc);
 #endif
+#ifdef FEAT_STL_OPT
+    check_string_option(&wop->wo_stl);
+#endif
 }
 
 /*
@@ -8248,6 +8283,9 @@
 #ifdef FEAT_RIGHTLEFT
     clear_string_option(&wop->wo_rlc);
 #endif
+#ifdef FEAT_STL_OPT
+    clear_string_option(&wop->wo_stl);
+#endif
 }
 
 /*
diff --git a/src/option.h b/src/option.h
index 8ef8536..e6f0c0b 100644
--- a/src/option.h
+++ b/src/option.h
@@ -785,6 +785,9 @@
 #endif
 EXTERN long	p_verbose;	/* 'verbose' */
 EXTERN int	p_warn;		/* 'warn' */
+#ifdef FEAT_CMDL_COMPL
+EXTERN char_u	*p_wop;		/* 'wildoptions' */
+#endif
 #if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(LINT) \
 	|| defined (FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_KDE)
 #define FEAT_WAK
diff --git a/src/proto/ex_cmds.pro b/src/proto/ex_cmds.pro
index f63fcda..815063a 100644
--- a/src/proto/ex_cmds.pro
+++ b/src/proto/ex_cmds.pro
@@ -42,6 +42,8 @@
 int help_heuristic __ARGS((char_u *matched_string, int offset, int wrong_case));
 int find_help_tags __ARGS((char_u *arg, int *num_matches, char_u ***matches, int keep_lang));
 void fix_help_buffer __ARGS((void));
+void ex_exusage __ARGS((exarg_T *eap));
+void ex_viusage __ARGS((exarg_T *eap));
 void ex_helptags __ARGS((exarg_T *eap));
 void ex_sign __ARGS((exarg_T *eap));
 void sign_gui_started __ARGS((void));
diff --git a/src/proto/fileio.pro b/src/proto/fileio.pro
index a2fb7b4..c3a872c 100644
--- a/src/proto/fileio.pro
+++ b/src/proto/fileio.pro
@@ -20,6 +20,7 @@
 void vim_deltempdir __ARGS((void));
 char_u *vim_tempname __ARGS((int extra_char));
 void forward_slash __ARGS((char_u *fname));
+void aubuflocal_remove __ARGS((buf_T *buf));
 void do_augroup __ARGS((char_u *arg, int del_group));
 int check_ei __ARGS((void));
 void do_autocmd __ARGS((char_u *arg, int forceit));
@@ -30,7 +31,7 @@
 int apply_autocmds __ARGS((EVENT_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf));
 int apply_autocmds_retval __ARGS((EVENT_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, int *retval));
 int has_cursorhold __ARGS((void));
-int has_autocmd __ARGS((EVENT_T event, char_u *sfname));
+int has_autocmd __ARGS((EVENT_T event, char_u *sfname, buf_T *buf));
 char_u *get_augroup_name __ARGS((expand_T *xp, int idx));
 char_u *set_context_in_autocmd __ARGS((expand_T *xp, char_u *arg, int doautocmd));
 char_u *get_event_name __ARGS((expand_T *xp, int idx));
diff --git a/src/screen.c b/src/screen.c
index abd9be7..e986a22 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -700,7 +700,7 @@
 	    || p_ru
 # endif
 # ifdef FEAT_STL_OPT
-	    || *p_stl
+	    || *p_stl != NUL || *wp->w_p_stl != NUL
 # endif
 	    )
 	win_redr_status(wp);
@@ -5040,7 +5040,7 @@
 	wp->w_redr_status = TRUE;
     }
 #ifdef FEAT_STL_OPT
-    else if (*p_stl)
+    else if (*p_stl != NUL || *wp->w_p_stl != NUL)
     {
 	/* redraw custom status line */
 	win_redr_custom(wp, FALSE);
@@ -5276,7 +5276,10 @@
     row = W_WINROW(wp) + wp->w_height;
     fillchar = fillchar_status(&attr, wp == curwin);
     maxwidth = W_WIDTH(wp);
-    p = p_stl;
+    if (*wp->w_p_stl != NUL)
+	p = wp->w_p_stl;
+    else
+	p = p_stl;
     if (Ruler)
     {
 	p = p_ruf;
@@ -8214,7 +8217,7 @@
     if (!always && !redrawing())
 	return;
 #if defined(FEAT_STL_OPT) && defined(FEAT_WINDOWS)
-    if (*p_stl && curwin->w_status_height)
+    if ((*p_stl != NUL || *curwin->w_p_stl != NUL) && curwin->w_status_height)
 	win_redr_custom(curwin, FALSE);
     else
 #endif
diff --git a/src/structs.h b/src/structs.h
index 4975af5..84b1a24 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -189,6 +189,10 @@
 #endif
     long	wo_scr;
 #define w_p_scr w_onebuf_opt.wo_scr	/* 'scroll' */
+#ifdef FEAT_STL_OPT
+    char_u	*wo_stl;
+#define w_p_stl w_onebuf_opt.wo_stl	/* 'statusline' */
+#endif
 #ifdef FEAT_SCROLLBIND
     int		wo_scb;
 # define w_p_scb w_onebuf_opt.wo_scb	/* 'scrollbind' */
diff --git a/src/tag.c b/src/tag.c
index 442717f..b72cf03 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -2862,7 +2862,7 @@
      */
     if (mch_getperm(fname) < 0
 #ifdef FEAT_AUTOCMD
-	    && !has_autocmd(EVENT_BUFREADCMD, fname)
+	    && !has_autocmd(EVENT_BUFREADCMD, fname, NULL)
 #endif
        )
     {
diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak
index 78a4d27..01304c0 100644
--- a/src/testdir/Make_amiga.mak
+++ b/src/testdir/Make_amiga.mak
@@ -23,7 +23,7 @@
 		test33.out test34.out test35.out test36.out test37.out \
 		test38.out test39.out test40.out test41.out test42.out \
 		test43.out test44.out test45.out test46.out test47.out \
-		test48.out test51.out test53.out
+		test48.out test51.out test53.out test54.out
 
 .SUFFIXES: .in .out
 
@@ -96,3 +96,4 @@
 test48.out: test48.in
 test51.out: test51.in
 test53.out: test53.in
+test54.out: test54.in
diff --git a/src/testdir/Make_dos.mak b/src/testdir/Make_dos.mak
index 0dd1a09..07c2c27 100644
--- a/src/testdir/Make_dos.mak
+++ b/src/testdir/Make_dos.mak
@@ -17,7 +17,7 @@
 		test23.out test24.out test28.out test29.out \
 		test35.out test36.out test43.out \
 		test44.out test45.out test46.out test47.out \
-		test48.out test51.out test53.out
+		test48.out test51.out test53.out test54.out
 
 SCRIPTS =	test3.out test4.out test5.out test6.out test7.out \
 		test8.out test9.out test11.out test13.out test14.out \
diff --git a/src/testdir/Make_os2.mak b/src/testdir/Make_os2.mak
index f3ce50b..e1ca8dc 100644
--- a/src/testdir/Make_os2.mak
+++ b/src/testdir/Make_os2.mak
@@ -23,7 +23,7 @@
 		test33.out test34.out test35.out test36.out test37.out \
 		test38.out test39.out test40.out test41.out test42.out \
 		test43.out test44.out test45.out test46.out test47.out \
-		test48.out test51.out test53.out
+		test48.out test51.out test53.out test54.out
 
 .SUFFIXES: .in .out
 
diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms
index 6819a68..1db9fa7 100644
--- a/src/testdir/Make_vms.mms
+++ b/src/testdir/Make_vms.mms
@@ -4,7 +4,7 @@
 # Authors:	Zoltan Arpadffy, <arpadffy@polarhome.com>
 #		Sandor Kopanyi,  <sandor.kopanyi@mailbox.hu>
 #
-# Last change:  2004 Jul 02
+# Last change:  2004 Dec 24
 #
 # This has been tested on VMS 6.2 to 7.2 on DEC Alpha and VAX.
 # Edit the lines in the Configuration section below to select.
@@ -57,7 +57,7 @@
 	 test33.out test34.out test35.out test36.out test37.out \
 	 test38.out test39.out test40.out test41.out test42.out \
 	 test43.out test44.out test45.out test46.out \
-	 test48.out test51.out test53.out
+	 test48.out test51.out test53.out test54.out
 
 .IFDEF WANT_GUI
 SCRIPT_GUI = test16.out
diff --git a/src/testdir/Makefile b/src/testdir/Makefile
index c260eb4..2f4ab93 100644
--- a/src/testdir/Makefile
+++ b/src/testdir/Makefile
@@ -13,7 +13,8 @@
 		test33.out test34.out test35.out test36.out test37.out \
 		test38.out test39.out test40.out test41.out test42.out \
 		test43.out test44.out test45.out test46.out test47.out \
-		test48.out test49.out test51.out test52.out test53.out
+		test48.out test49.out test51.out test52.out test53.out \
+		test54.out
 
 SCRIPTS_GUI = test16.out
 
diff --git a/src/testdir/test54.in b/src/testdir/test54.in
new file mode 100644
index 0000000..b3fbe72
--- /dev/null
+++ b/src/testdir/test54.in
@@ -0,0 +1,17 @@
+Some tests for buffer-local autocommands
+
+STARTTEST
+:so small.vim
+:e xx
+:!rm -f test.out
+:au BufLeave <buffer> :!echo "buffer-local autommand in %" >> test.out
+:e somefile           " here, autocommand for xx shall write test.out 
+:                     " but autocommand shall not apply to buffer named <buffer>
+:bwipe xx             " here, autocommand shall be auto-deleted
+:e xx                 " nothing shall be written
+:e somefile           " nothing shall be written
+:qa!
+ENDTEST
+
+start of test file xx
+end of test file xx
diff --git a/src/testdir/test54.ok b/src/testdir/test54.ok
new file mode 100644
index 0000000..0fd1dc9
--- /dev/null
+++ b/src/testdir/test54.ok
@@ -0,0 +1 @@
+buffer-local autommand in xx
diff --git a/src/version.h b/src/version.h
index 7596af6..ba8cee6 100644
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT	"vim70aa"
 #define VIM_VERSION_SHORT	"7.0aa"
 #define VIM_VERSION_MEDIUM	"7.0aa ALPHA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2004 Dec 17)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2004 Dec 17, compiled "
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2004 Dec 24)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2004 Dec 24, compiled "