diff src/ex_docmd.c @ 27617:269f89efb06a v8.2.4335

patch 8.2.4335: no autocommand event triggered before changing directory Commit: https://github.com/vim/vim/commit/28e8f73ae2d90009fd62cd60f97c2643ba44de68 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Feb 9 12:58:20 2022 +0000 patch 8.2.4335: no autocommand event triggered before changing directory Problem: No autocommand event triggered before changing directory. (Ronnie Magatti) Solution: Add DirChangedPre. (closes #9721)
author Bram Moolenaar <Bram@vim.org>
date Wed, 09 Feb 2022 14:00:05 +0100
parents 9986f96fb1bd
children 1712b102d642
line wrap: on
line diff
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -7343,6 +7343,26 @@ post_chdir(cdscope_T scope)
 }
 
 /*
+ * Trigger DirChangedPre for "acmd_fname" with directory "new_dir".
+ */
+    void
+trigger_DirChangedPre(char_u *acmd_fname, char_u *new_dir)
+{
+#ifdef FEAT_EVAL
+    dict_T	    *v_event;
+    save_v_event_T  save_v_event;
+
+    v_event = get_v_event(&save_v_event);
+    (void)dict_add_string(v_event, "directory", new_dir);
+    dict_set_items_ro(v_event);
+#endif
+    apply_autocmds(EVENT_DIRCHANGEDPRE, acmd_fname, new_dir, FALSE, curbuf);
+#ifdef FEAT_EVAL
+    restore_v_event(v_event, &save_v_event);
+#endif
+}
+
+/*
  * Change directory function used by :cd/:tcd/:lcd Ex commands and the
  * chdir() function.
  * scope == CDSCOPE_WINDOW: changes the window-local directory
@@ -7358,7 +7378,7 @@ changedir_func(
 {
     char_u	*pdir = NULL;
     int		dir_differs;
-    char_u	*acmd_fname;
+    char_u	*acmd_fname = NULL;
     char_u	**pp;
 
     if (new_dir == NULL || allbuf_locked())
@@ -7411,12 +7431,23 @@ changedir_func(
 	new_dir = NameBuff;
     }
     dir_differs = pdir == NULL
-	|| pathcmp((char *)pdir, (char *)new_dir, -1) != 0;
-    if (dir_differs && vim_chdir(new_dir))
-    {
-	emsg(_(e_command_failed));
-	vim_free(pdir);
-	return FALSE;
+			    || pathcmp((char *)pdir, (char *)new_dir, -1) != 0;
+    if (dir_differs)
+    {
+	if (scope == CDSCOPE_WINDOW)
+	    acmd_fname = (char_u *)"window";
+	else if (scope == CDSCOPE_TABPAGE)
+	    acmd_fname = (char_u *)"tabpage";
+	else
+	    acmd_fname = (char_u *)"global";
+	trigger_DirChangedPre(acmd_fname, new_dir);
+
+	if (vim_chdir(new_dir))
+	{
+	    emsg(_(e_command_failed));
+	    vim_free(pdir);
+	    return FALSE;
+	}
     }
 
     if (scope == CDSCOPE_WINDOW)
@@ -7431,16 +7462,7 @@ changedir_func(
     post_chdir(scope);
 
     if (dir_differs)
-    {
-	if (scope == CDSCOPE_WINDOW)
-	    acmd_fname = (char_u *)"window";
-	else if (scope == CDSCOPE_TABPAGE)
-	    acmd_fname = (char_u *)"tabpage";
-	else
-	    acmd_fname = (char_u *)"global";
-	apply_autocmds(EVENT_DIRCHANGED, acmd_fname, new_dir, FALSE,
-							    curbuf);
-    }
+	apply_autocmds(EVENT_DIRCHANGED, acmd_fname, new_dir, FALSE, curbuf);
     return TRUE;
 }