[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

v21 EDMACRO-FORMAT-KEYS chokes and dies on Meta number prefixes

From: sand
Subject: v21 EDMACRO-FORMAT-KEYS chokes and dies on Meta number prefixes
Date: Sun, 3 Aug 2003 12:19:26 -0700

This is with GNU Emacs 21.3.2 (i386-pc-linux-gnu, X toolkit, Xaw3d
scroll bars) of 2003-04-24 on raven, modified by Debian.


Start a keyboard macro:

    C-x (

Move the current line to the top of the window with the following key

    M-0 C-l

End the keyboard macro:

    C-x )

Edit the last keyboard macro:

    C-x C-k C-x e

Emacs will generate the following error message:

    Debugger entered--Lisp error: (error "Invalid character: 037000000060, 
-134217680, 0xf8000030")
      concat("M-" [-134217680] " ")
      (prog1 (concat "M-" (edmacro-subseq rest-mac 0 i) " ") (callf 
edmacro-subseq rest-mac i))

Etc., etc.

Internally, LAST-KEYBOARD-MACRO stores this macro as a two-character,
two-byte string: \xb0\x0c.  This uses the special convention that bit
7 indicates the Meta modifier.  When EDMACRO-FORMAT-KEYS goes to work,
one of the first things it does is convert these special characters
into the "modern" integer format: \xb0 becomes -134217680 or
0xf8000030.  All further processing takes place with this format.

At the end, however, this has to get converted to a keysequence text
format for display, and EDMACRO-FORMAT-KEYS does this with:

    (concat "M-" (edmacro-subseq rest-mac 0 i) " ")

(EDMACRO-SUBSEQ returns a sequence of these integers from positions 0
to I.)  CONCAT is unable to deal with integers outside the range of
[0..255] and barfs.  This may have worked before, but the docs say
that Emacs 21 uses a new internal format for character encoding.

So some solutions, in order of preference, are:

  1. CONCAT, STRING and all the comparable functions get extended to
     support characters outside of [0..255].
     functions that convert to and from the special string
  3. We add the attatched patch to "edmacro.el", which undoes just
     this particular integer conversion.


Derek Upham

"Ha!  Your Leaping Tiger Kung Fu is no match for my Frightened Piglet style!"

------------------------------ cut here ------------------------------

diff -u /usr/share/emacs/21.3/lisp/edmacro.el /home/sand/edmacro.el
--- /usr/share/emacs/21.3/lisp/edmacro.el       2002-07-06 06:39:24.000000000 
+++ /home/sand/edmacro.el       2003-08-03 12:11:50.000000000 -0700
@@ -387,6 +387,20 @@
 ;;; Formatting a keyboard macro as human-readable text.
+(defun edmacro-sanitize-for-string (seq)
+  "Convert a sequence of integers into a sequence of characters.
+The resulting characters follow the usual Emacs conventions (control
+characters are really ASCII control characters; Meta flags are
+indicated by bit 7 being set.
+This function only works with sequences that EDMACRO-FORMAT-KEYS has
+converted from the original string representation to integers."
+  (loop for i below (length seq) do
+        (when (< (aref seq i) 0)
+          (setf (aref seq i) (logand (aref seq i) 127))))
+  seq)
 (defun edmacro-format-keys (macro &optional verbose)
   (setq macro (edmacro-fix-menu-commands macro))
   (let* ((maps (append (current-minor-mode-maps)
@@ -419,7 +433,10 @@
                         (while (memq (aref rest-mac i) (cdr mdigs))
                           (incf i))
                         (and (not (memq (aref rest-mac i) pkeys))
-                             (prog1 (concat "M-" (edmacro-subseq rest-mac 0 i) 
" ")
+                             (prog1 (concat "M-"
+                                             (edmacro-sanitize-for-string
+                                              (edmacro-subseq rest-mac 0 i))
+                                             " ")
                                (callf edmacro-subseq rest-mac i)))))
                  (and (eq (aref rest-mac 0) ?\C-u)
                       (eq (key-binding [?\C-u]) 'universal-argument)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]