Hiển thị byte dưới dạng thoát thập lục phân thay vì thoát bát phân


8

Phiên bản ngắn: Tôi có thể hiển thị Emacs \ffhoặc \xffthay vì \377không?

Phiên bản dài: Giả sử bạn mở một tệp không hoàn toàn bằng văn bản và có một số dữ liệu nhị phân (giả sử tệp PostScript hoặc PDF). Ví dụ: giả sử bạn mở Thẻ tham chiếu GNU Emacs (PDF) .

Ảnh chụp màn hình của Emacs (Aquamacs) đang xem refcard.pdf

Sau đó, đối với các byte nằm ngoài phạm vi có thể in ASCII (32, 126),

  • Emacs hiển thị các byte "cao" (byte có giá trị 128 đến 255) dưới dạng các chuỗi thoát bát phân: 128 được hiển thị dưới dạng \200, 129 được hiển thị dưới dạng \201, giật, 255 được hiển thị dưới dạng \377.
  • Emacs hiển thị các byte 0 đến 31 (khác với byte 9 được hiển thị dưới dạng tab không ^Ivà byte 10 được hiển thị dưới dạng dòng mới ^J) dưới dạng dấu mũ theo sau là ký tự 64 phía trước: byte 0 được hiển thị là ^@, byte 1 được hiển thị dưới dạng ^A, byte, byte 26 được hiển thị dưới dạng ^Z, byte 27 được hiển thị dưới dạng ^[, byte, byte 31 được hiển thị dưới dạng ^_. Ngoài ra, Emacs hiển thị byte 127 như ^?.

Tôi biết rằng lý do Emacs cho thấy bát phân là lịch sử: tại một số điểm cách đây vài thập kỷ, bát phân được sử dụng phổ biến hơn. (Ví dụ: man asciibắt đầu bằng bát phân trước và TeX hỗ trợ các chuỗi thoát bát phân.) Nhưng vì bát phân ít hữu ích hơn thập lục phân ngày nay (ví dụ: để so sánh với đầu ra của hexdumpbiểu diễn chuỗi byte Python), tôi muốn xem thập lục phân trình tự thoát. Làm thế nào tôi có thể thay đổi điều này?

(Lưu ý: các chuỗi thoát bát phân được hiển thị được tô sáng thay vì trông giống như văn bản thông thường và tất nhiên không thể bước "vào" ký tự thoát (tức là nhấn C-fvào điểm trước khi \343đưa bạn đến điểm sau \343); để giữ lại cái này

Câu trả lời:


4

Bạn có thể làm điều đó với các bảng hiển thị . Điều này có thể hơi vụng về và tôi đã không điều tra làm thế nào điều này có thể can thiệp vào các gói sử dụng bảng hiển thị cho mục đích riêng của họ, nhưng trường hợp sử dụng cơ bản hoạt động.

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

Cảm ơn, điều này rất hữu ích vì vậy tôi chấp nhận điều này. Tôi đã phải thực hiện một số thay đổi nhỏ trong câu trả lời của tôi ; xin vui lòng xem và cho tôi biết nếu tôi nên sửa bất cứ điều gì.
ShreevatsaR

8

chỉnh sửa : Với Emacs 26.1 trở lên, nó sẽ (setq display-raw-bytes-as-hex t)biến mất.

Không, bạn không thể. Hiển thị không thể in trên phạm vi ASCII có thể in được mã hóa cứng trong xdisp.c:

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

Tôi đã gửi một bản vá sửa lỗi này để gỡ lỗi .


"Không, bạn không thể" sai, hãy xem đề xuất của Gilles , nhưng dù sao +1 cũng đã đưa ra một bản vá để sửa lỗi này đúng cách.
npostavs

Huh, ngay khi tôi nghĩ bạn không thể hack theo cách này, một người khác đã chứng minh tôi sai. Cảm ơn!
wasamasa

1
Ồ tốt đẹp, tuyệt vời! Bắt một bản vá vào Emacs không hoàn toàn không thể xuất hiện. :-) Cảm ơn vì công việc của bạn, rất mong chờ điều này được phát hành trong Emacs 26.
ShreevatsaR

1
Hoạt động tuyệt vời trong Emacs 26! Cảm ơn!!! (Bạn có thể muốn chỉnh sửa câu trả lời của mình ngay bây giờ.)
Michael Hoffman

6

Tôi đã tìm ra nó nhờ vào câu trả lời của Gilles và chủ đề 2010/2011 trên gnu.emacs.helpđược gọi là Cách chuyển từ mã ký tự bát phân thoát sang thoát HEX? ( Nhóm Google , Nabble ).

Chi tiết về cách Emacs hiển thị các ký tự trong phần Hiển thị> Hiển thị văn bản (Cách thức văn bản được hiển thị văn bản) của hướng dẫn sử dụng Emacs ( C-h r) và phần Hiển thị> Hiển thị ký tự của Hướng dẫn tham khảo Lisp của Emacs. Điều cần làm là thay đổi bảng hiển thị cho các ký tự 128 thành 255 (và bất kỳ ký tự nào khác mà người ta muốn hiển thị dưới dạng thoát thập lục phân).

Tôi đã phải thực hiện hai thay đổi nhỏ từ câu trả lời của Gilles:

  1. Thay vì một cái gì đó như

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

    Tôi đã phải sử dụng một cái gì đó như

    (aset standard-display-table (unibyte-char-to-multibyte 128) [?\\ ?8 ?0])
    
  2. Cài đặt standard-display-tablekhông phải lúc nào cũng đủ, vì một số chế độ (như global-whitespace-mode) có thể làm hỏng nó. Và sau đó nó xuất hiện bạn cần phải thiết lập buffer-display-tablethay thế.

Vì vậy, thay vào đó tôi đã thực hiện một chức năng tương tác mà tôi có thể gọi khi tôi muốn màn hình thay đổi trong một bộ đệm cụ thể.

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

Với điều này, nếu tôi mở refcard.pdfvà chạy M-x use-hex-not-octal, tôi nhận được những điều sau đây, cho cùng một khu vực như trong câu hỏi:

refcard.pdf với Mx use-hex-not-octal


1

Chế độ hexl của Emacs sẽ làm những gì bạn muốn - đó là chế độ chính cung cấp hỗ trợ để xem và chỉnh sửa các tệp nhị phân. Sử dụng Mx hexl-find-file thay vì Cx Cf để truy cập tệp để bắt đầu. Thông tin chi tiết có thể được tìm thấy trong hướng dẫn thông tin của Emacs hoặc tại https://www.gnu.org/software/emacs/manual/html_node/emacs/Editing-Binary-Files.html .


1
Không, tôi không muốn chế độ hexl: các tệp tin mô tả chủ yếu là văn bản chỉ có dữ liệu nhị phân không thường xuyên và không thuận tiện để chuyển sang chế độ hexl và mất nhiều chức năng chỉnh sửa văn bản. Hãy để tôi thêm một ảnh chụp màn hình cho câu hỏi để làm rõ.
ShreevatsaR

À, tôi biết ý của bạn là gì, nhưng đừng biết bất kỳ cách dễ dàng nào mà bạn có thể thay đổi điều đó. Tôi nghi ngờ các bảng hiển thị có thể được tham gia ở đâu đó ...
stevoooo

Cảm ơn đề nghị của bạn mặc dù. Tôi đã không downvote btw!
ShreevatsaR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.