]> git.eshelyaron.com Git - emacs.git/commit
Make recursive minibuffers and recursive edits work together
authorAlan Mackenzie <acm@muc.de>
Thu, 11 Feb 2021 21:37:45 +0000 (21:37 +0000)
committerAlan Mackenzie <acm@muc.de>
Thu, 11 Feb 2021 21:37:45 +0000 (21:37 +0000)
commit203e61ff837128b397eb313a5bb1b703f0eae0ec
treefa2a96312dd4ec237bcf2a2baa7439ed83f351d2
parent4f63b4bfc6c16abeaf9d8a9e9de76cc42d772567
Make recursive minibuffers and recursive edits work together

* lisp/minibuffer.el (exit-minibuffer): When in a minibuffer, throw an error
should the command loop nesting level be wrong.

* src/lisp.h (minibuffer_quit_level): declare as an extern.
(command_loop_level): Move definition from src/window.h

* src/window.h (command_loop_level): move definition to src/lisp.h.

* src/eval.c (minibuffer_quit_level): Move this variable to file level from
being a static inside internal_catch.
(internal_catch): Simplify the logic.

* src/minibuf.c (Vcommand_loop_level_list): New variable.
(move_minibuffer_onto_frame): Set the major mode of  *Minibuf-0*.
(Fminibuffer_innermost_command_loop_p): New primitive.
(Fabort_minibuffers): Check the command loop level before throwing t to 'exit,
and set minibuffer_quit_level too.
(read_minibuf): New variable calling_window.
Before stacking up minibuffers on the current mini-window, check that the
mini-window is not the current one.
Do not call choose_minibuf_frame from read_minibuf's unwinding process.
Bind calling_frame and calling_window over the recursive edit.
Set the new minibuffer's major mode directly.
Remove the switching away from the minibuffer after the recursive edit.
(get_minibuffer): Record the command loop level in new variable
Vcommand_loop_level_list.  No longer set the major mode of a returned
minibuffer.
(minibuf_c_loop_level): New function.
(read_minibuf_unwind): New variables calling_frame, calling_window are unbound
from the binding stack.  Remove old variable `window', which could not be set
reliably to the expired mini-window.
The expired minibuffer is determined as the nth in the list, rather than the
contents of the current or previous mini-window.
Switch the current window away from the mini-window here (moved from
read_minibuf).
lisp/minibuffer.el
src/eval.c
src/lisp.h
src/minibuf.c
src/window.h