changeset 56840:14c8ead25d14

(prin1-char): Don't turn S-a into A. Don't return a string that would read as the wrong character code.
author Richard M. Stallman <rms@gnu.org>
date Mon, 30 Aug 2004 16:05:38 +0000
parents 8425c441196c
children 8cb61798f706
files lisp/emacs-lisp/lisp-mode.el
diffstat 1 files changed, 25 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/lisp-mode.el	Sun Aug 29 20:57:42 2004 +0000
+++ b/lisp/emacs-lisp/lisp-mode.el	Mon Aug 30 16:05:38 2004 +0000
@@ -460,26 +460,36 @@
   (and (integerp char)
        (eventp char)
        (let ((c (event-basic-type char))
-	     (mods (event-modifiers char)))
+	     (mods (event-modifiers char))
+	     string)
 	 ;; Prevent ?A from turning into ?\S-a.
 	 (if (and (memq 'shift mods)
+		  (zerop (logand char ?\S-\^@))
 		  (not (let ((case-fold-search nil))
 			 (char-equal c (upcase c)))))
 	     (setq c (upcase c) mods nil))
-	 (concat
-	  "?"
-	  (mapconcat
-	   (lambda (modif)
-	     (cond ((eq modif 'super) "\\s-")
-		   (t (string ?\\ (upcase (aref (symbol-name modif) 0)) ?-))))
-	   mods "")
-	  (cond
-	   ((memq c '(?\; ?\( ?\) ?\{ ?\} ?\[ ?\] ?\" ?\' ?\\)) (string ?\\ c))
-	   ((eq c 127) "\\C-?")
-	   (t
-	    (condition-case nil
-		(string c)
-	      (error nil))))))))
+	 ;; What string are we considering using?
+	 (condition-case nil
+	     (setq string
+		   (concat
+		    "?"
+		    (mapconcat
+		     (lambda (modif)
+		       (cond ((eq modif 'super) "\\s-")
+			     (t (string ?\\ (upcase (aref (symbol-name modif) 0)) ?-))))
+		     mods "")
+		    (cond
+		     ((memq c '(?\; ?\( ?\) ?\{ ?\} ?\[ ?\] ?\" ?\' ?\\)) (string ?\\ c))
+		     ((eq c 127) "\\C-?")
+		     (t
+		      (string c)))))
+	   (error nil))
+	 ;; Verify the string reads a CHAR, not to some other character.
+	 ;; If it doesn't, return nil instead.
+	 (and string
+	      (= (car (read-from-string string)) char)
+	      string))))
+	 
 
 (defun eval-last-sexp-1 (eval-last-sexp-arg-internal)
   "Evaluate sexp before point; print value in minibuffer.