X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=spray.el;h=e54de5487354d45eb405c0f57ebfdb2303f9d3f4;hb=5f807d1cf0b25dc2169bdba49c1f58efd6e5109d;hp=5ce76ebe66704ffa66a7ad27b832cbf72b4b200d;hpb=72d7f30381c142e02f38dd1a97377623db3d27a5;p=spray diff --git a/spray.el b/spray.el index 5ce76eb..e54de54 100644 --- a/spray.el +++ b/spray.el @@ -4,17 +4,16 @@ ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2 of the License, or +;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. -;; + ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. -;; + ;; You should have received a copy of the GNU General Public License -;; along with this program; if not, write to the Free Software -;; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +;; along with this program. If not, see . ;; Maintainer: Ian Kelling ;; Author: Ian Kelling @@ -22,6 +21,7 @@ ;; Created: 18 Jun 2014 ;; Version: 0.0.2 ;; URL: https://github.com/ian-kelling/spray +;; Mailing list: https://lists.iankelling.org/listinfo/spray ;; Keywords: convenience ;;; Commentary: @@ -99,6 +99,12 @@ :group 'spray :type 'integer) +(defcustom spray-save-point nil + "Set to true and then exiting spray mode will restore the point" + :group 'spray + :type 'boolean) + + (defcustom spray-height 400 "Height of characters" :group 'spray @@ -124,7 +130,8 @@ decreasing by one for each subsequent word." :type 'integer) (defcustom spray-unsupported-minor-modes - '(buffer-face-mode smartparens-mode highlight-symbol-mode) + '(buffer-face-mode smartparens-mode highlight-symbol-mode + column-number-mode) "Minor modes to toggle off when in spray mode." :group 'spray :type '(list symbol)) @@ -137,7 +144,7 @@ decreasing by one for each subsequent word." "Face for non-accent characters." :group 'spray) -(defface spray-base-face +(defface spray-accent-face '((t (:foreground "red" :inherit spray-base-face))) "Face for accent character." :group 'spray) @@ -154,6 +161,7 @@ decreasing by one for each subsequent word." (define-key km (kbd "") 'spray-forward-word) (define-key km (kbd "f") 'spray-faster) (define-key km (kbd "s") 'spray-slower) + (define-key km (kbd "t") 'spray-time) (define-key km (kbd "q") 'spray-quit) (define-key km (kbd "") 'spray-quit) (define-key km [remap forward-char] 'spray-forward-word) @@ -177,6 +185,7 @@ decreasing by one for each subsequent word." (defvar spray--saved-cursor-type nil) (defvar spray--saved-restriction nil) (defvar spray--saved-minor-modes nil) +(defvar spray--saved-point nil) ;; * utility functions @@ -197,6 +206,7 @@ decreasing by one for each subsequent word." (setq spray--base-overlay (make-overlay (point-min) (point-max)) spray--accent-overlay (make-overlay 0 0) spray--saved-cursor-type cursor-type + spray--saved-point (point) spray--saved-restriction (and (buffer-narrowed-p) (cons (point-min) (point-max)))) (dolist (mode spray-unsupported-minor-modes) @@ -221,6 +231,8 @@ decreasing by one for each subsequent word." (cdr spray--saved-restriction)) (widen)) (setq cursor-type spray--saved-cursor-type) + (when (and spray-save-point spray--saved-point) + (goto-char spray--saved-point)) (dolist (mode spray--saved-minor-modes) (funcall mode 1)) (setq spray--saved-minor-modes nil)))) @@ -236,11 +248,11 @@ decreasing by one for each subsequent word." (len (+ (skip-chars-forward "^\s\t\n—") (skip-chars-forward "—"))) (end (point)) (accent (+ beg (cl-case len - ((1) 1) - ((2 3 4 5) 2) - ((6 7 8 9) 3) - ((10 11 12 13) 4) - (t 5))))) + ((1) 1) + ((2 3 4 5) 2) + ((6 7 8 9) 3) + ((10 11 12 13) 4) + (t 5))))) ;; this fairly obfuscated, using magic numbers to store state ;; it would be nice to sometime patch this so it is more readable. ;; for greater than 9 length, we display for twice as long @@ -263,13 +275,11 @@ decreasing by one for each subsequent word." (cond ((not (zerop spray--initial-delay)) (setq spray--initial-delay (1- spray--initial-delay))) ((not (zerop spray--delay)) - (setq spray--delay (1- spray--delay)) - (when (= spray--delay 2) - (narrow-to-region (point) (point)))) + (setq spray--delay (1- spray--delay))) (t (widen) (if (eobp) - (spray-mode -1) + (spray-quit) (when (not (zerop spray--first-words)) (setq spray--initial-delay spray--first-words) (setq spray--first-words (1- spray--first-words))) @@ -340,6 +350,16 @@ Decreases the wpm (words per minute) parameter. See the variable (when was-running (spray-start)))) +(defun spray-time () + (interactive) + (widen) + (let ((position (progn (skip-chars-backward "^\s\t\n—") (point)))) + (message + "%d per cent done; ~%d minute(s) remaining" + (* 100 (/ position (+ 0.0 (point-max)))) + (fround (/ (count-words-region position (point-max)) (+ 0.0 spray-wpm))))) + (spray--word-at-point)) + ;; * provide (provide 'spray)