Zone Mode ‘zones’ Emacs out, choosing one of its random modes to obfuscate the current buffer, which can be used as a screensaver.
Try it with ‘M-x zone’.
To enable Zone Mode for all buffers after Emacs is idle for 2 minutes, add the following Lisp code to you InitFile or try it out by EvaluatingExpressions.
(require 'zone) (zone-when-idle 120)
This will also enable Zone Mode after 2 minutes of idle.
(setq zone-timer (run-with-idle-timer 120 t 'zone))
If you want to try out a particular Zone program, here is an interactive command, ‘M-x zone-choose’,
(defun zone-choose (pgm) "Choose a PGM to run for `zone'." (interactive (list (completing-read "Program: " (mapcar 'symbol-name zone-programs)))) (let ((zone-programs (list (intern pgm)))) (zone)))
To make your own program, add it to ‘zone-programs’.
(eval-after-load "zone" '(unless (memq 'zone-pgm-md5 (append zone-programs nil)) (setq zone-programs (vconcat zone-programs [zone-pgm-md5]))))
Here’s an example Zone program that outputs lines that are the result of iteratively finding the md5 checksum of checksums. A program is typically just a function that performs various insertion and deletions within the buffer. Zone Mode operates on a copy of a buffer, so there’s no reason to operate on buffers or undo your changes. The facilities in Zone do this for you.
(defun zone-pgm-md5 () "MD5 the buffer, then recursively checksum each hash." (let ((prev-md5 (buffer-substring-no-properties ;; Initialize. (point-min) (point-max)))) ;; Whitespace-fill the window. (zone-fill-out-screen (window-width) (window-height)) (random t) (goto-char (point-min)) (while (not (input-pending-p)) (when (eobp) (goto-char (point-min))) (while (not (eobp)) (delete-region (point) (line-end-position)) (let ((next-md5 (md5 prev-md5))) (insert next-md5) (setq prev-md5 next-md5)) (forward-line 1) (zone-park/sit-for (point-min) 0.1)))))
With the following you can lock X11 with M-x lock-screen:
(defun lock-screen () "Lock screen using (zone) and xtrlock calls M-x zone on all frames and runs xtrlock" (interactive) (save-excursion ;(shell-command "xtrlock &") (set-process-sentinel (start-process "xtrlock" nil "xtrlock") '(lambda (process event) (zone-leave-me-alone))) (zone-when-idle 1)))
NOTE: this depends on the program xtrlock (package ‘xtrlock’ in Debian GNU/Linux)