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

Вы могли всегда делать:

ls *.tgz | grep -v Broad_hapmap3_r2_Affy6_cels_excluded.tgz | xargs -n1 tar zxvf

Но я подозреваю, что кто-то отправит более чистый путь, действительно делают это непосредственно от оболочки удара, не нуждаясь в grep там.

4
09.05.2014, 05:27
4 ответа

В первую очередь, в случае, если Вы не знаете об этом, Emacs имеет hexl-find-file который открывает файл в шестнадцатеричном режиме редактирования. Я знаю, что это не то, что Вы попросили, а если Вы уже используете один, и Вы довольны Emacs, затем хорошо знать об этом для будущих потребностей.

Во-вторых, для этого вида "необработанного" редактирования файла (который я склонен делать часто), find-file-literally является действительно большим. Это делает то, что Вы ожидали бы, что это сделает и симулируете быть pre-unicode версией себя и открывать файл с Escape, собирающимися для символов не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 на открытом файле спросит Вас о пересматривании его, но это сбрасывает местоположение и перезагружает файл также) - но это кажется, что вышеупомянутое уже прекрасно. (Таким образом, мое предположение - то, что Вы пытаетесь отредактировать некоторое текстовое поле в в других отношениях двоичном файле...),

5
27.01.2020, 20:51
  • 1
    стога сена на 5 ГБ, которые Ваш ответ не совсем на ходу, к какому я ищу, но это, конечно, имеет ценность. Я люблю ту способность к переключению, и я буду определенно использовать ее! Однако главным, которое я хочу, является простой дисплей (предпочтительно в строке режима (или мини-буфер) байтового смещения / количество текущего положения курсора/точки (от запуска буфера).. Идея использовать полное шестнадцатеричное представление является только опцией, потому что такие дисплеи обычно показывают байтовые смещения..., но такое шестнадцатеричное представление должно было бы отобразиться (или по крайней мере, поиск) ** все ** текст в удобочитаемой форме (который является тем, чем Вы насладились). –  Peter.O 01.06.2012, 08:35
  • 2
    BTW: Хотя Ваш многобайтовый переключатель является большим, это немного броско в том, как это отображает базовое значение \octal: В файле UTF-16 это отображает значения в форме UTF-8!. BTW, что восьмеричное представление может быть переключено для отображения Шестнадцатеричных значений?.. Спасибо за Ваш четкий и полезный ответ... –  Peter.O 01.06.2012, 08:35
  • 3
    (1) Отображающий положение легок, но это будет работать, только если Вы готовы открыть файлы в литеральном режиме. (2) Ре многобайтовый переключатель: посмотрите подчеркнутый, "Но" в моем ответе. (3) Который можно изменить, как вещи отображены, но это не easy+quick вещь сделать (и это заставляет меня думать, что Вы действительно хотите Hex-редактор - Вы пробовали тот hexl-режим?). –  Eli Barzilay 01.06.2012, 20:58
  • 4
    я использовал hexl режим. Я знал о нем некоторое время теперь. Я склонен использовать hexview вместо этого (для просмотра), поскольку это не нарушает буфер отмены как hexl делает (потому что это редактирует, я принимаю)..спасибо за помощь.. –  Peter.O 02.06.2012, 01:00

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

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

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)
2
27.01.2020, 20:51
  • 1
    Начиная с Emacs 23 Emacs использует UTF-8 внутренне. Для файла UTF-8 все, в чем Вы нуждаетесь, (position-bytes (point)). –  Gilles 'SO- stop being evil' 02.06.2012, 03:19
  • 2
    Это не может работать в общем случае, так как необходимо иметь дело с кодировкой, которая не имеет фиксированной ширины для всех байтов. Для конкретного примера попробовать (insert #x1D11E) в некотором utf-16 файле для вставки символа "G CLEF", и Вы будете видеть, что требуется четыре байта. Нижняя строка - то, что для надлежащего ответа необходимо смочь отобразить содержание (декодируемого) буфера к необработанному содержанию файла на диске, и я не думаю, что Emacs сохраняет это после того, как текст декодировался. Если Вы знаете, что только необходимо иметь дело с 2-byte/char затем, это hackable, но не, что Вы попросили... –  Eli Barzilay 02.06.2012, 07:16
  • 3
    О, и BTW, мое предположение - то, что составление недостающей информации требует чтения необработанного содержания файла, и найдите текущую точку в нем - осуществление, которое достаточно дорого, чтобы быть невозможным взломать modeline. (Не невозможный, хотя, если Вы действительно хотите пойти тем путем...), –  Eli Barzilay 02.06.2012, 07:18
  • 4
    @Gilles, большой!спасибо!.. Это решает UTF-8. Теперь замечание общего порядка о вышеупомянутом сценарии для UTF-16.. Это не обрабатывает Surrogate Pairs хорошо, поскольку каждую пару рассматривает emacs как отдельный символ (как это должно сделать). Это действительно однако работает с BMP (Основная Многоязычная Плоскость) включая U+200B ZERO WIDTH SPACE... таким образом кажется, что UTF-16 является тем, которому нужен парсинг, но я задержу выполнение этого, пока я не встречусь со своим первым Astral Plane персонажи.. –  Peter.O 02.06.2012, 08:36
  • 5
    @Eli Barzilay.. да, точно... Вы записали свой комментарий, как я писал мой.. Так, я должен буду предшествовать строке режима (для Астрального плана vaues UTF-16), но это удовлетворит случайному легкому использованию, которое является в основном, для чего я предназначил это... Я мог сделать одноразовое сканирование, при посещении файла, и иметь стандартный запуск hexl-mode или hexview вместо этого, когда файл содержит суррогатные пары (или, моя нейтрализация нейтрализации.. используйте WinHex в wine, который имеет текст WYSIWIG seach, т.е. никакую потребность особенно обработать \x00 символы для текста ASCII. Работы WinHex, но я очень предпочел бы использовать *, отклоняют инструмент). –  Peter.O 02.06.2012, 08:54

Похоже, вы хотите 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)))))
1
27.01.2020, 20:51

Вим

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

Col 1 of 3; Line 2 of 2; Word 2 of 2; Char 5 of 8; Byte 7 of 10

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

:set statusline+=\ %o

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

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

0
27.01.2020, 20:51

Теги

Похожие вопросы