Mats, you had a problem a few years ago where isearch within dired and Gnus
summary buffers wouldn’t accept ä and ö and so on. I’ve had some
half-finished work addressing that sitting on my hard disk since then, and
I finally got to it today. I’m confident that it works for me, but back then
my initial patches also worked for me but failed for you, so I’d be curious
as to whether this is still true.
APPROVE COMMIT
NOTE: This patch has been committed.
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1299935491 0
# Node ID 6f10ac29bf40f8d2c13e66a3c4748232f86cac41
# Parent 4c4b96b13f70850c10a8ff4f8617b158b13971cd
Be better about searching for chars typed via XIM and x-compose.el, isearch
lisp/ChangeLog addition:
2011-03-12 Aidan Kehoe <kehoea(a)parhasard.net>
* isearch-mode.el (isearch-mode-map):
Document why we bind the ASCII characters to isearch-printing-char
in more detail.
* isearch-mode.el (isearch-maybe-frob-keyboard-macros):
If `this-command' is nil and the keys typed would normally be
bound to `self-insert-command' in the global map, force
`isearch-printing-char' to be called with an appropriate value for
last-command-event. Addresses an issue where searching for
characters generated from x-compose.el and XIM threw errors for me
in dired.
src/ChangeLog addition:
2011-03-12 Aidan Kehoe <kehoea(a)parhasard.net>
* event-stream.c (Fdispatch_event):
As documented, allow pre-command-hook to usefully modify
this-command even when this-command is nil (that is, we would
normally throw an undefined-keystroke-sequence error). Don't throw
that error if this-command was modified, instead try to execute
the new value.
Allow pre-command-hook to modify last-command-event in this
specific context. Don't document this, for the moment.
diff -r 4c4b96b13f70 -r 6f10ac29bf40 lisp/ChangeLog
--- a/lisp/ChangeLog Fri Mar 11 20:40:01 2011 +0000
+++ b/lisp/ChangeLog Sat Mar 12 13:11:31 2011 +0000
@@ -1,3 +1,16 @@
+2011-03-12 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * isearch-mode.el (isearch-mode-map):
+ Document why we bind the ASCII characters to isearch-printing-char
+ in more detail.
+ * isearch-mode.el (isearch-maybe-frob-keyboard-macros):
+ If `this-command' is nil and the keys typed would normally be
+ bound to `self-insert-command' in the global map, force
+ `isearch-printing-char' to be called with an appropriate value for
+ last-command-event. Addresses an issue where searching for
+ characters generated from x-compose.el and XIM threw errors for me
+ in dired.
+
2011-03-10 Aidan Kehoe <kehoea(a)parhasard.net>
* etags.el (buffer-tag-table-list):
diff -r 4c4b96b13f70 -r 6f10ac29bf40 lisp/isearch-mode.el
--- a/lisp/isearch-mode.el Fri Mar 11 20:40:01 2011 +0000
+++ b/lisp/isearch-mode.el Sat Mar 12 13:11:31 2011 +0000
@@ -239,10 +239,18 @@
(let ((map (make-keymap)))
(set-keymap-name map 'isearch-mode-map)
- ;; Bind all printing characters to `isearch-printing-char'.
- ;; This isn't normally necessary, but if a printing character were
- ;; bound to something other than self-insert-command in global-map,
- ;; then it would terminate the search and be executed without this.
+ ;; Bind ASCII printing characters to `isearch-printing-char'. This
+ ;; isn't normally necessary, but if a printing character were bound to
+ ;; something other than self-insert-command in global-map, then it would
+ ;; terminate the search and be executed without this.
+
+ ;; This is also relevant when other modes (notably dired and gnus) call
+ ;; `suppress-keymap' on their major mode maps; this means that
+ ;; `isearch-maybe-frob-keyboard-macros' won't pick up that the command
+ ;; that would normally be executed is `self-insert-command' and do its
+ ;; thing of transforming that to `isearch-printing-char'. This is less
+ ;; of an issue for the non-ASCII characters, because they rarely have
+ ;; specific bindings in major modes.
(let ((i 32)
(str (make-string 1 0)))
(while (< i 127)
@@ -1609,8 +1617,27 @@
last-command-char (and (stringp this-command)
(aref this-command 0))
this-command 'isearch-printing-char))
- ))
-
+ ((and (null this-command)
+ (eq 'key-press (event-type last-command-event))
+ (current-local-map)
+ (let* ((this-command-keys (this-command-keys))
+ (this-command-keys (or (lookup-key function-key-map
+ this-command-keys)
+ this-command-keys))
+ (lookup-key (lookup-key global-map this-command-keys)))
+ (and (eq 'self-insert-command lookup-key)
+ ;; The feature here that a modification of
+ ;; last-command-event is respected is undocumented, and
+ ;; only applies when this-command is nil. The design
+ ;; isn't reat, and I welcome suggestions for a better
+ ;; one.
+ (setq last-command-event
+ (find-if 'key-press-event-p this-command-keys
+:from-end t)
+ last-command-char
+ (event-to-character last-command-event)
+ this-command 'isearch-printing-char)))))))
+
;;;========================================================
;;; Highlighting
diff -r 4c4b96b13f70 -r 6f10ac29bf40 src/ChangeLog
--- a/src/ChangeLog Fri Mar 11 20:40:01 2011 +0000
+++ b/src/ChangeLog Sat Mar 12 13:11:31 2011 +0000
@@ -1,3 +1,14 @@
+2011-03-12 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * event-stream.c (Fdispatch_event):
+ As documented, allow pre-command-hook to usefully modify
+ this-command even when this-command is nil (that is, we would
+ normally throw an undefined-keystroke-sequence error). Don't throw
+ that error if this-command was modified, instead try to execute
+ the new value.
+ Allow pre-command-hook to modify last-command-event in this
+ specific context. Don't document this, for the moment.
+
2011-03-11 Aidan Kehoe <kehoea(a)parhasard.net>
* bytecode.c (optimize_byte_code):
diff -r 4c4b96b13f70 -r 6f10ac29bf40 src/event-stream.c
--- a/src/event-stream.c Fri Mar 11 20:40:01 2011 +0000
+++ b/src/event-stream.c Sat Mar 12 13:11:31 2011 +0000
@@ -4445,6 +4445,7 @@
{
Lisp_Object leaf = lookup_command_event (command_builder, event, 1);
+ lookedup:
if (KEYMAPP (leaf))
/* Incomplete key sequence */
break;
@@ -4524,6 +4525,22 @@
GCPRO1 (keys);
pre_command_hook ();
UNGCPRO;
+
+ if (!NILP (Vthis_command))
+ {
+ /* Allow pre-command-hook to change the command to
+ something more useful, and avoid barfing. */
+ leaf = Vthis_command;
+ if (!EQ (command_builder->most_current_event,
+ Vlast_command_event))
+ {
+ reset_current_events (command_builder);
+ command_builder_append_event (command_builder,
+ Vlast_command_event);
+ }
+ goto lookedup;
+ }
+
/* The post-command-hook doesn't run. */
Fsignal (Qundefined_keystroke_sequence, list1 (keys));
}
--
“Apart from the nine-banded armadillo, man is the only natural host of
Mycobacterium leprae, although it can be grown in the footpads of mice.”
-- Kumar & Clark, Clinical Medicine, summarising improbable leprosy research
_______________________________________________
XEmacs-Patches mailing list
XEmacs-Patches(a)xemacs.org
http://lists.xemacs.org/mailman/listinfo/xemacs-patches