]> git.eshelyaron.com Git - emacs.git/commitdiff
textmodes/flyspell.el: Don't check pre-word if buffer was switched.
authorAgustín Martín <agustin.martin@hispalinux.es>
Wed, 17 Apr 2013 18:03:46 +0000 (20:03 +0200)
committerAgustín Martín <agustin.martin@hispalinux.es>
Wed, 17 Apr 2013 18:03:46 +0000 (20:03 +0200)
If command changed the buffer, the decision may be made based on the
current buffer even though it should based on the previous one.  This
may lead to false positives and more importantly to errors since
`flyspell-pre-point' is buffer local so it may have unsanitised value
(such as nil) in previous buffer.

To be honest, I'm not sure how this can happen since
`flyspell-pre-point' is set in previous buffer, but nonetheless, I've
been encountering the error for quite some time and finally decided to
fix it.  Interestingly, line making `flyspell-pre-point'
a buffer-local variable has a very revealing "Why?? --Stef" comment.

To avoid the problem, change flyspell-check-pre-word-p so that it does
not allow checking of pre-word if command changed buffer
(ie. `flyspell-pre-buffer' is not current buffer).

lisp/ChangeLog
lisp/textmodes/flyspell.el

index cdb8fe5d36c6fbec1e6cd57a8984ad173e36daf5..ffa0c8405546cbfb7cdedbe3f1a7ad03915a28c1 100644 (file)
@@ -1,3 +1,14 @@
+2013-04-17  Michal Nazarewicz  <mina86@mina86.com>
+
+        * textmodes/flyspell.el (flyspell-check-pre-word-p): Return nil if
+        command changed buffer (ie. `flyspell-pre-buffer' is not current
+        buffer), which prevents making decisions based on invalid value of
+        `flyspell-pre-point' in the wrong buffer.  Most notably, this used to
+        cause an error when `flyspell-pre-point' was nil after switching
+        buffers
+        (flyspell-post-command-hook): No longer needs to change buffers when
+        checking pre-word.  While at it remove unnecessary progn.
+
 2013-04-17  Nicolas Richard  <theonewiththeevillook@yahoo.fr>  (tiny change)
 
        * textmodes/ispell.el (ispell-add-per-file-word-list):
index 6ab3e3d3f16e34f803adff27a5be3a36bddeed7e..81f17c897ebea689fd61a29b2e7ef7046860a1bd 100644 (file)
@@ -738,7 +738,7 @@ before the current command."
   (let ((ispell-otherchars (ispell-get-otherchars)))
     (cond
    ((not (and (numberp flyspell-pre-point)
-              (buffer-live-p flyspell-pre-buffer)))
+              (eq flyspell-pre-buffer (current-buffer))))
       nil)
      ((and (eq flyspell-pre-pre-point flyspell-pre-point)
           (eq flyspell-pre-pre-buffer flyspell-pre-buffer))
@@ -956,11 +956,10 @@ Mostly we check word delimiters."
             ;; Prevent anything we do from affecting the mark.
             deactivate-mark)
         (if (flyspell-check-pre-word-p)
-            (with-current-buffer flyspell-pre-buffer
+            (save-excursion
               '(flyspell-debug-signal-pre-word-checked)
-              (save-excursion
-                (goto-char flyspell-pre-point)
-                (flyspell-word))))
+              (goto-char flyspell-pre-point)
+              (flyspell-word)))
         (if (flyspell-check-word-p)
             (progn
               '(flyspell-debug-signal-word-checked)
@@ -974,16 +973,14 @@ Mostly we check word delimiters."
               ;; FLYSPELL-CHECK-PRE-WORD-P
               (setq flyspell-pre-pre-buffer (current-buffer))
               (setq flyspell-pre-pre-point  (point)))
-          (progn
-            (setq flyspell-pre-pre-buffer nil)
-            (setq flyspell-pre-pre-point  nil)
-            ;; when a word is not checked because of a delayed command
-            ;; we do not disable the ispell cache.
-            (if (and (symbolp this-command)
+          (setq flyspell-pre-pre-buffer nil)
+          (setq flyspell-pre-pre-point  nil)
+          ;; when a word is not checked because of a delayed command
+          ;; we do not disable the ispell cache.
+          (when (and (symbolp this-command)
                      (get this-command 'flyspell-delayed))
-                (progn
-                  (setq flyspell-word-cache-end -1)
-                  (setq flyspell-word-cache-result '_)))))
+            (setq flyspell-word-cache-end -1)
+            (setq flyspell-word-cache-result '_)))
         (while (and (not (input-pending-p)) (consp flyspell-changes))
           (let ((start (car (car flyspell-changes)))
                 (stop  (cdr (car flyspell-changes))))