/* Buffer manipulation primitives for GNU Emacs.
-Copyright (C) 1985-1989, 1993-1995, 1997-2011 Free Software Foundation, Inc.
+Copyright (C) 1985-1989, 1993-1995, 1997-2012 Free Software Foundation, Inc.
This file is part of GNU Emacs.
call the corresponding file handler. */
handler = Ffind_file_name_handler (filename, Qget_file_buffer);
if (!NILP (handler))
- return call2 (handler, Qget_file_buffer, filename);
+ {
+ Lisp_Object handled_buf = call2 (handler, Qget_file_buffer,
+ filename);
+ return BUFFERP (handled_buf) ? handled_buf : Qnil;
+ }
for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
{
if (buf != current_buffer)
val = XCDR (elt);
- result = Fcons (Fcons (XCAR (elt), val), result);
+ result = Fcons (EQ (val, Qunbound)
+ ? XCAR (elt)
+ : Fcons (XCAR (elt), val),
+ result);
}
return result;
idx = PER_BUFFER_IDX (offset);
if ((idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
&& SYMBOLP (PER_BUFFER_SYMBOL (offset)))
- result = Fcons (Fcons (PER_BUFFER_SYMBOL (offset),
- PER_BUFFER_VALUE (buf, offset)),
- result);
+ {
+ Lisp_Object sym = PER_BUFFER_SYMBOL (offset);
+ Lisp_Object val = PER_BUFFER_VALUE (buf, offset);
+ result = Fcons (EQ (val, Qunbound) ? sym : Fcons (sym, val),
+ result);
+ }
}
}
UNGCPRO;
}
- /* Make this buffer not be current.
+ /* Run replace_buffer_in_windows before making another buffer current
+ since set-window-buffer-start-and-point will refuse to make another
+ buffer current if the selected window does not show the current
+ buffer. (Bug#10114) */
+ replace_buffer_in_windows (buffer);
+
+ /* Make this buffer not be current.
In the process, notice if this is the sole visible buffer
and give up if so. */
if (b == current_buffer)
/* These may run Lisp code and into infinite loops (if someone
insisted on circular lists) so allow quitting here. */
- replace_buffer_in_windows (buffer);
frames_discard_buffer (buffer);
clear_charpos_cache (b);
/* Reset the local variables, so that this buffer's local values
won't be protected from GC. They would be protected
- if they happened to remain encached in their symbols.
+ if they happened to remain cached in their symbols.
This gets rid of them for certain. */
swap_out_buffer_local_variables (b);
reset_buffer_local_variables (b, 1);
Lisp_Object sym = XCAR (XCAR (alist));
eassert (XSYMBOL (sym)->redirect == SYMBOL_LOCALIZED);
/* Need not do anything if some other buffer's binding is
- now encached. */
+ now cached. */
if (EQ (SYMBOL_BLV (XSYMBOL (sym))->where, buffer))
{
/* Symbol is set up for this buffer's old local value:
static int mmap_page_size;
-/* 1 means mmap has been intialized. */
+/* 1 means mmap has been initialized. */
static int mmap_initialized_p;