daveemme@amdahl.uts.amdahl.com (Dave Emme) (09/22/88)
A while ago I saw a reference in this newsgroup to a kill-ring browser.
Unfortunately I missed the source posting, but it sounded like such a good
idea that I wrote my own. I have no idea how this compares with other such
functions, but here it is. Hope it's useful to someone ...
-- Dave Emme
------------------------------------------------------------------------------
(Insert disclaimer of your choice here)
Dave Emme (M/S 316) daveemme@uts.amdahl.com
Amdahl Corporation {ames, decwrl, sun, uunet}!amdahl!daveemme
1250 E. Arques Ave.
Sunnyvale, CA 94088
------------------------------ Cut Here ------------------------------
;;;===========================================================================
;;; Browse Kill Ring
;;; written by Dave Emme
;;; Revised: Tue 09/20/88 12:10:39
;;;===========================================================================
(provide 'b-k-ring)
(defvar browse-kill-ring-keymap nil
"Keymap used in browse-kill-ring buffer")
(defvar browse-kill-one-window nil
"True if there was only one window when browse-kill-ring was invoked.")
(defvar browse-kill-calling-window nil
"Window which was current when browse-kill-ring was invoked.
The yank will go into this window.")
(defvar browse-kill-ring-bufname "*Browse Kill Ring*"
"Name of the browse-kill-ring buffer.")
(if (not browse-kill-ring-keymap)
(setq browse-kill-ring-keymap (make-sparse-keymap)))
(define-key browse-kill-ring-keymap " " 'browse-kill-ring-yank-line)
(define-key browse-kill-ring-keymap "y" 'browse-kill-ring-yank-line)
(define-key browse-kill-ring-keymap "Y" 'browse-kill-ring-yank-line)
(define-key browse-kill-ring-keymap "\C-y" 'browse-kill-ring-yank-line)
(defun browse-kill-ring ()
"Browses the kill ring in another buffer.
Use C-y to yank most recent kill ring entry (number 1.) into the buffer
which was current when browse-kill-ring was invoked. Use a numeric argument
(M-# C-y) to yank the corresponding entry.
If you move point into the browse-kill-ring buffer, the keys C-y, y, Y, or SPC
will yank the entry on the current line into the previous buffer.
Note that browse-kill-ring should always be called before its contents is used;
its buffer is not automatically updated when kills and yanks are done. This is
normally not a problem, since yanks will cause the buffer to be deleted
automatically."
(interactive)
(setq browse-kill-one-window (one-window-p)
browse-kill-calling-window (selected-window))
(let ((n 1)
(ring-length (length kill-ring))
(orig-buf (current-buffer)))
(if (= ring-length 0)
(error "Kill ring is empty")
(progn
(pop-to-buffer browse-kill-ring-bufname)
(setq buffer-read-only nil)
(erase-buffer)
(use-local-map browse-kill-ring-keymap)
(while (<= n ring-length)
(insert (int-to-string n)
". "
(car kill-ring-yank-pointer)
"\n")
(setq n (1+ n))
(rotate-yank-pointer 1))
(delete-backward-char 1) ;last "\n"
(setq buffer-read-only t)
(beginning-of-buffer)
(pop-to-buffer orig-buf)
(message "%d of %d kill-ring entries used."
ring-length kill-ring-max)))))
(defun browse-kill-ring-yank-line ()
"Yank text represented by the current line in the
browse-kill-ring buffer into the calling buffer.
Normally bound to keys C-y, y, Y, SPC while in the
browse-kill-ring buffer."
(interactive)
(let ((line 0)
(string)
(mk))
;; We get the yank argument from the number at the beginning
;; of the line point is on. In case of multi-line entries,
;; scan backwards until a numbered line is found.
(save-excursion
(while (= line 0)
(beginning-of-line)
(setq mk (point))
(end-of-line)
(setq string (buffer-substring mk (point)))
(if (or (string-equal string "")
(not (numberp
(setq line (car (read-from-string string))))))
(progn (setq line 0)
(previous-line 1)))))
;; "line" now has the logical number of the yank entry
(select-window browse-kill-calling-window)
(yank line)))
(defun browse-kill-yank-hook ()
;; Look for our buffer. If it exists, delete it because yank will
;; probably invalidate its contents. Also delete its window if it
;; caused the screen to split.
(save-excursion
(let ((buf-list (buffer-list))
(win (selected-window)))
(catch 'browse-kill
(while buf-list
(if (string-equal browse-kill-ring-bufname
(buffer-name (car buf-list)))
(progn
(if browse-kill-one-window
(delete-windows-on (car buf-list)))
(kill-buffer (car buf-list))
(throw 'browse-kill nil))
(setq buf-list (cdr buf-list)))))
(select-window win))))
(defun yank (&optional arg)
"Reinsert the last stretch of killed text.
More precisely, reinsert the stretch of killed text most recently
killed OR yanked.
With just C-U as argument, same but put point in front (and mark at end).
With argument n, reinsert the nth most recently killed stretch of killed
text.
See also the command \\[yank-pop]."
;; Modified to interact with browse-kill-ring.
(interactive "*P")
(browse-kill-yank-hook)
(rotate-yank-pointer (if (listp arg) 0
(if (eq arg '-) -1
(1- arg))))
(push-mark (point))
(insert (car kill-ring-yank-pointer))
(if (consp arg)
(exchange-point-and-mark)))
--
------------------------------------------------------------------------------
(Insert disclaimer of your choice here)
Dave Emme (M/S 316) daveemme@uts.amdahl.com
Amdahl Corporation {ames, decwrl, sun, uunet}!amdahl!daveemme
1250 E. Arques Ave.
Sunnyvale, CA 94088mende@athos.rutgers.edu (Bob Mende Pie) (09/26/88)
Hi ...
I was the person who wrote the kill-ring-browser a number of months
ago... It has more funcunality than the one that
daveemme@amdahl.uts.amdahl.com wrote (not trying to belittle his work).
Here is a quick decribe mode.
Browse Yank Mode:
Major mode for browsing, editing, and inserting elements of the
kill-ring. This is a browse-yank specific facility, and should be
only used by the function browse-yank (see browse-yank). Commands
are:
e browse-yank-edit
g browse-yank-to-register
h browse-yank-help
i browse-yank-insert
j browse-yank-goto-yank
l browse-yank-locate-regexp
m browse-yank-yanks-saved
n browse-yank-next-yank
p browse-yank-previous-yank
q browse-yank-quit
r browse-yank-search-backward
s browse-yank-search-forward
< browse-yank-goto-first
> browse-yank-goto-last
? describe-mode
C-x Prefix Command
C-g browse-yank-abort
C-x RET browse-yank-insert
If anyone is intrested in this, please mail to me and I will mail it to
you... if there is lots of intrest I will repost it.
/Bob...
--
{...}!rutgers!mende mende@aramis.rutgers.edu mende@zodiac.bitnet
LBJ, LBJ, how many JOKES did you tell today??!