Mostrar bytes como escapes hexadecimales en lugar de escapes octales


8

Versión corta: ¿Puedo hacer que Emacs muestre \ffo \xffno \377?

Versión larga: suponga que abre un archivo que no es completamente texto y tiene algunos datos binarios (digamos un archivo PostScript o PDF). Por ejemplo, suponga que abre la Tarjeta de referencia de GNU Emacs (PDF) .

Captura de pantalla de Emacs (Aquamacs) viendo refcard.pdf

Luego, para bytes fuera del rango imprimible ASCII (32–126),

  • Emacs muestra los bytes "altos" (bytes con un valor de 128 a 255) como secuencias de escape octal: 128 se muestra como \200, 129 se muestra como \201, ..., 255 se muestra como \377.
  • Emacs muestra los bytes del 0 al 31 (excepto el byte 9 que se muestra como una pestaña no ^I, y el byte 10 que se muestra como una nueva línea no ^J) como un cursor seguido del carácter que está adelante 64: el byte 0 se muestra como ^@byte 1 se muestra como ^A, ..., el byte 26 se muestra como ^Z, el byte 27 se muestra como ^[, ..., el byte 31 se muestra como ^_. Además, Emacs muestra el byte 127 como ^?.

Sé que la razón por la que Emacs muestra octal es histórica: en algún momento hace algunas décadas, octal se usaba más comúnmente. (Por ejemplo, man asciicomienza con octal primero, y TeX admite secuencias de escape octal). Pero como octal es menos útil que hexadecimal en estos días (por ejemplo, para comparar con la salida de hexdumplas representaciones de bytes de Python), me gustaría ver hexadecimal secuencias de escape. ¿Cómo puedo cambiar esto?

(Nota: las secuencias de escape octal se muestran resaltadas en lugar de verse como texto normal, y por supuesto no es posible "entrar" en el carácter de escape (es decir, golpear C-fen el punto anterior lo \343lleva al punto posterior \343); me gustaría retener esto.)

Respuestas:


4

Puedes hacerlo con tablas de visualización . Esto puede ser un poco torpe y no he investigado cómo esto podría interferir con los paquetes que usan tablas de visualización para sus propios fines, pero el caso de uso básico funciona.

(require 'cl-lib)
(setq standard-display-table (make-display-table))
(cl-loop
 for x from 128 to 255
 do (aset standard-display-table x
      (cl-map 'vector
          (lambda (c) (make-glyph-code c 'escape-glyph))
          (format "\\%02x" x))))

Gracias, esto fue útil, así que estoy aceptando esto. Tuve que hacer algunos cambios menores que están en mi respuesta ; Eche un vistazo y avíseme si debo corregir algo.
ShreevatsaR

8

editar : con Emacs 26.1 o posterior, está (setq display-raw-bytes-as-hex t)lejos.

No puedes. La visualización de no imprimibles por encima del rango ASCII imprimible está codificada en xdisp.c:

if (CHAR_BYTE8_P (c))
  /* Display \200 instead of \17777600.  */
  c = CHAR_TO_BYTE8 (c);
len = sprintf (str, "%03o", c + 0u);

Envié un parche arreglando esto a debbugs .


"No, no puedes" está mal, mira la sugerencia de Gilles , pero de todos modos +1 por dar un parche para arreglar esto correctamente.
npostavs

Huh, justo cuando pensé que no podías hackear esto, alguien más me demuestra que estoy equivocado. ¡Gracias!
wasamasa

1
Oh bonito, maravilloso! Aparecer un parche en Emacs no es del todo imposible. :-) Gracias por su trabajo ... esperamos que sea lanzado en Emacs 26.
ShreevatsaR

1
¡Funciona muy bien en Emacs 26! ¡¡¡Gracias!!! (Es posible que desee editar su respuesta ahora.)
Michael Hoffman

6

Lo descubrí gracias a la respuesta de Gilles y al hilo 2010/2011 sobre gnu.emacs.help"¿Cómo cambiar del código de caracteres octal escapado a HEX escapado?" ( Grupos de Google , Nabble ).

Los detalles de cómo Emacs muestra los caracteres se encuentran en la sección Pantalla> Pantalla de texto (“Cómo se muestra el texto”) del manual de Emacs ( C-h r), y en la sección Pantalla> Pantalla de caracteres del Manual de referencia de Emacs Lisp. Lo que hay que hacer es cambiar la tabla de visualización de los caracteres 128 a 255 (y cualquier otro carácter que se quiera mostrar como escapes hexadecimales).

Tuve que hacer dos cambios menores a partir de la respuesta de Gilles:

  1. En lugar de algo como

    (aset standard-display-table 128 [?\\ ?8 ?0])
    

    Tuve que usar algo como

    (aset standard-display-table (unibyte-char-to-multibyte 128) [?\\ ?8 ?0])
    
  2. La configuración standard-display-tableno siempre es suficiente, porque algunos modos (como global-whitespace-mode) pueden estropearlo. Y luego parece que debes configurarlo buffer-display-table.

Entonces, en su lugar, hice una función interactiva que puedo invocar cuando quiero que la pantalla cambie en un búfer específico.

(defun use-hex-not-octal ()
  "Use hexadecimal escape sequences instead of octal."
  (interactive)
  (require 'cl-lib)
  (unless buffer-display-table
    (setq buffer-display-table (make-display-table)))
  (setq unprintable (append (number-sequence 127 255) (number-sequence 0 8) (number-sequence 11 31)))
  (cl-loop
   for x in unprintable
   do (aset buffer-display-table (unibyte-char-to-multibyte x)
            (cl-map 'vector
                    (lambda (c) (make-glyph-code c 'escape-glyph))
                    (format "\\%02x" x)))))

Con esto, si abro refcard.pdfy ejecuto M-x use-hex-not-octal, obtengo lo siguiente, para la misma región que en la pregunta:

refcard.pdf con Mx use-hex-not-octal


1

El modo hexl de Emacs debe hacer lo que desee: es un modo principal que proporciona soporte para ver y editar archivos binarios. Use Mx hexl-find-file en lugar de Cx Cf para visitar el archivo y comenzar. Puede encontrar más detalles en el manual de información de Emacs o en https://www.gnu.org/software/emacs/manual/html_node/emacs/Editing-Binary-Files.html .


1
No, no quiero el modo hexl: los archivos postscript son principalmente texto con solo datos binarios ocasionales, y no es conveniente cambiar al modo hexl y perder mucha funcionalidad de edición de texto. Permítanme agregar una captura de pantalla a la pregunta para aclarar.
ShreevatsaR

Ah, sé a qué te refieres, pero no conozco ninguna manera fácil de cambiar eso. Me mesas de exhibición sospechoso podría estar en alguna parte involucrada ...
stevoooo

Aunque gracias por tu sugerencia. Por cierto, no voté en contra!
ShreevatsaR
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.