Initial revision
[bpt/emacs.git] / lisp / play / dissociate.el
CommitLineData
a2535589
JA
1;; Scramble text amusingly for Emacs.
2;; Copyright (C) 1985 Free Software Foundation, Inc.
3
4;; This file is part of GNU Emacs.
5
6;; GNU Emacs is free software; you can redistribute it and/or modify
7;; it under the terms of the GNU General Public License as published by
8;; the Free Software Foundation; either version 1, or (at your option)
9;; any later version.
10
11;; GNU Emacs is distributed in the hope that it will be useful,
12;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14;; GNU General Public License for more details.
15
16;; You should have received a copy of the GNU General Public License
17;; along with GNU Emacs; see the file COPYING. If not, write to
18;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19
20
21(defun dissociated-press (&optional arg)
22 "Dissociate the text of the current buffer.
23Output goes in buffer named *Dissociation*,
24which is redisplayed each time text is added to it.
25Every so often the user must say whether to continue.
26If ARG is positive, require ARG chars of continuity.
27If ARG is negative, require -ARG words of continuity.
28Default is 2."
29 (interactive "P")
30 (setq arg (if arg (prefix-numeric-value arg) 2))
31 (let* ((inbuf (current-buffer))
32 (outbuf (get-buffer-create "*Dissociation*"))
33 (move-function (if (> arg 0) 'forward-char 'forward-word))
34 (move-amount (if (> arg 0) arg (- arg)))
35 (search-function (if (> arg 0) 'search-forward 'word-search-forward))
36 (last-query-point 0))
37 (switch-to-buffer outbuf)
38 (erase-buffer)
39 (while
40 (save-excursion
41 (goto-char last-query-point)
42 (vertical-motion (- (window-height) 4))
43 (or (= (point) (point-max))
44 (and (progn (goto-char (point-max))
45 (y-or-n-p "Continue dissociation? "))
46 (progn
47 (message "")
48 (recenter 1)
49 (setq last-query-point (point-max))
50 t))))
51 (let (start end)
52 (save-excursion
53 (set-buffer inbuf)
54 (setq start (point))
55 (if (eq move-function 'forward-char)
56 (progn
57 (setq end (+ start (+ move-amount (random 16))))
58 (if (> end (point-max))
59 (setq end (+ 1 move-amount (random 16))))
60 (goto-char end))
61 (funcall move-function
62 (+ move-amount (random 16))))
63 (setq end (point)))
64 (let ((opoint (point)))
65 (insert-buffer-substring inbuf start end)
66 (save-excursion
67 (goto-char opoint)
68 (end-of-line)
69 (and (> (current-column) fill-column)
70 (do-auto-fill)))))
71 (save-excursion
72 (set-buffer inbuf)
73 (if (eobp)
74 (goto-char (point-min))
75 (let ((overlap
76 (buffer-substring (prog1 (point)
77 (funcall move-function
78 (- move-amount)))
79 (point))))
80 (let (ranval)
81 (while (< (setq ranval (random)) 0))
82 (goto-char (1+ (% ranval (1- (point-max))))))
83 (or (funcall search-function overlap nil t)
84 (let ((opoint (point)))
85 (goto-char 1)
86 (funcall search-function overlap opoint t))))))
87 (sit-for 0))))