changeset 34645:172f30203d25 v9.1.0207

patch 9.1.0207: No autocommand when writing session file Commit: https://github.com/vim/vim/commit/e5f2280381250801a28dcff9823e6f94e7b163fc Author: Colin Kennedy <colinvfx@gmail.com> Date: Tue Mar 26 18:20:16 2024 +0100 patch 9.1.0207: No autocommand when writing session file Problem: No autocommand when writing session file Solution: Add SessionWritePost autocommand (Colin Kennedy) fixes: ##14242 closes: #14288 Co-authored-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Colin Kennedy <colinvfx@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Tue, 26 Mar 2024 18:30:03 +0100
parents 9b94748e226a
children 1622062cdaa3
files runtime/doc/autocmd.txt runtime/doc/tags runtime/doc/version9.txt src/autocmd.c src/session.c src/testdir/test_autocmd.vim src/version.c src/vim.h
diffstat 8 files changed, 72 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -1,4 +1,4 @@
-*autocmd.txt*   For Vim version 9.1.  Last change: 2024 Jan 25
+*autocmd.txt*   For Vim version 9.1.  Last change: 2024 Mar 26
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -428,6 +428,9 @@ Name			triggered by ~
 
 |SessionLoadPost|	after loading a session file
 
+|SessionWritePost|	After writing the session file using
+			the |:mksession| command.
+
 |MenuPopup|		just before showing the popup menu
 |CompleteChanged|	after Insert mode completion menu changed
 |CompleteDonePre|	after Insert mode completion is done, before clearing
@@ -1115,6 +1118,9 @@ SafeStateAgain			Like SafeState but afte
 							*SessionLoadPost*
 SessionLoadPost			After loading the session file created using
 				the |:mksession| command.
+							*SessionWritePost*
+SessionWritePost		After writing a session file by calling
+				the |:mksession| command.
 							*ShellCmdPost*
 ShellCmdPost			After executing a shell command with |:!cmd|,
 				|:shell|, |:make| and |:grep|.  Can be used to
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -5682,6 +5682,7 @@ Select-mode-mapping	visual.txt	/*Select-
 Session	starting.txt	/*Session*
 SessionLoad-variable	starting.txt	/*SessionLoad-variable*
 SessionLoadPost	autocmd.txt	/*SessionLoadPost*
+SessionWritePost	autocmd.txt	/*SessionWritePost*
 ShellCmdPost	autocmd.txt	/*ShellCmdPost*
 ShellFilterPost	autocmd.txt	/*ShellFilterPost*
 SigUSR1	autocmd.txt	/*SigUSR1*
--- a/runtime/doc/version9.txt
+++ b/runtime/doc/version9.txt
@@ -1,4 +1,4 @@
-*version9.txt*  For Vim version 9.1.  Last change: 2024 Mar 03
+*version9.txt*  For Vim version 9.1.  Last change: 2024 Mar 26
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -41570,6 +41570,7 @@ Functions: ~
 
 Autocommands: ~
 
+|SessionWritePost|	after writing the session file |:mksession|
 |TermResponseAll|	after the terminal response to |t_RV| and others is
 			received
 |WinNewPre|		before creating a new window
--- a/src/autocmd.c
+++ b/src/autocmd.c
@@ -160,6 +160,7 @@ static struct event_name
     {"SafeState",	EVENT_SAFESTATE},
     {"SafeStateAgain",	EVENT_SAFESTATEAGAIN},
     {"SessionLoadPost",	EVENT_SESSIONLOADPOST},
+    {"SessionWritePost",EVENT_SESSIONWRITEPOST},
     {"ShellCmdPost",	EVENT_SHELLCMDPOST},
     {"ShellFilterPost",	EVENT_SHELLFILTERPOST},
     {"SigUSR1",		EVENT_SIGUSR1},
--- a/src/session.c
+++ b/src/session.c
@@ -1392,6 +1392,8 @@ theend:
 #ifdef FEAT_SESSION
     vim_free(viewFile);
 #endif
+
+    apply_autocmds(EVENT_SESSIONWRITEPOST, NULL, NULL, FALSE, curbuf);
 }
 
 #if (defined(FEAT_VIMINFO) || defined(FEAT_SESSION)) || defined(PROTO)
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -4474,4 +4474,60 @@ func Test_autocmd_creates_new_buffer_on_
   bw c.txt
 endfunc
 
+" Ensure `expected` was just recently written as a Vim session
+func s:assert_session_path(expected)
+  call assert_equal(a:expected, v:this_session)
+endfunc
+
+" Check for `expected` after a session is written to-disk.
+func s:watch_for_session_path(expected)
+  execute 'autocmd SessionWritePost * ++once execute "call s:assert_session_path(\"'
+        \ . a:expected
+        \ . '\")"'
+endfunc
+
+" Ensure v:this_session gets the full session path, if explicitly stated
+func Test_explicit_session_absolute_path()
+  %bwipeout!
+
+  let directory = getcwd()
+
+  let v:this_session = ""
+  let name = "some_file.vim"
+  let expected = fnamemodify(name, ":p")
+  call s:watch_for_session_path(expected)
+  execute "mksession! " .. expected
+
+  call delete(expected)
+endfunc
+
+" Ensure v:this_session gets the full session path, if explicitly stated
+func Test_explicit_session_relative_path()
+  %bwipeout!
+
+  let directory = getcwd()
+
+  let v:this_session = ""
+  let name = "some_file.vim"
+  let expected = fnamemodify(name, ":p")
+  call s:watch_for_session_path(expected)
+  execute "mksession! " .. name
+
+  call delete(expected)
+endfunc
+
+" Ensure v:this_session gets the full session path, if not specified
+func Test_implicit_session()
+  %bwipeout!
+
+  let directory = getcwd()
+
+  let v:this_session = ""
+  let expected = fnamemodify("Session.vim", ":p")
+  call s:watch_for_session_path(expected)
+  mksession!
+
+  call delete(expected)
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    207,
+/**/
     206,
 /**/
     205,
--- a/src/vim.h
+++ b/src/vim.h
@@ -1404,6 +1404,7 @@ enum auto_event
     EVENT_SAFESTATE,		// going to wait for a character
     EVENT_SAFESTATEAGAIN,	// still waiting for a character
     EVENT_SESSIONLOADPOST,	// after loading a session file
+    EVENT_SESSIONWRITEPOST,	// after writing a session file
     EVENT_SHELLCMDPOST,		// after ":!cmd"
     EVENT_SHELLFILTERPOST,	// after ":1,2!cmd", ":w !cmd", ":r !cmd".
     EVENT_SIGUSR1,		// after the SIGUSR1 signal