Switch to recommended form of GPLv3 permissions notice.
[bpt/emacs.git] / lisp / play / dissociate.el
CommitLineData
55535639 1;;; dissociate.el --- scramble text amusingly for Emacs
c0274f38 2
f2e3589a 3;; Copyright (C) 1985, 2001, 2002, 2003, 2004, 2005,
2f043267 4;; 2006, 2007, 2008 Free Software Foundation, Inc.
9750e079 5
2f14b48d 6;; Maintainer: FSF
e5167999 7;; Keywords: games
2f14b48d 8
a2535589
JA
9;; This file is part of GNU Emacs.
10
b1fc2b50 11;; GNU Emacs is free software: you can redistribute it and/or modify
a2535589 12;; it under the terms of the GNU General Public License as published by
b1fc2b50
GM
13;; the Free Software Foundation, either version 3 of the License, or
14;; (at your option) any later version.
a2535589
JA
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
b1fc2b50 22;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
a2535589 23
e41b2db1
ER
24;;; Commentary:
25
eb8c3be9 26;; The single entry point, `dissociated-press', applies a travesty
e41b2db1
ER
27;; generator to the current buffer. The results can be quite amusing.
28
2f14b48d 29;;; Code:
a2535589 30
f9f9507e 31;;;###autoload
a2535589
JA
32(defun dissociated-press (&optional arg)
33 "Dissociate the text of the current buffer.
34Output goes in buffer named *Dissociation*,
35which is redisplayed each time text is added to it.
36Every so often the user must say whether to continue.
37If ARG is positive, require ARG chars of continuity.
38If ARG is negative, require -ARG words of continuity.
39Default is 2."
40 (interactive "P")
41 (setq arg (if arg (prefix-numeric-value arg) 2))
42 (let* ((inbuf (current-buffer))
43 (outbuf (get-buffer-create "*Dissociation*"))
44 (move-function (if (> arg 0) 'forward-char 'forward-word))
45 (move-amount (if (> arg 0) arg (- arg)))
46 (search-function (if (> arg 0) 'search-forward 'word-search-forward))
47 (last-query-point 0))
8bce0867
RS
48 (if (= (point-max) (point-min))
49 (error "The buffer contains no text to start from"))
a2535589
JA
50 (switch-to-buffer outbuf)
51 (erase-buffer)
52 (while
53 (save-excursion
54 (goto-char last-query-point)
55 (vertical-motion (- (window-height) 4))
56 (or (= (point) (point-max))
57 (and (progn (goto-char (point-max))
58 (y-or-n-p "Continue dissociation? "))
59 (progn
60 (message "")
61 (recenter 1)
62 (setq last-query-point (point-max))
63 t))))
64 (let (start end)
65 (save-excursion
66 (set-buffer inbuf)
67 (setq start (point))
68 (if (eq move-function 'forward-char)
69 (progn
70 (setq end (+ start (+ move-amount (random 16))))
71 (if (> end (point-max))
72 (setq end (+ 1 move-amount (random 16))))
73 (goto-char end))
74 (funcall move-function
75 (+ move-amount (random 16))))
76 (setq end (point)))
77 (let ((opoint (point)))
78 (insert-buffer-substring inbuf start end)
79 (save-excursion
80 (goto-char opoint)
81 (end-of-line)
82 (and (> (current-column) fill-column)
83 (do-auto-fill)))))
84 (save-excursion
85 (set-buffer inbuf)
86 (if (eobp)
87 (goto-char (point-min))
88 (let ((overlap
89 (buffer-substring (prog1 (point)
90 (funcall move-function
91 (- move-amount)))
92 (point))))
82305cbd 93 (goto-char (1+ (random (1- (point-max)))))
a2535589
JA
94 (or (funcall search-function overlap nil t)
95 (let ((opoint (point)))
96 (goto-char 1)
97 (funcall search-function overlap opoint t))))))
98 (sit-for 0))))
c0274f38 99
d2fe6685
GM
100(random t)
101
896546cd
RS
102(provide 'dissociate)
103
cbee283d 104;; arch-tag: 90d197d1-409b-45c5-a0b5-fbfb2e06334f
c0274f38 105;;; dissociate.el ends here