diff options
author | Colin Kennedy <colinvfx@gmail.com> | 2024-03-26 18:20:16 +0100 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2024-03-26 18:23:06 +0100 |
commit | e5f2280381250801a28dcff9823e6f94e7b163fc (patch) | |
tree | 1c61f4c8263d8d83a22f1595fa36e27ed8d0b155 | |
parent | 63d68c2c218eeb80c164e1c56c53f51a9e92a5eb (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.txt | 8 | ||||
-rw-r--r-- | runtime/doc/tags | 1 | ||||
-rw-r--r-- | runtime/doc/version9.txt | 3 | ||||
-rw-r--r-- | src/autocmd.c | 1 | ||||
-rw-r--r-- | src/session.c | 2 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 56 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 1 |
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, @@ -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 |