[slime-devel] Patch: slime-inspector-previous-inspectable-object
Matthias Koeppe
mkoeppe+slime at mail.math.uni-magdeburg.de
Tue Dec 21 15:09:47 UTC 2004
The patch below adds a command `slime-inspector-previous-inspectable-object'
and binds it to S-TAB in slime-inspector-mode. Moreover, the command
`slime-inspector-next-inspectable-object' now accepts a prefix argument. The
patch also makes wrapping around more reliable.
I have adapted the code from the Emacs function `widget-move', which is used
for similar functionality in Emacs Customize buffers.
Index: slime.el
===================================================================
RCS file: /project/slime/cvsroot/slime/slime.el,v
retrieving revision 1.443
diff -u -p -u -r1.443 slime.el
--- slime.el 16 Dec 2004 22:24:41 -0000 1.443
+++ slime.el 21 Dec 2004 14:55:34 -0000
@@ -6882,18 +6892,58 @@ Optionally set point to POINT."
(set-window-configuration slime-saved-window-config)
(kill-buffer (current-buffer)))
-(defun slime-inspector-next-inspectable-object ()
- "sets the point to the next inspectable object"
- (interactive)
- (let ((pos (if (get-text-property (point) 'slime-part-number)
- ;; we're in a part
- (next-single-property-change
- (or (next-single-property-change (point) 'slime-part-number) (point-min))
- 'slime-part-number)
- ;; go to the next part or wrap around
- (or (next-single-property-change (point) 'slime-part-number)
- (next-single-property-change (point-min) 'slime-part-number)))))
- (when pos (goto-char pos))))
+(defun slime-inspector-next-inspectable-object (arg)
+ "Move point to the next inspectable object.
+With optional ARG, move across that many objects.
+If ARG is negative, move backwards."
+ (interactive "p")
+ (or (bobp) (> arg 0) (backward-char))
+ (let ((wrapped 0)
+ (number arg)
+ (old (get-text-property (point) 'slime-part-number))
+ new)
+ ;; Forward.
+ (while (> arg 0)
+ (cond ((eobp)
+ (goto-char (point-min))
+ (setq wrapped (1+ wrapped)))
+ (t
+ (goto-char (or (next-single-property-change (point) 'slime-part-number)
+ (point-max)))))
+ (and (= wrapped 2)
+ (eq arg number)
+ (error "No inspectable objects"))
+ (let ((new (get-text-property (point) 'slime-part-number)))
+ (when new
+ (unless (eq new old)
+ (setq arg (1- arg))
+ (setq old new)))))
+ ;; Backward.
+ (while (< arg 0)
+ (cond ((bobp)
+ (goto-char (point-max))
+ (setq wrapped (1+ wrapped)))
+ (t
+ (goto-char (or (previous-single-property-change (point) 'slime-part-number)
+ (point-min)))))
+ (and (= wrapped 2)
+ (eq arg number)
+ (error "No inspectable objects"))
+ (let ((new (get-text-property (point) 'slime-part-number)))
+ (when new
+ (unless (eq new old)
+ (setq arg (1+ arg))))))
+ (let ((new (get-text-property (point) 'slime-part-number)))
+ (while (eq (get-text-property (point) 'slime-part-number) new)
+ (backward-char)))
+ (forward-char)))
+
+(defun slime-inspector-previous-inspectable-object (arg)
+ "Move point to the previous inspectable object.
+With optional ARG, move across that many objects.
+If ARG is negative, move forwards."
+ (interactive "p")
+ (slime-inspector-next-inspectable-object (- arg)))
(defun slime-inspector-describe ()
(interactive)
@@ -6909,6 +6959,7 @@ Optionally set point to POINT."
("d" 'slime-inspector-describe)
("q" 'slime-inspector-quit)
("\C-i" 'slime-inspector-next-inspectable-object)
+ ([(shift tab)] 'slime-inspector-previous-inspectable-object)
("\M-." 'slime-edit-definition))
--
Matthias Koeppe -- http://www.math.uni-magdeburg.de/~mkoeppe
More information about the slime-devel
mailing list