
mbaringer@common-lisp.net (Marco Baringer) writes:
Index: slime/ChangeLog diff -u slime/ChangeLog:1.1291 slime/ChangeLog:1.1293 --- slime/ChangeLog:1.1291 Sun Feb 17 07:28:27 2008 +++ slime/ChangeLog Wed Feb 20 17:12:37 2008 @@ -1,3 +1,41 @@ +2008-02-20 Helmut Eller <heller@common-lisp.net> + + Better factorization for M-. and xref commands. + + * slime.el (slime-xref): Renamed from slime-definition. + (slime-location, slime-location-p): New ADT def. + (slime-xref-has-location-p, slime-analyze-xrefs): New functions. + This work used to be done on the Lisp side. + (slime-pop-to-location): New function. + (slime-edit-definition, slime-edit-definition-cont): Simplified. + (slime-find-definitions): New function. + (slime-goto-definition, slime-goto-definition-other-window) + (slime-pop-to-other-window, slime-show-definitions): Deleted. + (slime-insert-xrefs): Simplified. + (slime-insert-xref-location): Deleted. No need to show the filename + twice.
Nice work! Do you mind the following patch? In the xref buffer, it'll make the source of definitions that came from interactively defining (i.e. C-c C-c) more explicit. It'll display them as #<buffer foo.lisp> (DEFMETHOD QUUX T T) instead of foo.lisp (DEFMETHOD QUUX T T) I consider it to be useful to directly see that some definition was done interactively, especially when working with a long-living image. (ATM you can only deduce this from the fact that definitions from files most likely result in absolute paths.) -T. Index: slime.el =================================================================== RCS file: /project/slime/cvsroot/slime/slime.el,v retrieving revision 1.906 diff -u -r1.906 slime.el --- slime.el 20 Feb 2008 22:12:37 -0000 1.906 +++ slime.el 21 Feb 2008 11:37:38 -0000 @@ -5189,11 +5189,19 @@ (slime-alistify xrefs (lambda (x) (if (slime-xref-has-location-p x) - (cadr - (slime-location.buffer (slime-xref.location x))) + (slime-location-to-string (slime-xref.location x)) "Error")) #'equal))) +(defun slime-location-to-string (location) + (destructure-case (slime-location.buffer location) + ((:file filename) filename) + ((:buffer bufname) + (let ((buffer (get-buffer bufname))) + (if buffer + (format "%S" buffer) ; "#<buffer foo.lisp>" + (format "%s (previously existing buffer)" bufname)))))) + (defun slime-pop-to-location (location &optional where) (ecase where ((nil)