Emacs: wyświetlanie za pomocą szesnastkowych sekwencji sterujących

3

Emacs wyświetla znaki bez glifów jako ósemkowe sekwencje ucieczki „OOO”, np. Od początku pliku PDF:

%PDF-1.4
%\344\343\317\322
1 0 obj
[/PDF/ImageB/ImageC/ImageI/Text]
endobj
4 0 obj
<</Length 5 0 R/Filter/FlateDecode>>
stream
9\323\317\221\321\356j\305
endstream

Czy mogę ustawić (stosunkowo prostą) konfigurację, aby uzyskać te w szesnastkowych sekwencjach ucieczki „xFF”? Tak jak:

%PDF-1.4
%\xE4\xE3\xCF\xD2
1 0 obj
[/PDF/ImageB/ImageC/ImageI/Text]
endobj
4 0 obj
<</Length 5 0 R/Filter/FlateDecode>>
stream
9\xD3\xCF\x91\xD1\xEEj\xC5
endstream

(przy użyciu trybu tekstowego lub trybu podstawowego, lub ... ale nie w trybie hexl)

Rolazaro Azeveires
źródło

Odpowiedzi:

2

Nigdy wcześniej z tym nie grałem, ale przeczytanie nieco podręcznika Elisp i eksperymentowanie sprawia, że ​​myślę, że czegoś takiego właśnie szukasz:

(let ((ii          128)
      (new-dtable  (make-display-table))
      (hex-string  nil))
  (while (< ii 256) ; Convert decimal codes 128 to 255.
    (setq hex-string  (format "%X" ii))
    (aset new-dtable ii
          (vector
           (make-glyph-code ?\ 'escape-glyph)
           (make-glyph-code ?x 'escape-glyph)
           (make-glyph-code (aref hex-string 0) 'escape-glyph)
           (make-glyph-code (aref hex-string 1) 'escape-glyph)))
    (setq ii  (1+ ii)))
  (set-window-display-table (selected-window) new-dtable))

Jeśli następnie użyjesz, powiedzmy C-q 3 4 4 RET, który zwykle wstawia ósemkową sekwencję ucieczki \344, wstawi pokazujący glif xE4.

Odpowiednią częścią podręcznika Elisp, na którą patrzyłem, są te znajdujące się pod węzłem Character Display.

Drew
źródło
Wygląda dobrze, ale nie działa całkowicie. Nie mam teraz czasu na głębsze zbadanie, ale wygląda na to, że konwertuje nowo wstawione znaki, ale nie te wcześniej istniejące
Rolazaro Azeveires
To brzmi, że ma to związek ze sposobem działania funkcji redisplay i tabeli wyświetlania. Nie jestem ekspertem od tego. Może być konieczne wymuszenie ponownego wyświetlenia (np. force-mode-line-update z ALL arg), a nawet powróć do bufora (np. C-x v lub cofnij). (Zapraszamy do głosowania lub zaakceptowania odpowiedzi, BTW. ;-))
Drew
Upvoted, ponieważ jest przydatny, nie akceptowany (jeszcze?), Ponieważ (jeszcze) nie rozwiązuje go. I ja nienawidzić proszony o głosowanie
Rolazaro Azeveires
FYI - Dla mnie to robi konwertuj także wcześniej istniejące znaki w buforze. Czy próbowałeś dodać połączenie do force-mode-line-update (z argonem innym niż zero)? Dla mnie kod działa zarówno z Emacs 24 (niedawna migawka dev) jak i Emacs 23.4 z MS Windows.
Drew
Spróbuj także ikonifikować (minimalizować), a następnie przywracać ramkę lub po prostu zmienić rozmiar ramki. Spróbuj także zabić bufor i ponownie go utworzyć (przynajmniej aby sprawdzić, czy to pomaga).
Drew