![Emacs(또는 다른 편집기)에서 커서의 바이트 오프셋을 표시하는 방법은 무엇입니까?](https://linux55.com/image/23112/Emacs(%EB%98%90%EB%8A%94%20%EB%8B%A4%EB%A5%B8%20%ED%8E%B8%EC%A7%91%EA%B8%B0)%EC%97%90%EC%84%9C%20%EC%BB%A4%EC%84%9C%EC%9D%98%20%EB%B0%94%EC%9D%B4%ED%8A%B8%20%EC%98%A4%ED%94%84%EC%85%8B%EC%9D%84%20%ED%91%9C%EC%8B%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
이 질문은 내가 emacs 사용을 선호한다는 것을 시사하지만 결론은 어떤 방식으로든 일반 텍스트 검색과 보기/복사-붙여넣기를 수행할 수 있기를 원한다는 것입니다.바이트 오프셋일치하는 텍스트의
분명히 말하자면,바이트 오프셋, 내 말은 emac을 말하는 것이 아닙니다보다값, 표시 수량수치버퍼의 시작 부분부터 시작합니다. UTF-16LE에서는보다는 1문자로 취급 되는 \x0d\x00\x0a\x00
반면, 제가 관심 있는 것은 4바이트입니다.
"일반적인" 읽기 및 검색 가능한 방식으로 텍스트를 표시하면서 이 기본 정보를 표시할 수 있는 다른 편집기(또는 뷰어)가 유용할 것입니다.
동기화된 16진수 보기도일반 텍스트보기는 괜찮겠지만 일반적인 16진수 덤프 뷰어/편집기는 (보통) ASCII 문자만 표시하고 다음을 수행하는 FOSS 16진수를 찾지 못했기 때문에 내가 원하는 것이 아닙니다. 덤프 뷰어/편집기 비에 대한 단순 텍스트 모드 검색 -ASCII UTF-8 또는 모든 UTF-16 문자열.
나는 주로 텍스트의 가독성과 검색 가능성에 관심이 있으므로 "일반" 16진수 덤퍼는 단지 대체 수단일 뿐입니다(이미 사용하고 있습니다).
답변1
첫째, 몰랐다면 Emacs는 hexl-find-file
16진수 편집 모드에서 파일을 열 수 있습니다. 나는 이것이 당신이 요청한 것이 아니라는 것을 압니다. 그러나 당신이 이미 Emacs를 사용하고 있고 Emacs에 익숙하다면, 미래의 필요를 위해 그것에 대해 알아 두는 것이 좋습니다.
둘째, 이와 같은 파일의 "원시" 편집에 정말 좋습니다(저는 이 작업을 많이 합니다) find-file-literally
. 이는 여러분이 기대하는 작업을 수행하고 사전 유니코드인 척하며 ASCII가 아닌 문자(및 제어 문자 등)에 대한 이스케이프를 표시하는 파일을 엽니다. 이렇게 하면 원하는 대로 작동할 수 있지만 ASCII가 아닌 콘텐츠가 많으면 실제로 텍스트를 읽을 수 없다는 명백한 단점이 있습니다.
enable-multibyte-characters
따라서 원시 지원 아래에는 이를 전환하기 위한 변수와 함수가 있습니다 set-buffer-multibyte
. 이것의 장점은 버퍼의 렌더링을 동적으로 변경한다는 것입니다. 예를 들어 다음을 시도해 보십시오:
(defun my-multi-toggle ()
(interactive)
(set-buffer-multibyte (not enable-multibyte-characters)))
(global-set-key (kbd "C-~") 'my-multi-toggle)
이제 원시 모드 간에 동적으로 전환할 수 있는 키가 생겼습니다. 또한 커서를 같은 위치에 유지하는 좋은 속성도 있습니다. 하지만이 원시 모드는 파일이 인코딩으로 사용하는 것이 아닌 내부 표현(UTF-8처럼 보임)을 보여줍니다. 몇 가지 트릭을 사용하면 말하는 내용을 수행할 수 있습니다(예: find-file-literally
열린 파일에 을 사용하면 다시 방문할지 묻는 메시지가 표시되지만 이렇게 하면 위치가 재설정되고 파일이 다시 로드됩니다). 하지만 다음과 같이 들립니다. 위의 내용은 이미 작동합니다. (내 생각엔 바이너리 파일의 일부 텍스트 필드를 편집하려고 하는 것 같습니다...)
답변2
당신이 원하는 것 같아요 position-bytes
. 커서의 바이트 오프셋(Emacs 용어로 "포인트")을 볼 수 있습니다:
M-: (1- (position-bytes (point)))
position-bytes
1-인덱스이므로 편리한 1-
명령으로 래핑할 수 있습니다.
(defun wh/byte-offset-at-point ()
"Report the byte offset (0-indexed) in the file
corresponding to the position of point."
(interactive)
(message "byte offset: %d" (1- (position-bytes (point)))))
답변3
나는 (바로가기 키를 통해) 한 지점(poff)에서 바이트 오프셋을 표시하는 elisp 스크립트를 성공적으로 작성했습니다.
데모는 현재 매우 조잡하지만 UTF-16LE/CR-LF에서 잘 작동합니다(파일 시작 및 파일 끝에서 테스트됨. UTF-16은 제가 이 주제를 시작하게 된 형식이며 실제로 가장 쉬운 작업 형식이며 ...
UTF-8은 조금 더 까다로울 수 있습니다. 파일 I/O가 필요하기 때문에...
여기에 스크립트가 있습니다.
(defun poff-zap ()
"Get the byte offset of point - A prototye, tested minimally only with UTF-16LE"
(interactive)
(let ((linect (- (line-number-at-pos) 1)) ;; line count to point
(choncl (- (point) (point-at-bol))) ;; characters to point on current line
(chrpnl 0) ;; chars per newline
(bytpch 0) ;; bytes per char
(bytpnl 0) ;; bytes per newline
(offset 0) ;; the byte offset
(coding (car (split-string (symbol-name buffer-file-coding-system) "-")))
(format (cadr (split-string (symbol-name buffer-file-coding-system) "-"))))
(case (coding-system-eol-type buffer-file-coding-system)
('0 (setq chrpnl 1)) ;; unix
('1 (setq chrpnl 2)) ;; dos
('2 (setq chrpnl 1)) ;; mac
(t))
(if (> chrpnl 0)
(cond
((string= "utf" coding)
(cond
((string= "8" format)
(progn
(setq bytpch -1)
;; need to do an actual byte count
;; using a UTF-8 parser
;; ...plus a BOM check(?)
))
((or
(string= "16" format)
(string= "16le" format))
(progn
(setq bytpch 2)
(if (= 2 chrpnl) (setq offset linect))
(setq offset (+ offset (point)))
(setq offset (* offset bytpch))
))
(t)))
(t)))
(message (concat
"poff-zap: " (number-to-string bytpch) " bytes-per-char\n"
" " (number-to-string chrpnl) " chars-per-newliner\n"
" " (number-to-string bytpnl) " bytes-per-newliner\n"
" " (number-to-string (point)) " point-emacs\n"
" " (number-to-string offset) " offset poff-zap\n"
" " (symbol-name buffer-file-coding-system) ))
))
(global-set-key (kbd "C-#") 'poff-zap)
답변4
윔
에서는 화면 하단에 다음이 표시됩니다 vim
.g^G
3의 열 1, 2의 2행, 2의 단어 2, 8의 문자 5;바이트 7(총 10개)
커서의 바이트 오프셋이 항상 상태 줄에 있도록 하려면 옵션 %o
에 다음을 추가하세요 statusline
.
:set statusline+=\ %o
:set laststatus=2
( 화면이 분할되지 않아도 상태 표시줄이 항상 표시되도록 a를 입력할 수 있습니다 . 오프셋이 올바른 크기로 나타나도록 하려면 %o
a 오른쪽에 배치합니다.)%=
statusline
를 참조 :go 123
하거나 123rd123go
에 가장 가까운 바이트에 커서를 놓습니다 .