(require 'cookie1)
(defgroup yow nil
"Quote random zippyisms."
:prefix "yow-"
:group 'games)
(defcustom yow-file (concat data-directory "yow.lines")
"File containing pertinent pinhead phrases."
:type 'file
:group 'yow)
(defconst yow-load-message "Am I CONSING yet?...")
(defconst yow-after-load-message "I have SEEN the CONSING!!")
(defun yow (&optional insert display)
"Return or display a random Zippy quotation. With prefix arg, insert it."
(interactive "P\np")
(let ((yow (cookie yow-file yow-load-message yow-after-load-message)))
(cond (insert
(insert yow))
((not display)
yow)
(t
(message "%s" yow)))))
(defsubst read-zippyism (prompt &optional require-match)
"Read a Zippyism from the minibuffer with completion, prompting with PROMPT.
If optional second arg is non-nil, require input to match a completion."
(read-cookie prompt yow-file yow-load-message yow-after-load-message
require-match))
(defun insert-zippyism (&optional zippyism)
"Prompt with completion for a known Zippy quotation, and insert it at point."
(interactive (list (read-zippyism "Pinhead wisdom: " t)))
(insert zippyism))
(defun apropos-zippy (regexp)
"Return a list of all Zippy quotes matching REGEXP.
If called interactively, display a list of matches."
(interactive "sApropos Zippy (regexp): ")
(cookie yow-file yow-load-message yow-after-load-message)
(let* ((case-fold-search t)
(cookie-table-symbol (intern yow-file cookie-cache))
(string-table (symbol-value cookie-table-symbol))
(matches nil)
(len (length string-table))
(i 0))
(save-match-data
(while (< i len)
(and (string-match regexp (aref string-table i))
(setq matches (cons (aref string-table i) matches)))
(setq i (1+ i))))
(and matches
(setq matches (sort matches 'string-lessp)))
(and (interactive-p)
(cond ((null matches)
(message "No matches found."))
(t
(let ((l matches))
(with-output-to-temp-buffer "*Zippy Apropos*"
(while l
(princ (car l))
(setq l (cdr l))
(and l (princ "\n\n")))
(print-help-return-message))))))
matches))
(defun psychoanalyze-pinhead ()
"Zippy goes to the analyst."
(interactive)
(doctor) (message "")
(switch-to-buffer "*doctor*")
(sit-for 0)
(while (not (input-pending-p))
(insert (yow))
(sit-for 0)
(doctor-ret-or-read 1)
(doctor-ret-or-read 1)))
(provide 'yow)