diff options
Diffstat (limited to 'lisp/textmodes/flyspell.el')
-rw-r--r-- | lisp/textmodes/flyspell.el | 138 |
1 files changed, 74 insertions, 64 deletions
diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el index 4c24e70d1f7..65702d081f1 100644 --- a/lisp/textmodes/flyspell.el +++ b/lisp/textmodes/flyspell.el @@ -57,7 +57,6 @@ (defcustom flyspell-highlight-flag t "How Flyspell should indicate misspelled words. Non-nil means use highlight, nil means use minibuffer messages." - :group 'flyspell :type 'boolean) (defcustom flyspell-mark-duplications-flag t @@ -65,12 +64,10 @@ Non-nil means use highlight, nil means use minibuffer messages." See `flyspell-mark-duplications-exceptions' to add exceptions to this rule. Detection of repeated words is not implemented in \"large\" regions; see variable `flyspell-large-region'." - :group 'flyspell :type 'boolean) (defcustom flyspell-case-fold-duplications t "Non-nil means Flyspell matches duplicate words case-insensitively." - :group 'flyspell :type 'boolean :version "27.1") @@ -87,9 +84,8 @@ dictionary name (`ispell-local-dictionary' or EXCEPTION-LIST is a list of strings. The checked word is downcased before comparing with these exceptions." - :group 'flyspell :type '(alist :key-type (choice (const :tag "All dictionaries" nil) - string) + regexp) :value-type (repeat string)) :version "24.1") @@ -97,7 +93,6 @@ downcased before comparing with these exceptions." "If non-nil, sort the corrections before popping them. The sorting is controlled by the `flyspell-sort-corrections-function' variable, and defaults to sorting alphabetically." - :group 'flyspell :version "21.1" :type 'boolean) @@ -109,8 +104,7 @@ function takes three parameters -- the two correction candidates to be sorted, and the third parameter is the word that's being corrected." :version "26.1" - :type 'function - :group 'flyspell) + :type 'function) (defun flyspell-sort-corrections-alphabetically (corr1 corr2 _) (string< corr1 corr2)) @@ -130,14 +124,12 @@ Flyspell uses a different face (`flyspell-duplicate') to highlight it. This variable specifies how far to search to find such a duplicate. -1 means no limit (search the whole buffer). 0 means do not search for duplicate unrecognized spellings." - :group 'flyspell :version "24.5" ; -1 -> 400000 :type '(choice (const :tag "no limit" -1) number)) (defcustom flyspell-delay 3 "The number of seconds to wait before checking, after a \"delayed\" command." - :group 'flyspell :type 'number) (defcustom flyspell-persistent-highlight t @@ -147,12 +139,10 @@ is highlighted, and the highlight is turned off as soon as point moves off the misspelled word. Make sure this variable is non-nil if you use `flyspell-region'." - :group 'flyspell :type 'boolean) (defcustom flyspell-highlight-properties t "Non-nil means highlight incorrect words even if a property exists for this word." - :group 'flyspell :type 'boolean) (defcustom flyspell-default-delayed-commands @@ -164,7 +154,6 @@ Make sure this variable is non-nil if you use `flyspell-region'." backward-delete-char-untabify) "The standard list of delayed commands for Flyspell. See `flyspell-delayed-commands'." - :group 'flyspell :version "21.1" :type '(repeat (symbol))) @@ -172,7 +161,6 @@ See `flyspell-delayed-commands'." "List of commands that are \"delayed\" for Flyspell mode. After these commands, Flyspell checking is delayed for a short time, whose length is specified by `flyspell-delay'." - :group 'flyspell :type '(repeat (symbol))) (defcustom flyspell-default-deplacement-commands @@ -182,7 +170,6 @@ whose length is specified by `flyspell-delay'." scroll-down) "The standard list of deplacement commands for Flyspell. See variable `flyspell-deplacement-commands'." - :group 'flyspell :version "21.1" :type '(repeat (symbol))) @@ -190,18 +177,15 @@ See variable `flyspell-deplacement-commands'." "List of commands that are \"deplacement\" for Flyspell mode. After these commands, Flyspell checking is performed only if the previous command was not the very same command." - :group 'flyspell :version "21.1" :type '(repeat (symbol))) (defcustom flyspell-issue-welcome-flag t "Non-nil means that Flyspell should display a welcome message when started." - :group 'flyspell :type 'boolean) (defcustom flyspell-issue-message-flag t "Non-nil means that Flyspell emits messages when checking words." - :group 'flyspell :type 'boolean) (defcustom flyspell-incorrect-hook nil @@ -213,7 +197,6 @@ of possible corrections as returned by `ispell-parse-output'. If any of the functions return non-nil, the word is not highlighted as incorrect." - :group 'flyspell :version "21.1" :type 'hook) @@ -225,50 +208,43 @@ when flyspell is started, the value of that variable is used instead of `flyspell-default-dictionary' to select the default dictionary. Otherwise, if `flyspell-default-dictionary' is nil, it means to use Ispell's ultimate default dictionary." - :group 'flyspell :version "21.1" :type '(choice string (const :tag "Default" nil))) (defcustom flyspell-tex-command-regexp "\\(\\(begin\\|end\\)[ \t]*{\\|\\(cite[a-z*]*\\|label\\|ref\\|eqref\\|usepackage\\|documentclass\\)[ \t]*\\(\\[[^]]*\\]\\)?{[^{}]*\\)" "A string that is the regular expression that matches TeX commands." - :group 'flyspell :version "21.1" - :type 'string) + :type 'regexp) (defcustom flyspell-check-tex-math-command nil "Non-nil means check even inside TeX math environment. TeX math environments are discovered by `texmathp', implemented inside AUCTeX package. That package may be found at URL `https://www.gnu.org/software/auctex/'" - :group 'flyspell :type 'boolean) (defcustom flyspell-dictionaries-that-consider-dash-as-word-delimiter '("francais" "deutsch8" "norsk") "List of dictionary names that consider `-' as word delimiter." - :group 'flyspell :version "21.1" :type '(repeat (string))) (defcustom flyspell-abbrev-p nil "If non-nil, add correction to abbreviation table." - :group 'flyspell :version "21.1" :type 'boolean) (defcustom flyspell-use-global-abbrev-table-p nil "If non-nil, prefer global abbrev table to local abbrev table." - :group 'flyspell :version "21.1" :type 'boolean) (defcustom flyspell-mode-line-string " Fly" "String displayed on the mode line when flyspell is active. Set this to nil if you don't want a mode line indicator." - :group 'flyspell :type '(choice string (const :tag "None" nil))) (defcustom flyspell-large-region 1000 @@ -282,30 +258,25 @@ Doubled words are not detected in a large region, because Ispell does not check for them. If this variable is nil, all regions are treated as small." - :group 'flyspell :version "21.1" :type '(choice number (const :tag "All small" nil))) (defcustom flyspell-insert-function (function insert) "Function for inserting word by flyspell upon correction." - :group 'flyspell :type 'function) (defcustom flyspell-before-incorrect-word-string nil "String used to indicate an incorrect word starting." - :group 'flyspell :type '(choice string (const nil))) (defcustom flyspell-after-incorrect-word-string nil "String used to indicate an incorrect word ending." - :group 'flyspell :type '(choice string (const nil))) (defvar flyspell-mode-map) (defcustom flyspell-use-meta-tab t "Non-nil means that flyspell uses M-TAB to correct word." - :group 'flyspell :type 'boolean :initialize 'custom-initialize-default :set (lambda (sym val) @@ -316,8 +287,7 @@ If this variable is nil, all regions are treated as small." (defcustom flyspell-auto-correct-binding [(control ?\;)] "The key binding for flyspell auto correction." - :type 'key-sequence - :group 'flyspell) + :type 'key-sequence) ;;*---------------------------------------------------------------------*/ ;;* Mode specific options */ @@ -417,9 +387,13 @@ like <img alt=\"Some thing.\">." ;;*---------------------------------------------------------------------*/ ;;* Programming mode */ ;;*---------------------------------------------------------------------*/ -(defvar flyspell-prog-text-faces +(defcustom flyspell-prog-text-faces '(font-lock-string-face font-lock-comment-face font-lock-doc-face) - "Faces corresponding to text in programming-mode buffers.") + "Faces corresponding to text in programming-mode buffers." + :type '(set (const font-lock-string-face) + (const font-lock-comment-face) + (const font-lock-doc-face)) + :version "28.1") (defun flyspell-generic-progmode-verify () "Used for `flyspell-generic-check-word-predicate' in programming modes." @@ -428,8 +402,8 @@ like <img alt=\"Some thing.\">." (let ((f (get-text-property (1- (point)) 'face))) (memq f flyspell-prog-text-faces)))) -;; Records the binding of M-TAB in effect before flyspell was activated. -(defvar flyspell--prev-meta-tab-binding) +(defvar flyspell--prev-meta-tab-binding nil + "Records the binding of M-TAB in effect before flyspell was activated.") ;;;###autoload (defun flyspell-prog-mode () @@ -475,6 +449,22 @@ like <img alt=\"Some thing.\">." map) "Minor mode keymap for Flyspell mode--for the whole buffer.") +;; correct on mouse 3 +(defun flyspell--set-use-mouse-3-for-menu (var value) + (set-default var value) + (if value + (progn (define-key flyspell-mouse-map [mouse-2] nil) + (define-key flyspell-mouse-map [down-mouse-3] 'flyspell-correct-word)) + (define-key flyspell-mouse-map [mouse-2] 'flyspell-correct-word) + (define-key flyspell-mouse-map [down-mouse-3] nil))) + +(defcustom flyspell-use-mouse-3-for-menu nil + "Non-nil means to bind `mouse-3' to `flyspell-correct-word'. +If this is set, also unbind `mouse-2'." + :type 'boolean + :set 'flyspell--set-use-mouse-3-for-menu + :version "28.1") + ;; dash character machinery (defvar flyspell-consider-dash-as-word-delimiter-flag nil "Non-nil means that the `-' char is considered as a word delimiter.") @@ -493,8 +483,7 @@ like <img alt=\"Some thing.\">." (t :underline t :inherit error)) "Flyspell face for misspelled words." - :version "24.4" - :group 'flyspell) + :version "24.4") (defface flyspell-duplicate '((((supports :underline (:style wave))) @@ -503,8 +492,7 @@ like <img alt=\"Some thing.\">." :underline t :inherit warning)) "Flyspell face for words that appear twice in a row. See also `flyspell-duplicate-distance'." - :version "24.4" - :group 'flyspell) + :version "24.4") (defvar flyspell-overlay nil) @@ -536,17 +524,34 @@ invoking `ispell-change-dictionary'. Consider using the `ispell-parser' to check your text. For instance consider adding: -\(add-hook \\='tex-mode-hook (function (lambda () (setq ispell-parser \\='tex)))) +\(add-hook \\='tex-mode-hook (lambda () (setq ispell-parser \\='tex))) in your init file. \\[flyspell-region] checks all words inside a region. \\[flyspell-buffer] checks the whole buffer." - :lighter flyspell-mode-line-string + :lighter (flyspell-mode-line-string + ;; If `flyspell-mode-line-string' is nil, then nothing of + ;; the following is displayed in the mode line. + ((:propertize flyspell-mode-line-string) + (:propertize + (:eval + (concat "/" (substring (or ispell-local-dictionary + ispell-dictionary + "--") + 0 2))) + face bold + help-echo "mouse-1: Change dictionary" + local-map (keymap + (mode-line keymap + (mouse-1 . ispell-change-dictionary)))))) :keymap flyspell-mode-map :group 'flyspell (if flyspell-mode (condition-case err - (flyspell-mode-on) + (progn + (when flyspell-use-mouse-3-for-menu + (flyspell--set-use-mouse-3-for-menu 'flyspell-use-mouse-3-for-menu t)) + (flyspell-mode-on (called-interactively-p 'interactive))) (error (message "Error enabling Flyspell mode:\n%s" (cdr err)) (flyspell-mode -1))) (flyspell-mode-off))) @@ -563,12 +568,9 @@ in your init file. (custom-add-option 'text-mode-hook 'turn-on-flyspell) -;;*---------------------------------------------------------------------*/ -;;* flyspell-buffers ... */ -;;* ------------------------------------------------------------- */ -;;* For remembering buffers running flyspell */ -;;*---------------------------------------------------------------------*/ -(defvar flyspell-buffers nil) +(defvar flyspell-buffers nil + "For remembering buffers running flyspell") +(make-obsolete-variable 'flyspell-buffers "not used." "28.1") ;;*---------------------------------------------------------------------*/ ;;* flyspell-minibuffer-p ... */ @@ -624,8 +626,12 @@ in your init file. ;;*---------------------------------------------------------------------*/ ;;* flyspell-mode-on ... */ ;;*---------------------------------------------------------------------*/ -(defun flyspell-mode-on () - "Turn Flyspell mode on. Do not use this; use `flyspell-mode' instead." +(defun flyspell-mode-on (&optional show-msg) + "Turn Flyspell mode on. Do not use this; use `flyspell-mode' instead. + +If optional argument SHOW-MSG is non-nil, show a welcome message +if `flyspell-issue-message-flag' and `flyspell-issue-welcome-flag' +are both non-nil." (ispell-set-spellchecker-params) ; Initialize variables and dicts alists (setq ispell-highlight-face 'flyspell-incorrect) ;; local dictionaries setup @@ -657,15 +663,17 @@ in your init file. (setq flyspell-generic-check-word-predicate mode-predicate))) ;; the welcome message (if (and flyspell-issue-message-flag - flyspell-issue-welcome-flag - (called-interactively-p 'interactive)) - (let ((binding (where-is-internal 'flyspell-auto-correct-word - nil 'non-ascii))) - (message "%s" - (if binding - (format "Welcome to flyspell. Use %s or Mouse-2 to correct words." - (key-description binding)) - "Welcome to flyspell. Use Mouse-2 to correct words."))))) + flyspell-issue-welcome-flag + show-msg) + (let* ((binding (where-is-internal 'flyspell-auto-correct-word + nil 'non-ascii)) + (mouse-button (if flyspell-use-mouse-3-for-menu + "Mouse-3" "Mouse-2"))) + (message (format-message + "Welcome to Flyspell. Use %s to correct words." + (if binding + (format "`%s' or `%s'" (key-description binding) mouse-button) + (format "`%s'" mouse-button))))))) ;;*---------------------------------------------------------------------*/ ;;* flyspell-delay-commands ... */ @@ -1815,7 +1823,9 @@ for the overlay." (overlay-put overlay 'mouse-face mouse-face) (overlay-put overlay 'flyspell-overlay t) (overlay-put overlay 'evaporate t) - (overlay-put overlay 'help-echo "mouse-2: correct word at point") + (overlay-put overlay 'help-echo (concat (if flyspell-use-mouse-3-for-menu + "mouse-3" + "mouse-2") ": correct word at point")) ;; If misspelled text has a 'keymap' property, let that remain in ;; effect for the bindings that flyspell-mouse-map doesn't override. (set-keymap-parent flyspell-mouse-map (get-char-property beg 'keymap)) @@ -1912,7 +1922,7 @@ before point that's highlighted as misspelled." (while (and (setq pos (previous-overlay-change pos)) (not (= pos pos1))) (setq pos1 pos) - (if (> pos (point-min)) + (if (>= pos (point-min)) (progn (setq ovs (overlays-at pos)) (while (consp ovs) |