Emacs(または他のエディタ)でカーソルのバイトオフセットを表示するには?

Emacs(または他のエディタ)でカーソルのバイトオフセットを表示するには?

この質問は私が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-file16進編集モードでファイルを開くことができます。私はこれがあなたが要求したものではないことを知っています。しかし、すでにEmacsを使用していてEmacsに精通している場合は、将来のニーズのためにそれについて知っておくことをお勧めします。

第二に、このようなファイルの「生」編集には本当に良いです(私はこれをたくさんします)find-file-literally。これはあなたが期待することを行い、辞書のUnicodeであるふりをし、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-bytes1-インデックスなので便利な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

私は(ショートカットキーを介して)1ポイント(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

ウィム

では、画面下部に以下が表示されますvimg^G

3の列1、2の2行、2の単語2、8の文字5。バイト7(合計10個)

カーソルのバイトオフセットが常にステータス行になるようにするには、オプション%oに以下を追加しますstatusline

:set statusline+=\ %o

:set laststatus=2(画面が分割されていなくてもステータスバーが常に表示されるようにaを入力できます。オフセットが正しいサイズで表示されるようにするには、aの%o右側に配置します。)%=statusline

を参照する:go 123か、123rd123goに最も近いバイトにカーソルを置きます。

関連情報