X-Git-Url: https://iankelling.org/git/?p=spray;a=blobdiff_plain;f=spray.el;h=43b46b6ed6d339d1c295abe87bfc076cb03c5905;hp=a34b58fe299e988e10c2e791c9e32b5e50d89740;hb=a55b5de35bcb25dbc41e958612e1fe4e01666d8b;hpb=7d12eb735a08d4b389a9f0c4a59061e93b3bca6e diff --git a/spray.el b/spray.el index a34b58f..43b46b6 100644 --- a/spray.el +++ b/spray.el @@ -1,18 +1,23 @@ ;; custom -(defvar spray-freq (/ 60.0 300) "60.0 / WPM") -(defvar spray-text-scale 5) -(defvar spray-orp-face 'error) +(defvar spray-wpm 400 "words/min") +(defvar spray-height 400 "height of characters") -;; internal variables for spraying -(defvar spray--padding-overlay nil) +(make-face 'spray-base-face) +(set-face-attribute 'spray-base-face nil + :background (face-background 'default) + :foreground (face-foreground 'default)) + +(make-face 'spray-orp-face) +(set-face-attribute 'spray-orp-face nil + :foreground "red" + :overline (face-foreground 'default) + :underline (face-foreground 'default)) + +;; internal variables +(defvar spray--base-overlay nil) (defvar spray--orp-overlay nil) (defvar spray--timer nil) (defvar spray--delay 0) - -;; incompatible minor-modes -(defvar spray--saved-global-hl-line-mode nil) -(defvar spray--saved-font-lock-mode nil) -(defvar spray--saved-hl-line-mode nil) (defvar spray--saved-cursor-type nil) (define-minor-mode spray-mode @@ -20,67 +25,59 @@ :init nil :global nil (cond (spray-mode - (setq spray--orp-overlay (make-overlay 0 0) - spray--padding-overlay (make-overlay 0 0) - spray--timer (run-with-timer 0 spray-freq 'spray-next) + (let ((buffer-face-mode-face `(:height ,spray-height))) + (buffer-face-mode 1)) + (setq spray--base-overlay (make-overlay (point-min) (point-max)) + spray--orp-overlay (make-overlay 0 0) + spray--timer (run-with-timer 0 (/ 60.0 spray-wpm) 'spray-next) spray--saved-cursor-type cursor-type) (setq cursor-type nil) - (text-scale-set spray-text-scale) - (overlay-put spray--orp-overlay 'face spray-orp-face) - (add-hook 'pre-command-hook 'turn-off-spray-mode) - ;; disable incompatible minor-modes - (when (boundp 'global-hl-line-mode) - (setq spray--saved-global-hl-line-mode global-hl-line-mode) - (set (make-local-variable 'global-hl-line-mode) nil)) - (when (boundp 'font-lock-mode) - (setq spray--saved-font-lock-mode font-lock-mode) - (font-lock-mode -1)) - (when (boundp 'hl-line-mode) - (setq spray--saved-hl-line-mode hl-line-mode) - (hl-line-mode -1))) + (overlay-put spray--base-overlay 'priority 100) + (overlay-put spray--base-overlay 'face 'spray-base-face) + (overlay-put spray--orp-overlay 'priority 101) + (overlay-put spray--orp-overlay 'face 'spray-orp-face) + (add-hook 'pre-command-hook 'turn-off-spray-mode)) (t + (buffer-face-mode -1) (widen) (setq cursor-type spray--saved-cursor-type) - (text-scale-set 0) + (delete-overlay spray--base-overlay) (delete-overlay spray--orp-overlay) - (delete-overlay spray--padding-overlay) (cancel-timer spray--timer) - (remove-hook 'pre-command-hook 'turn-off-spray-mode) - ;; restore incompatible minor-modes - (when spray--saved-global-hl-line-mode - (setq global-hl-line-mode spray--saved-global-hl-line-mode)) - (when spray--saved-font-lock-mode - (font-lock-mode 1)) - (when spray--saved-hl-line-mode - (hl-line-mode 1))))) + (remove-hook 'pre-command-hook 'turn-off-spray-mode)))) (defun turn-on-spray-mode () (interactive) (spray-mode 1)) (defun turn-off-spray-mode () (interactive) (spray-mode -1)) (defun spray-next () - (if (not (zerop spray--delay)) - (setq spray--delay (1- spray--delay)) - (widen) - (if (eobp) - (turn-off-spray-mode) - (skip-chars-forward "\s\t\n") - (let* ((beg (point)) - (len (skip-chars-forward "^\s\t\n")) - (end (point)) - (orp (+ beg (cl-case len - ((1) 1) - ((2 3 4 5) 2) - ((6 7 8 9) 3) - ((10 11 12 13) 4) - (t 5))))) - (setq spray--delay (+ (if (> len 8) 1 0) (cl-case (char-before) - ((?. ?! ?\? ?\;) 3) - ((?, ?:) 1) - (t 0)))) - (overlay-put spray--padding-overlay - 'before-string (make-string (- 5 (- orp beg)) ?\s)) - (move-overlay spray--padding-overlay beg (1+ beg)) - (move-overlay spray--orp-overlay (1- orp) orp) - (narrow-to-region beg end))))) + (cond ((not (zerop spray--delay)) + (setq spray--delay (1- spray--delay)) + (when (= spray--delay 2) + (narrow-to-region (point) (point)))) + (t + (widen) + (if (eobp) + (turn-off-spray-mode) + (skip-chars-forward "\s\t\n") + (let* ((beg (point)) + (len (skip-chars-forward "^\s\t\n")) + (end (point)) + (orp (+ beg (cl-case len + ((1) 1) + ((2 3 4 5) 2) + ((6 7 8 9) 3) + ((10 11 12 13) 4) + (t 5))))) + (setq spray--delay (+ (if (> len 9) 1 0) + (if (eql (char-after) ?\n) 3 0) + (cl-case (char-before) + ((?. ?! ?\? ?\;) 3) + ((?, ?:) 1) + (t 0)))) + (move-overlay spray--orp-overlay (1- orp) orp) + (move-overlay spray--base-overlay beg end) + (overlay-put spray--base-overlay + 'before-string (make-string (- 5 (- orp beg)) ?\s)) + (narrow-to-region beg end)))))) (provide 'spray)