diff lisp/isearch-mode.el @ 5751:2b8edd304c2b

Avoid throwing an error with misc-user events in isearch-pre-command-hook. lisp/ChangeLog addition: 2013-08-05 Aidan Kehoe <kehoea@parhasard.net> * isearch-mode.el (isearch-pre-command-hook): If this function is called and (this-command-keys) contains misc-user events, #'key-binding throws an error. Eddie Corns and Alex Belits describe this happening in tracker issue 336, and we can avoid this by catching the error and handling the misc-user event in the same way that #'dispatch-event does. I haven't reproduced the actual error they describe, and welcome testing to make sure it's gone. Thank you Eddie, thank you Alex!
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 05 Aug 2013 13:34:27 +0100
parents b7ae5f44b950
children 0bddb59072b6
line wrap: on
line diff
--- a/lisp/isearch-mode.el	Mon Aug 05 10:05:32 2013 +0100
+++ b/lisp/isearch-mode.el	Mon Aug 05 13:34:27 2013 +0100
@@ -1579,7 +1579,28 @@
 	 ;; FSF does similar magic in `isearch-other-meta-char', which
 	 ;; is horribly complex.  I *hope* what we do works in all
 	 ;; cases.
-	 (setq this-command (key-binding (this-command-keys))))
+	 (setq this-command
+               (condition-case nil
+                   (key-binding (this-command-keys))
+                 (wrong-type-argument
+                  ;; #'key-binding didn't like one of the events --> it's
+                  ;; probably a misc-user object, repeat what
+                  ;; #'dispatch-event does for this case.
+                  (let ((this-command-keys (this-command-keys))
+                        event-function)
+                    (when (and (> (length this-command-keys) 0)
+                               (misc-user-event-p (aref this-command-keys 0)))
+                      (setq event-function
+                            (event-function (aref this-command-keys 0)))
+                      (case event-function
+                        (call-interactively
+                         (event-object (aref this-command-keys 0)))
+                        (eval
+                         `(lambda nil (interactive)
+                           ,(event-object (aref this-command-keys 0))))
+                        (otherwise
+                         ;; Scrollbar command or the like.
+                         (and (symbolp event-function) event-function)))))))))
 	(t
          (labels
              ((isearch-maybe-frob-keyboard-macros ()