(forward-line arg))))
arg))
+(defun transpose-regions (startr1 endr1 startr2 endr2 &optional leave-markers)
+ "Transpose region STARTR1 to ENDR1 with STARTR2 to ENDR2.
+The regions should not be overlapping, because the size of the buffer is
+never changed in a transposition.
+
+Optional fifth arg LEAVE-MARKERS, if non-nil, means don't update
+any markers that happen to be located in the regions.
+
+Transposing beyond buffer boundaries is an error.
+
+Interactively, STARTR1 and ENDR1 are point and mark; STARTR2 and ENDR2
+are the last two marks pushed to the mark ring; LEAVE-MARKERS is nil.
+If a prefix argument N is given, STARTR2 and ENDR2 are the two
+successive marks N entries back in the mark ring. A negative prefix
+argument instead counts forward from the oldest mark in the mark
+ring."
+ (interactive
+ (if (< (length mark-ring) 2)
+ (error "Other region must be marked before transposing two regions")
+ (let* ((num (if current-prefix-arg
+ (prefix-numeric-value current-prefix-arg)
+ 0))
+ (ring-length (length mark-ring))
+ (eltnum (mod num ring-length))
+ (eltnum2 (mod (1+ num) ring-length)))
+ (list (point) (mark) (elt mark-ring eltnum) (elt mark-ring eltnum2)))))
+ (transpose-regions-internal startr1 endr1 startr2 endr2 leave-markers))
+
;; FIXME seems to leave point BEFORE the current object when ARG = 0,
;; which seems inconsistent with the ARG /= 0 case.
;; FIXME document SPECIAL.
}
}
-DEFUN ("transpose-regions", Ftranspose_regions, Stranspose_regions, 4, 5,
- "(if (< (length mark-ring) 2)\
- (error \"Other region must be marked before transposing two regions\")\
- (let* ((num (if current-prefix-arg\
- (prefix-numeric-value current-prefix-arg)\
- 0))\
- (ring-length (length mark-ring))\
- (eltnum (mod num ring-length))\
- (eltnum2 (mod (1+ num) ring-length)))\
- (list (point) (mark) (elt mark-ring eltnum) (elt mark-ring eltnum2))))",
+DEFUN ("transpose-regions-internal", Ftranspose_regions_internal, Stranspose_regions_internal, 4, 5, 0,
doc: /* Transpose region STARTR1 to ENDR1 with STARTR2 to ENDR2.
The regions should not be overlapping, because the size of the buffer is
never changed in a transposition.
Optional fifth arg LEAVE-MARKERS, if non-nil, means don't update
any markers that happen to be located in the regions.
-Transposing beyond buffer boundaries is an error.
-
-Interactively, STARTR1 and ENDR1 are point and mark; STARTR2 and ENDR2
-are the last two marks pushed to the mark ring; LEAVE-MARKERS is nil.
-If a prefix argument N is given, STARTR2 and ENDR2 are the two
-successive marks N entries back in the mark ring. A negative prefix
-argument instead counts forward from the oldest mark in the mark
-ring. */)
+Transposing beyond buffer boundaries is an error. */)
(Lisp_Object startr1, Lisp_Object endr1, Lisp_Object startr2, Lisp_Object endr2, Lisp_Object leave_markers)
{
register ptrdiff_t start1, end1, start2, end2;
defsubr (&Swiden);
defsubr (&Snarrow_to_region);
defsubr (&Ssave_restriction);
- defsubr (&Stranspose_regions);
+ defsubr (&Stranspose_regions_internal);
}