summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Kennedy <colinvfx@gmail.com>2024-03-26 18:20:16 +0100
committerChristian Brabandt <cb@256bit.org>2024-03-26 18:23:06 +0100
commite5f2280381250801a28dcff9823e6f94e7b163fc (patch)
tree1c61f4c8263d8d83a22f1595fa36e27ed8d0b155
parent63d68c2c218eeb80c164e1c56c53f51a9e92a5eb (diff)
patch 9.1.0207: No autocommand when writing session filev9.1.0207
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>
-rw-r--r--runtime/doc/autocmd.txt8
-rw-r--r--runtime/doc/tags1
-rw-r--r--runtime/doc/version9.txt3
-rw-r--r--src/autocmd.c1
-rw-r--r--src/session.c2
-rw-r--r--src/testdir/test_autocmd.vim56
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h1
8 files changed, 72 insertions, 2 deletions
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
index 5f9f51ecb6..32094b3982 100644
--- 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 after processing any
*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
diff --git a/runtime/doc/tags b/runtime/doc/tags
index 8dd4db2418..4ff7095e0b 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -5682,6 +5682,7 @@ Select-mode-mapping visual.txt /*Select-mode-mapping*
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*
diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt
index bf16d49534..b94d15764e 100644
--- 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
diff --git a/src/autocmd.c b/src/autocmd.c
index 8e43b34473..8a7e6072a9 100644
--- 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},
diff --git a/src/session.c b/src/session.c
index e39ce4d4d1..eea57a2333 100644
--- 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)
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index 564d568c0d..f0620040c2 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -4474,4 +4474,60 @@ func Test_autocmd_creates_new_buffer_on_bufleave()
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
diff --git a/src/version.c b/src/version.c
index 76bfd10260..8ab5957197 100644
--- 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,
diff --git a/src/vim.h b/src/vim.h
index a04be0837e..63a31880dc 100644
--- 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