GNU Info

Info Node: (emacs-lisp-intro.info)yank-pop

(emacs-lisp-intro.info)yank-pop


Prev: yank Up: Kill Ring
Enter node , (file) or (file)node

`yank-pop'
==========

   After understanding `yank', the `yank-pop' function is easy.
Leaving out the documentation to save space, it looks like this:

     (defun yank-pop (arg)
       (interactive "*p")
       (if (not (eq last-command 'yank))
           (error "Previous command was not a yank"))
       (setq this-command 'yank)
       (let ((before (< (point) (mark))))
         (delete-region (point) (mark))
         (rotate-yank-pointer arg)
         (set-mark (point))
         (insert (car kill-ring-yank-pointer))
         (if before (exchange-point-and-mark))))

   The function is interactive with a small `p' so the prefix argument
is processed and passed to the function.  The command can only be used
after a previous yank; otherwise an error message is sent.  This check
uses the variable `last-command' which is discussed elsewhere.  (Note:
copy-region-as-kill.)

   The `let' clause sets the variable `before' to true or false
depending whether point is before or after mark and then the region
between point and mark is deleted.  This is the region that was just
inserted by the previous yank and it is this text that will be
replaced.  Next the `kill-ring-yank-pointer' is rotated so that the
previously inserted text is not reinserted yet again.  Mark is set at
the beginning of the place the new text will be inserted and then the
first element to which `kill-ring-yank-pointer' points is inserted.
This leaves point after the new text.  If in the previous yank, point
was left before the inserted text, point and mark are now exchanged so
point is again left in front of the newly inserted text.  That is all
there is to it!


automatically generated by info2www version 1.2.2.9