comparison lisp/simple.el @ 20465:de641c2459a6

(transpose-subr): Rewrite to make faster with big move counts. (transpose-lines): In the mover function handle arbitrary move counts.
author Andreas Schwab <schwab@suse.de>
date Wed, 17 Dec 1997 13:54:03 +0000
parents 931b472be076
children 1fe822fa93e6
comparison
equal deleted inserted replaced
20464:9c811b2d0836 20465:de641c2459a6
2260 With argument ARG, takes previous line and moves it past ARG lines. 2260 With argument ARG, takes previous line and moves it past ARG lines.
2261 With argument 0, interchanges line point is in with line mark is in." 2261 With argument 0, interchanges line point is in with line mark is in."
2262 (interactive "*p") 2262 (interactive "*p")
2263 (transpose-subr (function 2263 (transpose-subr (function
2264 (lambda (arg) 2264 (lambda (arg)
2265 (if (= arg 1) 2265 (if (> arg 0)
2266 (progn 2266 (progn
2267 ;; Move forward over a line, 2267 ;; Move forward over ARG lines,
2268 ;; but create a newline if none exists yet. 2268 ;; but create newlines if necessary.
2269 (end-of-line) 2269 (setq arg (forward-line arg))
2270 (if (eobp) 2270 (if (/= (preceding-char) ?\n)
2271 (newline) 2271 (setq arg (1+ arg)))
2272 (forward-char 1))) 2272 (if (> arg 0)
2273 (newline arg)))
2273 (forward-line arg)))) 2274 (forward-line arg))))
2274 arg)) 2275 arg))
2275 2276
2276 (defun transpose-subr (mover arg) 2277 (defun transpose-subr (mover arg)
2277 (let (start1 end1 start2 end2) 2278 (let (start1 end1 start2 end2)
2286 (funcall mover 1) 2287 (funcall mover 1)
2287 (setq end1 (point)) 2288 (setq end1 (point))
2288 (funcall mover -1) 2289 (funcall mover -1)
2289 (setq start1 (point)) 2290 (setq start1 (point))
2290 (transpose-subr-1)) 2291 (transpose-subr-1))
2291 (exchange-point-and-mark))) 2292 (exchange-point-and-mark))
2292 (while (> arg 0) 2293 (if (> arg 0)
2293 (funcall mover -1) 2294 (progn
2294 (setq start1 (point)) 2295 (funcall mover -1)
2295 (funcall mover 1) 2296 (setq start1 (point))
2296 (setq end1 (point)) 2297 (funcall mover 1)
2297 (funcall mover 1) 2298 (setq end1 (point))
2298 (setq end2 (point)) 2299 (funcall mover arg)
2299 (funcall mover -1) 2300 (setq end2 (point))
2300 (setq start2 (point)) 2301 (funcall mover (- arg))
2301 (transpose-subr-1) 2302 (setq start2 (point))
2302 (goto-char end2) 2303 (transpose-subr-1)
2303 (setq arg (1- arg))) 2304 (goto-char end2))
2304 (while (< arg 0) 2305 (funcall mover -1)
2305 (funcall mover -1) 2306 (setq start2 (point))
2306 (setq start2 (point)) 2307 (funcall mover 1)
2307 (funcall mover -1) 2308 (setq end2 (point))
2308 (setq start1 (point)) 2309 (funcall mover (1- arg))
2309 (funcall mover 1) 2310 (setq start1 (point))
2310 (setq end1 (point)) 2311 (funcall mover (- arg))
2311 (funcall mover 1) 2312 (setq end1 (point))
2312 (setq end2 (point)) 2313 (transpose-subr-1)))))
2313 (transpose-subr-1)
2314 (setq arg (1+ arg)))))
2315 2314
2316 (defun transpose-subr-1 () 2315 (defun transpose-subr-1 ()
2317 (if (> (min end1 end2) (max start1 start2)) 2316 (if (> (min end1 end2) (max start1 start2))
2318 (error "Don't have two things to transpose")) 2317 (error "Don't have two things to transpose"))
2319 (let* ((word1 (buffer-substring start1 end1)) 2318 (let* ((word1 (buffer-substring start1 end1))