Now on revision 112273. ------------------------------------------------------------ revno: 112273 committer: Roland Winkler branch nick: trunk timestamp: Fri 2013-04-12 20:10:09 -0500 message: faces.el (read-face-name): Do not override value of arg default, call instead face-at-point diff: === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2013-04-12 13:56:03 +0000 +++ lisp/ChangeLog 2013-04-13 01:10:09 +0000 @@ -1,3 +1,21 @@ +2013-04-12 Roland Winkler + + * faces.el (read-face-name): Do not override value of arg default. + Allow single faces and strings as default values. Remove those + elements from return value that are not faces. + (describe-face): Simplify. + (face-at-point): New optional args thing and multiple so that this + function can provide the same functionality previously provided by + read-face-name. + (make-face-bold, make-face-unbold, make-face-italic) + (make-face-unitalic, make-face-bold-italic, invert-face) + (modify-face, read-face-and-attribute): Use face-at-point. + + * cus-edit.el (customize-face, customize-face-other-window) + * cus-theme.el (custom-theme-add-face) + * face-remap.el (buffer-face-set) + * facemenu.el (facemenu-set-face): Use face-at-point. + 2013-04-12 Michael Albinus * info.el (Info-file-list-for-emacs): Add "tramp" and "dbus". === modified file 'lisp/cus-edit.el' --- lisp/cus-edit.el 2013-02-12 04:46:18 +0000 +++ lisp/cus-edit.el 2013-04-13 01:10:09 +0000 @@ -1319,7 +1319,8 @@ Interactively, when point is on text which has a face specified, suggest to customize that face, if it's customizable." - (interactive (list (read-face-name "Customize face" "all faces" t))) + (interactive (list (read-face-name "Customize face" + (or (face-at-point t t) "all faces") t))) (if (member face '(nil "")) (setq face (face-list))) (if (and (listp face) (null (cdr face))) @@ -1350,7 +1351,8 @@ Interactively, when point is on text which has a face specified, suggest to customize that face, if it's customizable." - (interactive (list (read-face-name "Customize face" "all faces" t))) + (interactive (list (read-face-name "Customize face" + (or (face-at-point t t) "all faces") t))) (customize-face face t)) (defalias 'customize-customized 'customize-unsaved) === modified file 'lisp/cus-theme.el' --- lisp/cus-theme.el 2013-01-01 09:11:05 +0000 +++ lisp/cus-theme.el 2013-04-13 01:10:09 +0000 @@ -263,7 +263,7 @@ (defun custom-theme-add-face (face &optional spec) "Add a widget for FACE (a symbol) to the *New Custom Theme* buffer. SPEC, if non-nil, should be a face spec to which to set the widget." - (interactive (list (read-face-name "Face name" nil nil) nil)) + (interactive (list (read-face-name "Face name" (face-at-point t)))) (unless (or (facep face) spec) (error "`%s' has no face definition" face)) (let ((entry (assq face custom-theme-faces))) === modified file 'lisp/face-remap.el' --- lisp/face-remap.el 2013-01-01 09:11:05 +0000 +++ lisp/face-remap.el 2013-04-13 01:10:09 +0000 @@ -378,7 +378,7 @@ This function makes the variable `buffer-face-mode-face' buffer local, and sets it to FACE." - (interactive (list (read-face-name "Set buffer face"))) + (interactive (list (read-face-name "Set buffer face" (face-at-point t)))) (while (and (consp specs) (null (cdr specs))) (setq specs (car specs))) (if (null specs) === modified file 'lisp/facemenu.el' --- lisp/facemenu.el 2013-03-27 16:03:15 +0000 +++ lisp/facemenu.el 2013-04-13 01:10:09 +0000 @@ -329,7 +329,7 @@ if `facemenu-listed-faces' says to do that." (interactive (list (progn (barf-if-buffer-read-only) - (read-face-name "Use face")) + (read-face-name "Use face" (face-at-point t))) (if (and mark-active (not current-prefix-arg)) (region-beginning)) (if (and mark-active (not current-prefix-arg)) === modified file 'lisp/faces.el' --- lisp/faces.el 2013-04-04 02:12:25 +0000 +++ lisp/faces.el 2013-04-13 01:10:09 +0000 @@ -757,7 +757,8 @@ FRAME nil or not specified means change face on all frames. Argument NOERROR is ignored and retained for compatibility. Use `set-face-attribute' for finer control of the font weight." - (interactive (list (read-face-name "Make which face bold"))) + (interactive (list (read-face-name "Make which face bold" + (face-at-point t)))) (set-face-attribute face frame :weight 'bold)) @@ -765,7 +766,8 @@ "Make the font of FACE be non-bold, if possible. FRAME nil or not specified means change face on all frames. Argument NOERROR is ignored and retained for compatibility." - (interactive (list (read-face-name "Make which face non-bold"))) + (interactive (list (read-face-name "Make which face non-bold" + (face-at-point t)))) (set-face-attribute face frame :weight 'normal)) @@ -774,7 +776,8 @@ FRAME nil or not specified means change face on all frames. Argument NOERROR is ignored and retained for compatibility. Use `set-face-attribute' for finer control of the font slant." - (interactive (list (read-face-name "Make which face italic"))) + (interactive (list (read-face-name "Make which face italic" + (face-at-point t)))) (set-face-attribute face frame :slant 'italic)) @@ -782,7 +785,8 @@ "Make the font of FACE be non-italic, if possible. FRAME nil or not specified means change face on all frames. Argument NOERROR is ignored and retained for compatibility." - (interactive (list (read-face-name "Make which face non-italic"))) + (interactive (list (read-face-name "Make which face non-italic" + (face-at-point t)))) (set-face-attribute face frame :slant 'normal)) @@ -791,7 +795,8 @@ FRAME nil or not specified means change face on all frames. Argument NOERROR is ignored and retained for compatibility. Use `set-face-attribute' for finer control of font weight and slant." - (interactive (list (read-face-name "Make which face bold-italic"))) + (interactive (list (read-face-name "Make which face bold-italic" + (face-at-point t)))) (set-face-attribute face frame :weight 'bold :slant 'italic)) @@ -911,7 +916,7 @@ If FACE specifies neither foreground nor background color, set its foreground and background to the background and foreground of the default face. Value is FACE." - (interactive (list (read-face-name "Invert face"))) + (interactive (list (read-face-name "Invert face" (face-at-point t)))) (let ((fg (face-attribute face :foreground frame)) (bg (face-attribute face :background frame))) (if (not (and (eq fg 'unspecified) (eq bg 'unspecified))) @@ -929,85 +934,54 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun read-face-name (prompt &optional default multiple) - "Read one or more face names, defaulting to the face(s) at point. -PROMPT should be a prompt string; it should not end in a space or -a colon. - -The optional argument DEFAULT specifies the default face name(s) -to return if the user just types RET. If its value is non-nil, -it should be a list of face names (symbols or strings); in that case, -the default return value is the `car' of DEFAULT (if the argument -MULTIPLE is non-nil), or DEFAULT (if MULTIPLE is nil). See below -for the meaning of MULTIPLE. - -If DEFAULT is nil, the list of default face names is taken from -the symbol at point and the `read-face-name' property of the text at point, -or, if that is nil, from the `face' property of the text at point. + "Read one or more face names, prompting with PROMPT. +PROMPT should not end in a space or a colon. + +Return DEFAULT if the user enters the empty string. +If DEFAULT is non-nil, it should be a list of face names (symbols or strings). +In that case, return the `car' of DEFAULT (if MULTIPLE is non-nil), +or DEFAULT (if MULTIPLE is nil). See below for the meaning of MULTIPLE. +DEFAULT can also be a single face. This function uses `completing-read-multiple' with \"[ \\t]*,[ \\t]*\" -as the separator regexp. Thus, the user may enter multiple face -names, separated by commas. The optional argument MULTIPLE -specifies the form of the return value. If MULTIPLE is non-nil, -return a list of face names; if the user entered just one face -name, the return value would be a list of one face name. -Otherwise, return a single face name; if the user entered more -than one face name, return only the first one." - ;; Should we better not generate automagically a value for DEFAULT - ;; when `read-face-name' was called with DEFAULT being nil? - ;; Such magic is somewhat unusual for a function `read-...'. - ;; Also, one cannot skip this magic by means of a suitable - ;; value of DEFAULT. It would be cleaner to use - ;; (read-face-name prompt (face-at-point)). - (unless default - ;; Try to get a default face name from the buffer. - (let ((thing (intern-soft (thing-at-point 'symbol)))) - (if (memq thing (face-list)) - (setq default (list thing)))) - ;; Add the named faces that the `read-face-name' or `face' property uses. - (let ((faceprop (or (get-char-property (point) 'read-face-name) - (get-char-property (point) 'face)))) - (if (and (listp faceprop) - ;; Don't treat an attribute spec as a list of faces. - (not (keywordp (car faceprop))) - (not (memq (car faceprop) '(foreground-color background-color)))) - (dolist (face faceprop) - (if (symbolp face) - (push face default))) - (if (symbolp faceprop) - (push faceprop default))) - (delete-dups default))) - - ;; If we only want one, and the default is more than one, - ;; discard the unwanted ones now. - (if (and default (not multiple)) - (setq default (list (car default)))) - - (if default - (setq default (mapconcat (lambda (f) - (if (symbolp f) (symbol-name f) f)) - default ", "))) - - ;; Build up the completion tables. - (let (aliasfaces nonaliasfaces) +as the separator regexp. Thus, the user may enter multiple face names, +separated by commas. + +MULTIPLE specifies the form of the return value. If MULTIPLE is non-nil, +return a list of face names; if the user entered just one face name, +return a list of one face name. Otherwise, return a single face name; +if the user entered more than one face name, return only the first one." + (if (and default (not (stringp default))) + (setq default + (cond ((symbolp default) + (symbol-name default)) + (multiple + (mapconcat (lambda (f) (if (symbolp f) (symbol-name f) f)) + default ", ")) + ;; If we only want one, and the default is more than one, + ;; discard the unwanted ones. + (t (symbol-name (car default)))))) + + (let (aliasfaces nonaliasfaces faces) + ;; Build up the completion tables. (mapatoms (lambda (s) - (if (custom-facep s) + (if (facep s) (if (get s 'face-alias) (push (symbol-name s) aliasfaces) (push (symbol-name s) nonaliasfaces))))) - - (let ((faces - ;; Read the faces. - (mapcar 'intern - (completing-read-multiple - (if default - (format "%s (default `%s'): " prompt default) - (format "%s: " prompt)) - (completion-table-in-turn nonaliasfaces aliasfaces) - nil t nil 'face-name-history default)))) - ;; Return either a list of faces or just one face. - (if multiple - faces - (car faces))))) + (dolist (face (completing-read-multiple + (if default + (format "%s (default `%s'): " prompt default) + (format "%s: " prompt)) + (completion-table-in-turn nonaliasfaces aliasfaces) + nil t nil 'face-name-history default)) + ;; Ignore elements that are not faces + ;; (for example, because DEFAULT was "all faces") + (if (facep face) (push (intern face) faces))) + ;; Return either a list of faces or just one face. + (if multiple + (nreverse faces) + (last faces)))) ;; Not defined without X, but behind window-system test. (defvar x-bitmap-file-path) @@ -1235,7 +1209,7 @@ :slant (if italic-p 'italic 'normal) :underline underline :inverse-video inverse-p) - (setq face (read-face-name "Modify face")) + (setq face (read-face-name "Modify face" (face-at-point t))) (apply #'set-face-attribute face frame (read-all-face-attributes face frame)))) @@ -1247,13 +1221,13 @@ \(a symbol), and NEW-VALUE is value read." (cond ((eq attribute :font) (let* ((prompt "Set font-related attributes of face") - (face (read-face-name prompt)) + (face (read-face-name prompt (face-at-point t))) (font (read-face-font face frame))) (list face font))) (t (let* ((attribute-name (face-descriptive-attribute-name attribute)) (prompt (format "Set %s of face" attribute-name)) - (face (read-face-name prompt)) + (face (read-face-name prompt (face-at-point t))) (new-value (read-face-attribute face attribute frame))) (list face new-value))))) @@ -1363,8 +1337,7 @@ If FRAME is t, report on the defaults for face FACE (for new frames). If FRAME is omitted or nil, use the selected frame." (interactive (list (read-face-name "Describe face" - (if (eq 'default (face-at-point)) - '(default)) + (or (face-at-point t) 'default) t))) (let* ((attrs '((:family . "Family") (:foundry . "Foundry") @@ -1879,23 +1852,33 @@ (when msg (message "Color: `%s'" color)) color)) - -(defun face-at-point () +(defun face-at-point (&optional thing multiple) "Return the face of the character after point. If it has more than one face, return the first one. -Return nil if it has no specified face." - (let* ((faceprop (or (get-char-property (point) 'read-face-name) - (get-char-property (point) 'face) - 'default)) - (face (cond ((symbolp faceprop) faceprop) - ;; List of faces (don't treat an attribute spec). - ;; Just use the first face. - ((and (consp faceprop) (not (keywordp (car faceprop))) - (not (memq (car faceprop) - '(foreground-color background-color)))) - (car faceprop)) - (t nil)))) ; Invalid face value. - (if (facep face) face nil))) +If THING is non-nil try first to get a face name from the buffer. +IF MULTIPLE is non-nil, return a list of all faces. +Return nil if there is no face." + (let (faces) + (if thing + ;; Try to get a face name from the buffer. + (let ((face (intern-soft (thing-at-point 'symbol)))) + (if (facep face) + (push face faces)))) + ;; Add the named faces that the `read-face-name' or `face' property uses. + (let ((faceprop (or (get-char-property (point) 'read-face-name) + (get-char-property (point) 'face)))) + (cond ((facep faceprop) + (push faceprop faces)) + ((and (listp faceprop) + ;; Don't treat an attribute spec as a list of faces. + (not (keywordp (car faceprop))) + (not (memq (car faceprop) + '(foreground-color background-color)))) + (dolist (face faceprop) + (if (facep face) + (push face faces)))))) + (setq faces (delete-dups (nreverse faces))) + (if multiple faces (car faces)))) (defun foreground-color-at-point () "Return the foreground color of the character after point." ------------------------------------------------------------ revno: 112272 fixes bug: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=14191 committer: Stefan Monnier branch nick: trunk timestamp: Fri 2013-04-12 13:32:52 -0400 message: * src/window.c (select_window): `record_buffer' even if window is already selected. diff: === modified file 'src/ChangeLog' --- src/ChangeLog 2013-04-11 16:06:47 +0000 +++ src/ChangeLog 2013-04-12 17:32:52 +0000 @@ -1,3 +1,8 @@ +2013-04-12 Stefan Monnier + + * window.c (select_window): `record_buffer' even if window is + already selected (bug#14191). + 2013-04-11 Eli Zaretskii * window.c (Fwindow_end): Test more flags, including the buffer's @@ -10,8 +15,8 @@ 2013-04-10 Eli Zaretskii * frame.c (do_switch_frame): Mark the TTY frame we switch to as - garbaged only if it is not already the top frame on its TTY. This - prevents flickering due to constant redrawing of TTY frames when + garbaged only if it is not already the top frame on its TTY. + This prevents flickering due to constant redrawing of TTY frames when there are GUI frames open in the same session. (Bug#13864) 2013-04-10 Stefan Monnier @@ -95,7 +100,7 @@ The following changes is to optimize the code for reading UTF-8 files. - * coding.c (check_ascii): Renamed from detect_ascii. Return value + * coding.c (check_ascii): Rename from detect_ascii. Return value changed. Check EOL format. Do not call adjust_coding_eol_type here. (check_utf_8): New function. @@ -287,8 +292,8 @@ * xdisp.c (with_echo_area_buffer_unwind_data): Save window start marker... - (unwind_with_echo_area_buffer): ...to restore it here. This - is needed to ensure that... + (unwind_with_echo_area_buffer): ...to restore it here. + This is needed to ensure that... (redisplay_window): ...both window markers are valid here, which is verified by eassert. * editfns.c (save_excursion_save): Do not assume that @@ -438,10 +443,10 @@ * w32term.c (w32fullscreen_hook): Use FRAME_NORMAL_WIDTH, FRAME_NORMAL_HEIGHT, and FRAME_PREV_FSMODE, instead of static - variables, to save and restore frame dimensions. Use - FRAME_NORMAL_LEFT and FRAME_NORMAL_TOP to restore frame position - after returning from a 'fullscreen' configuration. use - SendMessage instead of PostMessage to send the SC_RESTORE message, + variables, to save and restore frame dimensions. + Use FRAME_NORMAL_LEFT and FRAME_NORMAL_TOP to restore frame position + after returning from a 'fullscreen' configuration. + use SendMessage instead of PostMessage to send the SC_RESTORE message, to avoid races between the main thread and the input thread. * w32term.h (struct w32_output): New members normal_width, @@ -526,10 +531,10 @@ * frame.h (struct frame): Drop resx and resy because the same data is available from window system-specific output context. Adjust users. - (default_pixels_per_inch_x, default_pixels_per_inch_y): New - functions to provide defaults when no window system available. + (default_pixels_per_inch_x, default_pixels_per_inch_y): + New functions to provide defaults when no window system available. (FRAME_RES_X, FRAME_RES_Y): New macros. - (NUMVAL): Moved from xdisp.c. + (NUMVAL): Move from xdisp.c. * font.c (font_pixel_size, font_find_for_lface, font_open_for_lface) (Ffont_face_attributes, Fopen_font): * image.c (gs_load): === modified file 'src/window.c' --- src/window.c 2013-04-11 16:06:47 +0000 +++ src/window.c 2013-04-12 17:32:52 +0000 @@ -489,7 +489,10 @@ Fset_buffer (w->contents); if (EQ (window, selected_window) && !inhibit_point_swap) - return window; + /* `switch-to-buffer' uses (select-window (selected-window)) as a "clever" + way to call record_buffer from Elisp, so it's important that we call + record_buffer before returning here. */ + goto record_and_return; sf = SELECTED_FRAME (); if (XFRAME (WINDOW_FRAME (w)) != sf) @@ -508,7 +511,10 @@ fset_selected_window (sf, window); select_window_1 (window, inhibit_point_swap); + bset_last_selected_window (XBUFFER (w->contents), window); + windows_or_buffers_changed++; + record_and_return: /* record_buffer can run QUIT, so make sure it is run only after we have re-established the invariant between selected_window and selected_frame, otherwise the temporary broken invariant might "escape" (bug#14161). */ @@ -518,8 +524,6 @@ record_buffer (w->contents); } - bset_last_selected_window (XBUFFER (w->contents), window); - windows_or_buffers_changed++; return window; } ------------------------------------------------------------ revno: 112271 committer: Katsumi Yamaoka branch nick: trunk timestamp: Fri 2013-04-12 15:17:47 +0000 message: gnus-msg.el (gnus-msg-mail): Make it avoid using posting styles corresponding to any existing group (Bug#14166) diff: === modified file 'lisp/gnus/ChangeLog' --- lisp/gnus/ChangeLog 2013-04-10 22:14:14 +0000 +++ lisp/gnus/ChangeLog 2013-04-12 15:17:47 +0000 @@ -1,3 +1,8 @@ +2013-04-12 Katsumi Yamaoka + + * gnus-msg.el (gnus-msg-mail): Make it avoid using posting styles + corresponding to any existing group (Bug#14166). + 2013-04-10 Andrew Cohen * nnir.el (number-sequence): No longer used. === modified file 'lisp/gnus/gnus-msg.el' --- lisp/gnus/gnus-msg.el 2013-04-04 22:15:25 +0000 +++ lisp/gnus/gnus-msg.el 2013-04-12 15:17:47 +0000 @@ -538,7 +538,8 @@ (message-mail to subject other-headers continue nil yank-action send-actions return-action)) (let ((buf (current-buffer)) - (gnus-newsgroup-name (or gnus-newsgroup-name "")) + ;; Don't use posting styles corresponding to any existing group. + (gnus-newsgroup-name "") mail-buf) (gnus-setup-message 'message (message-mail to subject other-headers continue ------------------------------------------------------------ revno: 112270 committer: Michael Albinus + + * info.el (Info-file-list-for-emacs): Add "tramp" and "dbus". + 2013-04-10 Tassilo Horn * textmodes/reftex-cite.el (reftex-parse-bibtex-entry): Don't cut === modified file 'lisp/info.el' --- lisp/info.el 2013-03-23 00:38:11 +0000 +++ lisp/info.el 2013-04-12 13:56:03 +0000 @@ -4383,7 +4383,8 @@ ("ietf-drums" . "emacs-mime") ("quoted-printable" . "emacs-mime") ("binhex" . "emacs-mime") ("uudecode" . "emacs-mime") ("mailcap" . "emacs-mime") ("mm" . "emacs-mime") - ("mml" . "emacs-mime")) + ("mml" . "emacs-mime") + "tramp" "dbus") "List of Info files that describe Emacs commands. An element can be a file name, or a list of the form (PREFIX . FILE) where PREFIX is a name prefix and FILE is the file to look in. ------------------------------------------------------------ revno: 112269 committer: Ken Brown branch nick: trunk timestamp: Fri 2013-04-12 09:00:57 -0400 message: * configure.ac (canonical): Adapt to 64-bit Cygwin. diff: === modified file 'ChangeLog' --- ChangeLog 2013-04-09 02:38:56 +0000 +++ ChangeLog 2013-04-12 13:00:57 +0000 @@ -1,3 +1,8 @@ +2013-04-12 Ken Brown + + * configure.ac (canonical): Adapt to 64-bit Cygwin, for which + `canonical' is `x86_64-unknown-cygwin'. + 2013-04-09 Ken Brown * configure.ac (W32_RES_LINK): Remove unneeded linker directive === modified file 'configure.ac' --- configure.ac 2013-04-09 02:38:56 +0000 +++ configure.ac 2013-04-12 13:00:57 +0000 @@ -471,6 +471,11 @@ ## fi ;; + ## Cygwin ports + *-*-cygwin ) + opsys=cygwin + ;; + ## HP 9000 series 700 and 800, running HP/UX hppa*-hp-hpux10.2* ) opsys=hpux10-20 @@ -544,7 +549,6 @@ ## Intel 386 machines where we don't care about the manufacturer. i[3456]86-*-* ) case "${canonical}" in - *-cygwin ) opsys=cygwin ;; *-darwin* ) opsys=darwin ;; *-sysv4.2uw* ) opsys=unixware ;; *-sysv5uw* ) opsys=unixware ;; ------------------------------------------------------------ revno: 112268 fixes bug: http://debbugs.gnu.org/14170 committer: Eli Zaretskii branch nick: trunk timestamp: Thu 2013-04-11 19:06:47 +0300 message: Fix bug #14170 with window-end returning a stale value. This bug was introduced in rudalics@gmx.at-20121015090356-w8597jj7ne5rxyi4 while solving bug #12600. src/window.c (Fwindow_end): Test more flags, including the buffer's last_overlay_modified flag, to determine whether the window's display is really up-to-date. Prevents the function from returning a stale value. (Fwindow_line_height): Fix the test for up-to-date-ness of the current matrix. diff: === modified file 'src/ChangeLog' --- src/ChangeLog 2013-04-10 15:38:20 +0000 +++ src/ChangeLog 2013-04-11 16:06:47 +0000 @@ -1,3 +1,12 @@ +2013-04-11 Eli Zaretskii + + * window.c (Fwindow_end): Test more flags, including the buffer's + last_overlay_modified flag, to determine whether the window's + display is really up-to-date. Prevents the function from + returning a stale value. (Bug#14170) + (Fwindow_line_height): Fix the test for up-to-date-ness of the + current matrix. + 2013-04-10 Eli Zaretskii * frame.c (do_switch_frame): Mark the TTY frame we switch to as === modified file 'src/window.c' --- src/window.c 2013-04-08 18:04:58 +0000 +++ src/window.c 2013-04-11 16:06:47 +0000 @@ -1493,7 +1493,12 @@ b = XBUFFER (buf); if (! NILP (update) - && (windows_or_buffers_changed || !w->window_end_valid) + && (windows_or_buffers_changed + || !w->window_end_valid + || b->clip_changed + || b->prevent_redisplay_optimizations_p + || w->last_modified < BUF_MODIFF (b) + || w->last_overlay_modified < BUF_OVERLAY_MODIFF (b)) && !noninteractive) { struct text_pos startp; @@ -1702,8 +1707,9 @@ /* Fail if current matrix is not up-to-date. */ if (!w->window_end_valid - || current_buffer->clip_changed - || current_buffer->prevent_redisplay_optimizations_p + || windows_or_buffers_changed + || b->clip_changed + || b->prevent_redisplay_optimizations_p || w->last_modified < BUF_MODIFF (b) || w->last_overlay_modified < BUF_OVERLAY_MODIFF (b)) return Qnil;