Anzeigen von Bytes als hexadezimale Escapezeichen und nicht als oktale Escapezeichen

8

Kurzversion: Kann ich Emacs zeigen lassen \ffoder \xffstatt \377?

Lange Version: Angenommen, Sie öffnen eine Datei, die nicht vollständig aus Text besteht und einige Binärdaten enthält (z. B. eine PostScript- oder PDF-Datei). Angenommen, Sie öffnen die GNU Emacs-Referenzkarte (PDF) .

Screenshot von Emacs (Aquamacs) mit refcard.pdf

Für Bytes außerhalb des druckbaren ASCII-Bereichs (32–126)

  • Emacs zeigt die "hohen" Bytes (Bytes mit den Werten 128 bis 255) als oktale Escape-Sequenzen: 128 wird angezeigt als \200, 129 wird angezeigt als \201, ..., 255 wird angezeigt als \377.
  • Emacs zeigt die Bytes 0 bis 31 (außer Byte 9, das nicht als Tabulator angezeigt wird ^I, und Byte 10, das als Zeilenumbruch nicht angezeigt wird ^J) als Caret, gefolgt von dem Zeichen, das 64 voraus ist: Byte 0 wird als ^@Byte angezeigt 1 wird gezeigt als ^A,…, Byte 26 wird gezeigt als ^Z, Byte 27 wird gezeigt als ^[,…, Byte 31 wird gezeigt als ^_. Außerdem zeigt Emacs Byte 127 als ^?.

Ich weiß, dass der Grund, warum Emacs Oktal zeigt, historisch ist: Irgendwann vor einigen Jahrzehnten wurde Oktal häufiger verwendet. ( man asciiBeginnt beispielsweise zuerst mit Oktal und TeX unterstützt Oktal-Escape-Sequenzen.) Da Oktal heutzutage weniger nützlich als Hexadezimal ist (z. B. zum Vergleich mit der Ausgabe von hexdumpoder Python-Byte-String-Darstellungen), würde ich gerne Hexadezimal sehen Escape-Sequenzen. Wie kann ich das ändern?

(Hinweis: Die oktalen Escape-Sequenzen werden hervorgehoben angezeigt, anstatt wie normaler Text auszusehen, und es ist natürlich nicht möglich, in das Escape-Zeichen "einzusteigen" (dh wenn Sie auf den Punkt treffen C-f, bevor \343Sie zum Punkt danach gelangen \343), möchte ich um dies beizubehalten.)

ShreevatsaR
quelle

Antworten:

4

Sie können dies mit Anzeigetabellen tun . Dies mag etwas ungeschickt sein und ich habe nicht untersucht, wie dies Pakete stören könnte, die Anzeigetabellen für ihre eigenen Zwecke verwenden, aber der grundlegende Anwendungsfall funktioniert.

(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))))
Gilles 'SO - hör auf böse zu sein'
quelle
Danke, das war hilfreich, also akzeptiere ich das. Ich musste einige kleinere Änderungen vornehmen, die in meiner Antwort enthalten sind . Bitte schauen Sie und lassen Sie mich wissen, ob ich etwas korrigieren sollte.
ShreevatsaR
8

Bearbeiten : Mit Emacs 26.1 oder höher ist es (setq display-raw-bytes-as-hex t)weg.

Nein, das kannst du nicht. Die Anzeige von nicht druckbaren Dateien über dem druckbaren ASCII-Bereich ist fest codiert in xdisp.c:

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

Ich habe einen Patch gesendet, der dies bei Debbugs behebt .

Wasamasa
quelle
"Nein, das kannst du nicht" ist falsch, siehe Gilles 'Vorschlag , aber trotzdem +1, weil du einen Patch gegeben hast, um das richtig zu beheben.
Npostavs
Huh, gerade als ich dachte, du kannst dich nicht in dieser Sache zurechtfinden, beweist mir jemand anderes das Gegenteil. Vielen Dank!
Wasamasa
1
Oh schön, wunderbar! Es scheint nicht ganz unmöglich zu sein, einen Patch in Emacs zu bekommen. :-) Danke für deine Arbeit… freue dich darauf, dass dies in Emacs 26 veröffentlicht wird.
ShreevatsaR
1
Funktioniert hervorragend in Emacs 26! Vielen Dank!!! (Vielleicht möchten Sie Ihre Antwort jetzt bearbeiten.)
Michael Hoffman
6

Ich habe es dank der Antwort von Gilles und des Threads 2010/2011 mit dem gnu.emacs.helpTitel "Wie kann ich von einem Code mit Escape-Oktalzeichen zu Escape-HEX wechseln?" Herausgefunden. ( Google Groups , Nabble ).

Einzelheiten zur Anzeige von Zeichen in Emacs finden Sie im Abschnitt Anzeige> Textanzeige („Wie Text angezeigt wird“) des Emacs-Handbuchs ( C-h r) und im Abschnitt Anzeige> Zeichenanzeige des Emacs Lisp-Referenzhandbuchs. Sie müssen die Anzeigetabelle für die Zeichen 128 bis 255 ändern (und alle anderen Zeichen, die als hexadezimale Escapezeichen angezeigt werden sollen).

Ich musste zwei kleine Änderungen an der Antwort von Gilles vornehmen:

  1. Anstelle von so etwas

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

    Ich musste so etwas benutzen

    (aset standard-display-table (unibyte-char-to-multibyte 128) [?\\ ?8 ?0])
    
  2. Die Einstellung reicht standard-display-tablenicht immer aus, da einige Modi (wie global-whitespace-mode) dies möglicherweise durcheinander bringen. Und dann scheint es, dass Sie buffer-display-tablestattdessen einstellen müssen .

Also habe ich stattdessen eine interaktive Funktion erstellt, die ich aufrufen kann, wenn sich die Anzeige in einem bestimmten Puffer ändern soll.

(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)))))

Wenn ich damit öffne refcard.pdfund starte M-x use-hex-not-octal, erhalte ich Folgendes für dieselbe Region wie in der Frage:

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

ShreevatsaR
quelle
1

Der Hexl-Modus von Emacs sollte das tun, was Sie wollen - es ist ein Hauptmodus, der Unterstützung für das Anzeigen und Bearbeiten von Binärdateien bietet. Verwenden Sie Mx hexl-find-file anstelle von Cx Cf, um die Datei aufzurufen und loszulegen. Weitere Informationen finden Sie im Emacs-Info-Handbuch oder unter https://www.gnu.org/software/emacs/manual/html_node/emacs/Editing-Binary-Files.html .

stevoooo
quelle
1
Nein, ich möchte keinen Hexl-Modus: Postscript-Dateien sind meistens Text mit nur gelegentlichen Binärdaten, und es ist nicht bequem, in den Hexl-Modus zu wechseln und viele Textbearbeitungsfunktionen zu verlieren. Lassen Sie mich der Frage zur Verdeutlichung einen Screenshot hinzufügen.
ShreevatsaR
Ah, ich weiß, was du meinst, aber ich kenne keine einfache Möglichkeit, das zu ändern. Ich vermute, dass es irgendwo um Anzeigetabellen geht ...
stevoooo
Vielen Dank für Ihren Vorschlag. Ich habe übrigens nicht abgelehnt!
ShreevatsaR