Intereting Posts
xfce: Разрешить выключение для пользователей без полномочий root Обновления загрузок Cron Я не знаю, как подключить предварительно сконфигурированный маршрутизатор OpenWRT к моей домашней сети Как Wget с условием подмножества + генерировать CHM / … электронную книгу? В потоке писем, как ответить последнему отправителю, а не вам? Система Fedora 20 зависает при появлении логотипа Fedora Возврат удаленных файлов rsync cp: не может создать обычный файл: в доступе отказано Как перенести файлы из одного каталога во вложенный каталог с помощью SSH? Iptables в linux чашки: время ожидания подключения вставить символ в начале указанной строки в файле Калибр не конвертируется из epub в mobi Установка USB_QUIRK_CONFIG_INTF_STRINGS во время выполнения Агент диспетчера почты: не удалось получить доступ к папке исходящих сообщений (ошибка Unknow. (Не удалось получить сбор ресурсов).)

В emacs (или другом редакторе), как отобразить смещение байта курсора?

Вопрос указывает на то, что я предпочитаю использовать emacs, но главная проблема заключается в том, что я хочу иметь возможность выполнять обычный текстовый поиск и как-то видеть / копировать-вставлять смещение байтов совпадающего текста.

Чтобы быть ясным, по байт-смещению я не имею в виду значение точки emac, которое показывает количество символов с начала буфера, например. в UTF-16LE точка рассматривает \x0d\x00\x0a\x00 как 1 символ, тогда как меня интересует это как 4 байта.

Любой другой редактор (или зритель), который представляет эту основную информацию при отображении текста в «нормально» читаемом и доступном для поиска способе, заслуживает внимания.

Даже шестнадцатеричное представление с синхронизированным представлением нормального текста будет в порядке, но типичный просмотрщик / редактор Hex-dump не то, что мне нужно, поскольку они (как правило) отображают только символы ASCII, и я не нашел FOSS Hex-dump viewer / editor, который может выполнять простой поиск в текстовом режиме для не ASCII UTF-8 или для любых строк UTF-16.

Я в первую очередь забочусь о удобочитаемости и возможности поиска текста, поэтому «нормальная» программа дампа Hex – это только резервная копия (которую я уже использую).

Прежде всего, если вы не знаете об этом, Emacs имеет hexl-find-file который открывает файл в режиме редактирования в шестнадцатеричном формате. Я знаю, что это не то, о чем вы просили, но если вы уже используете его, и вам комфортно с 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) 

и теперь у вас есть ключ, который динамически переключает режим raw. Он также имеет приятное свойство оставлять курсор в одном и том же месте. Но этот необработанный режим показывает вам внутреннее представление (которое выглядит как UTF-8), а не то, что файл используется для его кодирования. Должно быть возможно сделать то, о чем вы говорите, с помощью какого-либо взлома (например, используя find-file-literally в открытом файле, попросит вас пересмотреть его, но это сбрасывает местоположение и перезагружает файл) – но это звучит так, как показано выше. (То есть, я предполагаю, что вы пытаетесь отредактировать какое-то текстовое поле в двоичном файле иначе …)

Мне удалось собрать скрипт elisp, чтобы показать смещение байта в точке (poff) (с помощью сочетания клавиш).

Его презентация в настоящее время очень грубая, но она отлично подходит для UTF-16LE / CR-LF (протестирована при запуске файла и конца файла. UTF-16 был форматом, который привлек меня на эту тему и на самом деле был самым трудным для работы с..

UTF-8 будет немного сложнее. так как это потребует ввода / вывода файлов …

Вот сценарий.

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

Похоже, вы хотите, чтобы position-bytes . Вы можете видеть смещение байта курсора («точка» в терминологии Emacs):

 M-: (1- (position-bytes (point))) 

Обратите внимание, что position-bytes 1-indexed, следовательно, 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))))) 

напор

В vim g^G отображает в нижней части экрана что-то вроде:

  Кол-во 1 из 3;  Строка 2 из 2;  Слово 2 из 2;  Char 5 из 8;  Байт 7 из 10 

Чтобы иметь смещение байта курсора всегда в строке состояния, добавьте %o к опции статусной линии:

 :set statusline+=\ %o 

(вам может потребоваться добавить a :set laststatus=2 чтобы строка состояния всегда отображалась, даже когда экран не был разделен. Чтобы иметь смещение, отображаемое в правильном размере, поставьте %o справа от %= в statusline ).

См. Также :go 123 или 123go чтобы расположить курсор, ближайший к 123- му байту.