From ed84f24a215a65dcf2ef49d343eebdbd4be178ee Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 26 Jun 2022 22:45:39 +0200 Subject: [PATCH] Make `signal-process' allow completing over signal names * lisp/simple.el (read-signal-name): New function. * src/process.c (Fsignal_process): Use it to allow completing over the signal names (bug#56239). (Fsignal_names): New function. --- lisp/simple.el | 13 +++++++++++++ src/process.c | 19 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/lisp/simple.el b/lisp/simple.el index a750eed72b8..6d62c028657 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -10627,6 +10627,19 @@ If the buffer doesn't exist, create it first." "Check whether STRING is empty." (string= string "")) +(defun read-signal-name () + "Read a signal number or name." + (let ((value + (completing-read "Signal code or name: " + (signal-names) + nil + (lambda (value) + (or (string-match "\\`[0-9]+\\'" value) + (member value (signal-names))))))) + (if (string-match "\\`[0-9]+\\'" value) + (string-to-number value) + (intern (concat "sig" (downcase value)))))) + (provide 'simple) diff --git a/src/process.c b/src/process.c index b2847ee1725..5cb5d952229 100644 --- a/src/process.c +++ b/src/process.c @@ -7109,7 +7109,7 @@ See function `signal-process' for more details on usage. */) } DEFUN ("signal-process", Fsignal_process, Ssignal_process, - 2, 3, "sProcess (name or number): \nnSignal code: ", + 2, 3, "(list (read-string \"Process (name or number): \") (read-signal-name))", doc: /* Send PROCESS the signal with code SIGCODE. PROCESS may also be a number specifying the process id of the process to signal; in this case, the process need not be a child of @@ -8317,6 +8317,22 @@ If QUERY is `all', also count processors not available. */) #endif } +DEFUN ("signal-names", Fsignal_names, Ssignal_names, 0, 0, 0, + doc: /* Return a list of known signal names on this system. */) + (void) +{ + char name[SIG2STR_MAX]; + Lisp_Object names = Qnil; + for (int i = 0; i < 255; ++i) + { + if (!sig2str (i, name)) + { + names = Fcons (build_string (name), names); + } + } + return names; +} + #ifdef subprocesses /* Arrange to catch SIGCHLD if this hasn't already been arranged. Invoke this after init_process_emacs, and after glib and/or GNUstep @@ -8770,4 +8786,5 @@ sentinel or a process filter function has an error. */); defsubr (&Slist_system_processes); defsubr (&Sprocess_attributes); defsubr (&Snum_processors); + defsubr (&Ssignal_names); } -- 2.39.5