
Hi, I am sending a little patch that improves the commands slime-edit-definition-other-window and ...-frame. Would someone like to merge it into CVS? Cheers, Matthias 2005-03-27 Matthias Koeppe <mkoeppe@mail.math.uni-magdeburg.de> * slime.el (slime-keys): Bind slime-edit-definition-other-window to `C-x 4 .' and slime-edit-definition-other-frame to `C-x 5 .', shadowing the equivalent find-tag... bindings. (slime-goto-definition-other-window-aux): New function, adapted from the Emacs function find-tag-other-window. (slime-goto-definition): In the other-window and other-frame cases, make sure point does not move in the originating window, even when the definition is found in the same buffer. --- slime.el.~1.473.~ 2005-03-27 16:35:04.000000000 +0200 +++ slime.el 2005-03-27 17:02:06.000000000 +0200 @@ -555,6 +555,8 @@ ("\C-i" slime-complete-symbol :prefixed t :inferior t) ("\M-i" slime-fuzzy-complete-symbol :prefixed t :inferior t) ("\M-." slime-edit-definition :inferior t :sldb t) + ("\C-x4." slime-edit-definition-other-window :inferior t :sldb t) + ("\C-x5." slime-edit-definition-other-frame :inferior t :sldb t) ("\M-," slime-pop-find-definition-stack :inferior t :sldb t) ("\M-*" slime-pop-find-definition-stack :inferior t :sldb t) ("\C-q" slime-close-parens-at-point :prefixed t :inferior t) @@ -5122,18 +5124,41 @@ (error "No known definition for: %s" name)) (slime-goto-definition name definitions where)))) +(defun slime-goto-definition-other-window-aux (definition) + ;; Taken from the Emacs function `find-tag-other-window': + ;; This hair is to deal with the case where the tag is found in the + ;; selected window's buffer; without the hair, point is moved in both + ;; windows. To prevent this, we save the selected window's point before + ;; doing find-tag-noselect, and restore it after. + (let ((window-point (window-point (selected-window)))) + (slime-goto-source-location (slime-definition.location + definition)) + (let ((tagbuf (current-buffer)) + (tagpoint (point))) + (set-window-point (prog1 + (selected-window) + (switch-to-buffer-other-window tagbuf) + ;; We have to set this new window's point; it + ;; might already have been displaying a + ;; different portion of tagbuf, in which case + ;; switch-to-buffer-other-window doesn't set + ;; the window's point from the buffer. + (set-window-point (selected-window) tagpoint)) + window-point)))) + (defun slime-goto-definition (name definitions &optional where) (slime-push-definition-stack) (cond ((slime-length> definitions 1) (slime-show-definitions name definitions)) (t - (slime-goto-source-location (slime-definition.location - (car definitions))) (cond ((equal where 'window) - (switch-to-buffer-other-window (current-buffer))) + (slime-goto-definition-other-window-aux (car definitions))) ((equal where 'frame) - (switch-to-buffer-other-frame (current-buffer))) + (let ((pop-up-frames t)) + (slime-goto-definition-other-window-aux (car definitions)))) (t + (slime-goto-source-location (slime-definition.location + (car definitions))) (switch-to-buffer (current-buffer))))))) (defun slime-edit-definition-other-window (name) -- Matthias Koeppe -- http://www.math.uni-magdeburg.de/~mkoeppe