From: Lars Ingebrigtsen Date: Mon, 14 Dec 2020 15:44:00 +0000 (+0100) Subject: Add a new recursively bound `current-minibuffer-command' variable X-Git-Tag: emacs-28.0.90~4717 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=252366866b5691965c8c752aa103ab157a6f3aaa;p=emacs.git Add a new recursively bound `current-minibuffer-command' variable * doc/lispref/commands.texi (Command Loop Info): Document it (bug#45177). * src/callint.c (Fcall_interactively): Bind it. * src/keyboard.c (syms_of_keyboard): Define current-minibuffer-command. --- diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi index ebfda01671e..15d7e4e3a71 100644 --- a/doc/lispref/commands.texi +++ b/doc/lispref/commands.texi @@ -928,6 +928,13 @@ remapping), and @code{this-original-command} gives the command that was specified to run but remapped into another command. @end defvar +@defvar current-minibuffer-command +This has the same value as @code{this-command}, but is bound +recursively when entering a minibuffer. This variable can be used +from minibuffer hooks and the like to determine what command opened +the current minibuffer session. +@end defvar + @defun this-command-keys This function returns a string or vector containing the key sequence that invoked the present command. Any events read by the command diff --git a/etc/NEWS b/etc/NEWS index 635da2d84ab..a5e2c9cf26a 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1437,6 +1437,12 @@ that makes it a valid button. ** Miscellaneous ++++ + +*** New variable 'current-minibuffer-command'. +This is like 'this-command', but is bound recursively when entering +the minibuffer. + +++ *** New function 'object-intervals'. This function returns a copy of the list of intervals (i.e., text diff --git a/src/callint.c b/src/callint.c index f80436f3d91..a221705f676 100644 --- a/src/callint.c +++ b/src/callint.c @@ -283,6 +283,11 @@ invoke it (via an `interactive' spec that contains, for instance, an Lisp_Object save_real_this_command = Vreal_this_command; Lisp_Object save_last_command = KVAR (current_kboard, Vlast_command); + /* Bound recursively so that code can check the current command from + code running from minibuffer hooks (and the like), without being + overwritten by subsequent minibuffer calls. */ + specbind (Qcurrent_minibuffer_command, Vreal_this_command); + if (NILP (keys)) keys = this_command_keys, key_count = this_command_key_count; else diff --git a/src/keyboard.c b/src/keyboard.c index dbca5be91e4..54232aaea1e 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -11830,6 +11830,13 @@ will be in `last-command' during the following command. */); doc: /* This is like `this-command', except that commands should never modify it. */); Vreal_this_command = Qnil; + DEFSYM (Qcurrent_minibuffer_command, "current-minibuffer-command"); + DEFVAR_LISP ("current-minibuffer-command", Vcurrent_minibuffer_command, + doc: /* This is like `this-command', but bound recursively. +Code running from (for instance) a minibuffer hook can check this variable +to see what command invoked the current minibuffer. */); + Vcurrent_minibuffer_command = Qnil; + DEFVAR_LISP ("this-command-keys-shift-translated", Vthis_command_keys_shift_translated, doc: /* Non-nil if the key sequence activating this command was shift-translated.