aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/minibuf.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/src/minibuf.c b/src/minibuf.c
index bab116f4ba7..2abb46710e5 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -279,7 +279,13 @@ read_minibuf (map, initial, prompt, backup_n, expflag, histvar, histpos)
279 Fselect_window (minibuf_window); 279 Fselect_window (minibuf_window);
280 XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0); 280 XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0);
281 281
282 Ferase_buffer (); 282 {
283 int count1 = specpdl_ptr - specpdl;
284 specbind (Qinhibit_read_only, Qt);
285 Ferase_buffer ();
286 unbind_to (count1, Qnil);
287 }
288
283 minibuf_level++; 289 minibuf_level++;
284 290
285 if (!NILP (initial)) 291 if (!NILP (initial))
@@ -416,6 +422,7 @@ read_minibuf_unwind (data)
416 Lisp_Object data; 422 Lisp_Object data;
417{ 423{
418 Lisp_Object old_deactivate_mark; 424 Lisp_Object old_deactivate_mark;
425 Lisp_Object window;
419 426
420 /* We are exiting the minibuffer one way or the other, 427 /* We are exiting the minibuffer one way or the other,
421 so run the hook. */ 428 so run the hook. */
@@ -423,24 +430,16 @@ read_minibuf_unwind (data)
423 && !NILP (Vrun_hooks)) 430 && !NILP (Vrun_hooks))
424 safe_run_hooks (Qminibuffer_exit_hook); 431 safe_run_hooks (Qminibuffer_exit_hook);
425 432
426 /* Erase the minibuffer we were using at this level. */
427 Fset_buffer (XWINDOW (minibuf_window)->buffer);
428
429 /* Prevent error in erase-buffer. */
430 current_buffer->read_only = Qnil;
431
432 old_deactivate_mark = Vdeactivate_mark;
433 Ferase_buffer ();
434 Vdeactivate_mark = old_deactivate_mark;
435
436 /* If this was a recursive minibuffer, 433 /* If this was a recursive minibuffer,
437 tie the minibuffer window back to the outer level minibuffer buffer */ 434 tie the minibuffer window back to the outer level minibuffer buffer. */
438 minibuf_level--; 435 minibuf_level--;
439 /* Make sure minibuffer window is erased, not ignored */
440 windows_or_buffers_changed++;
441 XSETFASTINT (XWINDOW (minibuf_window)->last_modified, 0);
442 436
443 /* Restore prompt, etc from outer minibuffer */ 437 window = minibuf_window;
438 /* To keep things predictable, in case it matters, let's be in the minibuffer
439 when we reset the relevant variables. */
440 Fset_buffer (XWINDOW (window)->buffer);
441
442 /* Restore prompt, etc, from outer minibuffer level. */
444 minibuf_prompt = Fcar (minibuf_save_list); 443 minibuf_prompt = Fcar (minibuf_save_list);
445 minibuf_save_list = Fcdr (minibuf_save_list); 444 minibuf_save_list = Fcdr (minibuf_save_list);
446 minibuf_prompt_width = XFASTINT (Fcar (minibuf_save_list)); 445 minibuf_prompt_width = XFASTINT (Fcar (minibuf_save_list));
@@ -457,6 +456,21 @@ read_minibuf_unwind (data)
457 minibuf_save_list = Fcdr (minibuf_save_list); 456 minibuf_save_list = Fcdr (minibuf_save_list);
458 minibuf_window = Fcar (minibuf_save_list); 457 minibuf_window = Fcar (minibuf_save_list);
459 minibuf_save_list = Fcdr (minibuf_save_list); 458 minibuf_save_list = Fcdr (minibuf_save_list);
459
460 /* Erase the minibuffer we were using at this level. */
461 {
462 int count = specpdl_ptr - specpdl;
463 /* Prevent error in erase-buffer. */
464 specbind (Qinhibit_read_only, Qt);
465 old_deactivate_mark = Vdeactivate_mark;
466 Ferase_buffer ();
467 Vdeactivate_mark = old_deactivate_mark;
468 unbind_to (count, Qnil);
469 }
470
471 /* Make sure minibuffer window is erased, not ignored. */
472 windows_or_buffers_changed++;
473 XSETFASTINT (XWINDOW (window)->last_modified, 0);
460} 474}
461 475
462 476