In VI, the granularity of undoing is much coarser than in Emacs.
Several ops that Emacs undoes in multiple steps are supposed to be
undone with just one "undo" in VI. Viper simulates this by inserting
viper-buffer-undo-list-mark onto buffer-undo-list to mark the point to
which the Emacs undo's are to be run in order to accomplish one
VI-style undo. In Emacs, as I vaguely remember, this role is played by
nil(?), but VI-style undos are coarser than that, so viper requires
its own marker on the unfo list.
Yes, you are correct -- boundaries are nil.
Viper puts it's own mark in, yes, but then deletes it later on and
replaces it with nil in this bit of code.
(setq tmp2 (cdr tmp)) ; the part after mark
;; cut tail from buffer-undo-list temporarily by direct
;; manipulation with pointers in buffer-undo-list
(setcdr tmp nil)
(setq buffer-undo-list (delq nil buffer-undo-list))
(setq buffer-undo-list
(delq viper-buffer-undo-list-mark buffer-undo-list))
;; restore tail of buffer-undo-list
(setq buffer-undo-list (nconc buffer-undo-list tmp2)))
Essentially, it just kills the standard boundary handling and does it's
own thing.