]> git.eshelyaron.com Git - emacs.git/commitdiff
Add customizable to display raw bytes as hex
authorEli Zaretskii <eliz@gnu.org>
Thu, 1 Jun 2017 18:12:39 +0000 (21:12 +0300)
committerEli Zaretskii <eliz@gnu.org>
Thu, 1 Jun 2017 18:12:39 +0000 (21:12 +0300)
* src/xdisp.c (get_next_display_element): Dispatch used format string
for unprintables based on new display-raw-bytes-as-hex variable.
(display-raw-bytes-as-hex): New variable.  (Bug#27122)

* lisp/cus-start.el: Add defcustom form for display-raw-bytes-as-hex.

* doc/emacs/display.texi: Document the new variable.
* etc/NEWS: Mention display-raw-bytes-as-hex.

* test/manual/redisplay-testsuite.el (test-redisplay-5-toggle)
(test-redisplay-5): New tests.
(test-redisplay): Call test-redisplay-5.

doc/emacs/display.texi
etc/NEWS
lisp/cus-start.el
src/xdisp.c
test/manual/redisplay-testsuite.el

index a0d0792eacc59fff532693898e2146c3529ad22e..c4554eb318708cc718c4fd3ae749a160d6f4194a 100644 (file)
@@ -1763,3 +1763,9 @@ itself, in pixels; the default is 2.
 in text that is hard to read.  Call the function
 @code{tty-suppress-bold-inverse-default-colors} with a non-@code{nil}
 argument to suppress the effect of bold-face in this case.
+
+@vindex display-raw-bytes-as-hex
+  Raw bytes are displayed in octal format by default, for example a
+byte with a decimal value of 128 is displayed as @code{\200}.  To
+change display to the hexadecimal format of @code{\x80}, set the
+variable @code{display-raw-bytes-as-hex} to @code{t}.
index 43e7897120fc8d289575efbf51bbfcecc54429be..055de8ca9e8d096b277aa252ae52f82160765baf 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -364,6 +364,10 @@ large integers from being displayed as characters.
 ** Two new commands for finding the source code of Emacs Lisp
 libraries: 'find-library-other-window' and 'find-library-other-frame'.
 
++++
+** The new variable 'display-raw-bytes-as-hex' allows to change the
+display of raw bytes from octal to hex.
+
 \f
 * Editing Changes in Emacs 26.1
 
index 4253d40b7594ff322c45e740b7f6af5113befc52..744fe7f69eec66cb391d788a9bfce139b4d1fb4b 100644 (file)
@@ -583,6 +583,7 @@ since it could result in memory overflow and make Emacs crash."
                       (const :tag "Fit (t)" :value t)
                       (const :tag "Grow only" :value grow-only))
              "25.1")
+            (display-raw-bytes-as-hex display boolean "26.1")
             ;; xfaces.c
             (scalable-fonts-allowed display boolean "22.1")
             ;; xfns.c
index eaa701e9cf13ebb4917dd435292bb8cfec009576..53210e5be5b2b1c6a2fe705c1da163a4b8e09140 100644 (file)
@@ -7055,7 +7055,7 @@ get_next_display_element (struct it *it)
             translated too.
 
             Non-printable characters and raw-byte characters are also
-            translated to octal form.  */
+            translated to octal or hexadecimal form.  */
          if (((c < ' ' || c == 127) /* ASCII control chars.  */
               ? (it->area != TEXT_AREA
                  /* In mode line, treat \n, \t like other crl chars.  */
@@ -7162,9 +7162,12 @@ get_next_display_element (struct it *it)
                int len, i;
 
                if (CHAR_BYTE8_P (c))
-                 /* Display \200 instead of \17777600.  */
+                 /* Display \200 or \x80 instead of \17777600.  */
                  c = CHAR_TO_BYTE8 (c);
-               len = sprintf (str, "%03o", c + 0u);
+               const char *format_string = display_raw_bytes_as_hex
+                                           ? "x%02x"
+                                           : "%03o";
+               len = sprintf (str, format_string, c + 0u);
 
                XSETINT (it->ctl_chars[0], escape_glyph);
                for (i = 0; i < len; i++)
@@ -32231,6 +32234,13 @@ display table takes effect; in this case, Emacs does not consult
   /* Initialize to t, since we need to disable reordering until
      loadup.el successfully loads charprop.el.  */
   redisplay__inhibit_bidi = true;
+
+  DEFVAR_BOOL ("display-raw-bytes-as-hex", display_raw_bytes_as_hex,
+    doc: /* Non-nil means display raw bytes in hexadecimal format.
+The default is to use octal format (\200) whereas hexadecimal (\x80)
+may be more familar to users.  */);
+  display_raw_bytes_as_hex = false;
+
 }
 
 
index 694d55ab1dbba58b3883e70d7b17136e94b0fde6..2175cbab1b77b9e30806e6d7f26204a033c425b6 100644 (file)
@@ -34,7 +34,8 @@
     (setq overlay (make-overlay opoint (point)))
     (while props
       (overlay-put overlay (car props) (cadr props))
-      (setq props (cddr props)))))
+      (setq props (cddr props)))
+    overlay))
 
 (defun test-redisplay-1 ()
   (insert "Test 1: Displaying adjacent and overlapping overlays:\n\n")
@@ -293,6 +294,29 @@ static unsigned char x_bits[] = {0xff, 0x81, 0xbd, 0xa5, 0xa5, 0xbd, 0x81, 0xff
 
   (insert "\n"))
 
+(defvar test-redisplay-5-expected-overlay nil)
+(defvar test-redisplay-5-result-overlay nil)
+
+(defun test-redisplay-5-toggle (_event)
+  (interactive "e")
+  (setq display-raw-bytes-as-hex (not display-raw-bytes-as-hex))
+  (let ((label (if display-raw-bytes-as-hex "\\x80" "\\200")))
+    (overlay-put test-redisplay-5-expected-overlay 'display
+                 (propertize label 'face 'escape-glyph))))
+
+(defun test-redisplay-5 ()
+  (insert "Test 5: Display of raw bytes:\n\n")
+  (insert "  Expected: ")
+  (setq test-redisplay-5-expected-overlay
+        (test-insert-overlay " " 'display
+                             (propertize "\\200" 'face 'escape-glyph)))
+  (insert "\n    Result: ")
+  (setq test-redisplay-5-result-overlay
+        (test-insert-overlay " " 'display "\200"))
+  (insert "\n\n")
+  (insert-button "Toggle between octal and hex display"
+                 'action 'test-redisplay-5-toggle))
+
 
 (defun test-redisplay ()
   (interactive)
@@ -309,5 +333,6 @@ static unsigned char x_bits[] = {0xff, 0x81, 0xbd, 0xa5, 0xa5, 0xbd, 0x81, 0xff
     (test-redisplay-2)
     (test-redisplay-3)
     (test-redisplay-4)
+    (test-redisplay-5)
     (goto-char (point-min))))