Subject: glyphless-char-display-control doesn't work with acronym

From: [email-masked] (Per Starbäck)
Date: Mon, 18 Feb 2013 17:07:12 +0100

In GNU Emacs 24.2.93.1 (i686-pc-linux-gnu, GTK+ Version 2.18.9),
but it's not new in the pretests. (I think this bug has been present all
the time since this feature was introduced in 24.1.)

  $ LANG=C src/emacs -Q

  M-x customize-option RET glyphless-char-display-control RET

Activate c0-control and choose "Display acronym";
"Set for current session"

Switch to some buffer and C-q RET
It displays as "^M" but I expected a [CR] box.

(Settings other than acronym work as intended.)

=== THE REASON ===

The code puts 'acronym in glyphless-char-display, but there should
instead be the actual string to use.

=== FIX ===

$ diff -cp lisp/international/characters.el lisp/international/characters-fixed.el
*** lisp/international/characters.el	2013-01-01 21:37:17.000000000 +0100
--- lisp/international/characters-fixed.el	2013-02-18 16:11:10.064000575 +0100
*************** This function updates the char-table `gl
*** 1410,1425 ****
        (or (memq method '(zero-width thin-space empty-box acronym hex-code))
  	  (error "Invalid glyphless character display method: %s" method))
        (cond ((eq target 'c0-control)
! 	     (set-char-table-range glyphless-char-display '(#x00 . #x1F)
! 				   method)
  	     ;; Users will not expect their newlines and TABs be
  	     ;; displayed as anything but themselves, so exempt those
  	     ;; two characters from c0-control.
  	     (set-char-table-range glyphless-char-display #x9 nil)
  	     (set-char-table-range glyphless-char-display #xa nil))
  	    ((eq target 'c1-control)
! 	     (set-char-table-range glyphless-char-display '(#x80 . #x9F)
! 				   method))
  	    ((eq target 'format-control)
  	     (map-char-table
  	      #'(lambda (char category)
--- 1410,1425 ----
        (or (memq method '(zero-width thin-space empty-box acronym hex-code))
  	  (error "Invalid glyphless character display method: %s" method))
        (cond ((eq target 'c0-control)
! 	     (glyphless-set-char-table-range glyphless-char-display
! 					     #x00 #x1F method)
  	     ;; Users will not expect their newlines and TABs be
  	     ;; displayed as anything but themselves, so exempt those
  	     ;; two characters from c0-control.
  	     (set-char-table-range glyphless-char-display #x9 nil)
  	     (set-char-table-range glyphless-char-display #xa nil))
  	    ((eq target 'c1-control)
! 	     (glyphless-set-char-table-range glyphless-char-display
! 					     #x80 #x9F method))
  	    ((eq target 'format-control)
  	     (map-char-table
  	      #'(lambda (char category)
*************** This function updates the char-table `gl
*** 1443,1448 ****
--- 1443,1456 ----
  	    (t
  	     (error "Invalid glyphless character group: %s" target))))))
  
+ (defun glyphless-set-char-table-range (chartable from to method)
+   (if (eq method 'acronym)
+       (let ((i from))
+ 	(while (<= i to)
+ 	  (set-char-table-range chartable i (aref char-acronym-table i))
+ 	  (setq i (1+ i))))
+     (set-char-table-range chartable (cons from to) method)))
+ 
  ;;; Control of displaying glyphless characters.
  (defcustom glyphless-char-display-control
    '((format-control . thin-space)

======================================================================