Function: viper-ring-pop
viper-ring-pop is a byte-compiled function defined in
viper-util.el.gz.
Signature
(viper-ring-pop RING)
Source Code
;; Defined in /usr/src/emacs/lisp/emulation/viper-util.el.gz
;; ring-remove seems to be buggy, so we concocted this for our purposes.
(defun viper-ring-pop (ring)
(let* ((ln (ring-length ring))
(vec (cdr (cdr ring)))
(veclen (length vec))
(hd (car ring))
(idx (max 0 (ring-minus1 hd ln)))
(top-elt (aref vec idx)))
;; shift elements
(while (< (1+ idx) veclen)
(aset vec idx (aref vec (1+ idx)))
(setq idx (1+ idx)))
(aset vec idx nil)
(setq hd (max 0 (ring-minus1 hd ln)))
(if (= hd (1- ln)) (setq hd 0))
(setcar ring hd) ; move head
(setcar (cdr ring) (max 0 (1- ln))) ; adjust length
top-elt
))