Problem: No simple way to interrupt Vim.
Solution: Add the SigUSR1 autocommand, triggered by SIGUSR1. (Jacob Hayes,
closes #1718)
info
|User| to be used in combination with ":doautocmd"
+|SigUSR1| after the SIGUSR1 signal has been detected
The alphabetical list of autocommand events: *autocmd-events-abc*
It is not allowed to change the buffer text,
see |textlock|.
{only when compiled with the +eval feature}
+
*User*
User Never executed automatically. To be used for
autocommands that are only executed with
used while there are no matching autocommands,
you will get an error. If you don't want
that, define a dummy autocommand yourself.
+
+ *SigUSR1*
+SigUSR1 After the SIGUSR1 signal has been detected.
+ Could be used if other ways of notifying Vim
+ are not feasible. E.g. to check for the
+ result of a build that takes a long time, or
+ when a motion sensor is triggered.
+ {only on Unix}
+
*UserGettingBored*
UserGettingBored When the user presses the same key 42 times.
Just kidding! :-)
{"SessionLoadPost", EVENT_SESSIONLOADPOST},
{"ShellCmdPost", EVENT_SHELLCMDPOST},
{"ShellFilterPost", EVENT_SHELLFILTERPOST},
+ {"SigUSR1", EVENT_SIGUSR1},
{"SourceCmd", EVENT_SOURCECMD},
{"SourcePre", EVENT_SOURCEPRE},
{"SourcePost", EVENT_SOURCEPOST},
if (has_sound_callback_in_queue())
invoke_sound_callback();
# endif
+#ifdef SIGUSR1
+ if (got_sigusr1)
+ {
+ apply_autocmds(EVENT_SIGUSR1, NULL, NULL, FALSE, curbuf);
+ got_sigusr1 = FALSE;
+ }
+#endif
break;
}
EXTERN FILE *scriptout INIT(= NULL); // stream to write script to
EXTERN int read_cmd_fd INIT(= 0); // fd to read commands from
-// volatile because it is used in signal handler catch_sigint().
-EXTERN volatile sig_atomic_t got_int INIT(= FALSE); // set to TRUE when interrupt
- // signal occurred
+// Set to TRUE when an interrupt signal occurred.
+// Volatile because it is used in signal handler catch_sigint().
+EXTERN volatile sig_atomic_t got_int INIT(= FALSE);
+
+// Set to TRUE when SIGUSR1 signal was detected.
+// Volatile because it is used in signal handler catch_sigint().
+EXTERN volatile sig_atomic_t got_sigusr1 INIT(= FALSE);
+
#ifdef USE_TERM_CONSOLE
EXTERN int term_console INIT(= FALSE); // set to TRUE when console used
#endif
#if defined(SIGINT)
static RETSIGTYPE catch_sigint SIGPROTOARG;
#endif
+#if defined(SIGUSR1)
+static RETSIGTYPE catch_sigusr1 SIGPROTOARG;
+#endif
#if defined(SIGPWR)
static RETSIGTYPE catch_sigpwr SIGPROTOARG;
#endif
{SIGXFSZ, "XFSZ", TRUE},
#endif
#ifdef SIGUSR1
- {SIGUSR1, "USR1", TRUE},
+ {SIGUSR1, "USR1", FALSE},
#endif
#if defined(SIGUSR2) && !defined(FEAT_SYSMOUSE)
// Used for sysmouse handling
}
#endif
+#if defined(SIGUSR1)
+ static RETSIGTYPE
+catch_sigusr1 SIGDEFARG(sigarg)
+{
+ // this is not required on all systems, but it doesn't hurt anybody
+ signal(SIGUSR1, (RETSIGTYPE (*)())catch_sigusr1);
+ got_sigusr1 = TRUE;
+ SIGRETURN;
+}
+#endif
+
#if defined(SIGPWR)
static RETSIGTYPE
catch_sigpwr SIGDEFARG(sigarg)
#if defined(SIGCONT)
signal(SIGCONT, sigcont_handler);
#endif
+#ifdef SIGPIPE
/*
* We want to ignore breaking of PIPEs.
*/
-#ifdef SIGPIPE
signal(SIGPIPE, SIG_IGN);
#endif
catch_int_signal();
#endif
+#ifdef SIGUSR1
+ /*
+ * Call user's handler on SIGUSR1
+ */
+ signal(SIGUSR1, (RETSIGTYPE (*)())catch_sigusr1);
+#endif
+
/*
* Ignore alarm signals (Perl's alarm() generates it).
*/
signal(SIGALRM, SIG_IGN);
#endif
+#ifdef SIGPWR
/*
* Catch SIGPWR (power failure?) to preserve the swap files, so that no
* work will be lost.
*/
-#ifdef SIGPWR
signal(SIGPWR, (RETSIGTYPE (*)())catch_sigpwr);
#endif
autocmd! BufEnter Xfile
endfunc
+" Tests for SigUSR1 autocmd event, which is only available on posix systems.
+func Test_autocmd_sigusr1()
+ CheckUnix
+
+ let g:sigusr1_passed = 0
+ au SigUSR1 * let g:sigusr1_passed = 1
+ call system('/bin/kill -s usr1 ' . getpid())
+ call WaitForAssert({-> assert_true(g:sigusr1_passed)})
+
+ au! SigUSR1
+ unlet g:sigusr1_passed
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 952,
/**/
951,
/**/
EVENT_SESSIONLOADPOST, // after loading a session file
EVENT_SHELLCMDPOST, // after ":!cmd"
EVENT_SHELLFILTERPOST, // after ":1,2!cmd", ":w !cmd", ":r !cmd".
+ EVENT_SIGUSR1, // after the SIGUSR1 signal
EVENT_SOURCECMD, // sourcing a Vim script using command
EVENT_SOURCEPRE, // before sourcing a Vim script
EVENT_SOURCEPOST, // after sourcing a Vim script