]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix "C-x =" wrt display of strong RTL characters and directional controls.
authorEli Zaretskii <eliz@gnu.org>
Mon, 5 Dec 2011 17:46:27 +0000 (19:46 +0200)
committerEli Zaretskii <eliz@gnu.org>
Mon, 5 Dec 2011 17:46:27 +0000 (19:46 +0200)
 lisp/descr-text.el (describe-char): Fix display of strong
 right-to-left characters and directional embeddings and overrides.
 lisp/simple.el (what-cursor-position): Fix display of codepoints of
 strong right-to-left characters by appending LRM.

lisp/ChangeLog
lisp/descr-text.el
lisp/simple.el

index ff9a8ad19df58f1fdb54f1f2eeb7a88e7951e7fe..8cb089d523e99e7e66cbd4b3705291407b156a67 100644 (file)
@@ -1,3 +1,11 @@
+2011-12-05  Eli Zaretskii  <eliz@gnu.org>
+
+       * descr-text.el (describe-char): Fix display of strong
+       right-to-left characters and directional embeddings and overrides.
+
+       * simple.el (what-cursor-position): Fix display of codepoints of
+       strong right-to-left characters.
+
 2011-12-05  Chong Yidong  <cyd@gnu.org>
 
        * faces.el (read-color): Doc fix.
index f285fe4233230f03e1a16d68acff247eb3dfd15f..47f96e8d68f413120dde0d7b0864f23cb4061a98 100644 (file)
@@ -422,6 +422,20 @@ as well as widgets, buttons, overlays, and text properties."
               (setq charset (char-charset char)
                     code (encode-char char charset)))
         (setq code char))
+      (cond
+       ;; Append a PDF character to directional embeddings and
+       ;; overrides, to prevent potential messup of the following
+       ;; text.
+       ((memq char '(?\x202a ?\x202b ?\x202d ?\x202e))
+       (setq char-description
+             (concat char-description
+                     (propertize (string ?\x202c) 'invisible t))))
+       ;; Append a LRM character to any strong character to avoid
+       ;; messing up the numerical codepoint.
+       ((memq (get-char-code-property char 'bidi-class) '(R AL))
+       (setq char-description
+             (concat char-description
+                     (propertize (string ?\x200e) 'invisible t)))))
       (when composition
         ;; When the composition is trivial (i.e. composed only with the
         ;; current character itself without any alternate characters),
index b718546248bce4049618bf168e5e1c903345835e..e9d88a210cf293544530934f34b13f7a2c41774b 100644 (file)
@@ -1052,16 +1052,23 @@ In addition, with prefix argument, show details about that character
 in *Help* buffer.  See also the command `describe-char'."
   (interactive "P")
   (let* ((char (following-char))
-        ;; If the character is one of LRE, LRO, RLE, RLO, it will
-        ;; start a directional embedding, which could completely
-        ;; disrupt the rest of the line (e.g., RLO will display the
-        ;; rest of the line right-to-left).  So we put an invisible
-        ;; PDF character after these characters, to end the
-        ;; embedding, which eliminates any effects on the rest of the
-        ;; line.
-        (pdf (if (memq char '(?\x202a ?\x202b ?\x202d ?\x202e))
-                 (propertize (string ?\x202c) 'invisible t)
-               ""))
+        (bidi-fixer
+         (cond ((memq char '(?\x202a ?\x202b ?\x202d ?\x202e))
+                ;; If the character is one of LRE, LRO, RLE, RLO, it
+                ;; will start a directional embedding, which could
+                ;; completely disrupt the rest of the line (e.g., RLO
+                ;; will display the rest of the line right-to-left).
+                ;; So we put an invisible PDF character after these
+                ;; characters, to end the embedding, which eliminates
+                ;; any effects on the rest of the line.
+                (propertize (string ?\x202c) 'invisible t))
+               ;; Strong right-to-left characters cause reordering of
+               ;; the following numerical characters which show the
+               ;; codepoint, so append LRM to countermand that.
+               ((memq (get-char-code-property char 'bidi-class) '(R AL))
+                (propertize (string ?\x200e) 'invisible t))
+               (t
+                "")))
         (beg (point-min))
         (end (point-max))
          (pos (point))
@@ -1125,14 +1132,15 @@ in *Help* buffer.  See also the command `describe-char'."
                     (if (< char 256)
                         (single-key-description char)
                       (buffer-substring-no-properties (point) (1+ (point))))
-                    pdf encoding-msg pos total percent beg end col hscroll)
+                    bidi-fixer
+                    encoding-msg pos total percent beg end col hscroll)
          (message "Char: %s%s %s point=%d of %d (%d%%) column=%d%s"
                   (if enable-multibyte-characters
                       (if (< char 128)
                           (single-key-description char)
                         (buffer-substring-no-properties (point) (1+ (point))))
                     (single-key-description char))
-                  pdf encoding-msg pos total percent col hscroll))))))
+                  bidi-fixer encoding-msg pos total percent col hscroll))))))
 \f
 ;; Initialize read-expression-map.  It is defined at C level.
 (let ((m (make-sparse-keymap)))