Last week I reported on a problem where a buffer in the slime-typeout
window would be overwritten if the *SLIME-Typeout* buffer is killed
by the user.
A suggested fix follows:
The code calls the function slime-typeout-active-p in order to assure
the window is open. However, this call does NOT insure that the
correct buffer is exposed in that window. The saved window is in the
variable "slime-typeout-window", but this will reflect any exposed
buffer in that window, not "*SLIME-Typeout*".
I have modified the slime-typeout-active-p function as follows, to
make sure that the window has the correct buffer in the foreground
before the caller does the write. (There is still the potential for a
collision if the buffer is switched between calling this function and
writing to it, however, I'm unfamiliar with mechanisms for locking
frames in emacs to prevent that). Instead, perhaps for full safety,
the call (window-buffer slime-typeout-window) in slime-typeout-
message should be (get-buffer-create "*SLIME-Typeout*") instead. That
way the write always occurs to the correct buffer, and not the one
that happens to be exposed.
At least on my local copy, these functions works normally, and
killing *SLIME-Typeout* causes it to be restored before, e.g.,
showing the arglist for the function at prompt while in the slime REPL.
These patches fix two problems: 1) that the use of the typeout window
may go to the wrong buffer if the wrong buffer happens to be exposed
and 2) that the *SLIME-Typeout* buffer is not exposed in the window
created for that express purpose.
Allow me to suggest these patchs for inclusion in the CVS.
(defun slime-typeout-active-p () ;; modified 2/6/06 BWM
(cond
((and slime-typeout-window
(window-live-p slime-typeout-window))
(save-selected-window
(select-window slime-typeout-window)
(switch-to-buffer "*SLIME-Typeout*"))
t) ; return true -it's active and ready
(t
nil)))
(defun slime-typeout-message (format-string &rest format-args)
(assert (slime-typeout-active-p))
(with-current-buffer (get-buffer-create "*SLIME-Typeout*") ;;
modified 2/6/06 BWM
(erase-buffer)
(insert (apply #'format format-string format-args))))