2

サイズ表示モードのモードラインにファイルサイズを出力する機能を探しています。ソースで size-indication-mode を検索しましたが、コード参照が見つかりません。では、たとえば 22k を出力する関数はどこにありますか

ファイルのサイズが約 22 キロバイトの場合

で定義されている - キロバイト (kB) の 1000 バイトと - キビバイト (KiB) の 1024 バイトの違いは?

Emacs は両方をサポートすべきではありませんか?

もちろん、これを書くのはそれほど難しくありませんが、なぜ車輪を再発明するのでしょうか?

http://en.wikipedia.org/wiki/Kibibyte

4

4 に答える 4

3

C-hf format-mode-line RET、およびを参照してくださいC-hv mode-line-format RET

有効にすると、バッファーのローカル モード行形式文字列に追加されるsize-indication-modeだけof %Iで、残りは C 関数が処理します。

代わりに使用%iして、バッファ サイズをバイト単位で確認できます。

ls-lisp任意の値を指定できるものが必要な場合は、Emacs (モジュール内) で提供されるこれらの行に沿って、少なくとも 1 つの elisp 関数があります。

C-hf ls-lisp-format-file-size RET

于 2011-04-07T12:17:15.990 に答える
2

emacs dev(bzr)が定義された新しい関数を実行することに気づきましたfile-size-human-readable()。それは私が求めた通りのことをします。

一部のemacs開発者は私の電話を聞いたことがあるはずです:)

于 2011-04-12T07:56:24.067 に答える
2

これが私が使用する機能です。

(defconst number-to-string-approx-suffixes
  '("k" "M" "G" "T" "P" "E" "Z" "Y"))
(defun number-to-string-approx-suffix (n &optional binary)
  "Return an approximate decimal representation of NUMBER as a string,
followed by a multiplier suffix (k, M, G, T, P, E, Z, Y). The representation
is at most 5 characters long for numbers between 0 and 10^19-5*10^16.
Uses a minus sign if negative.
NUMBER may be an integer or a floating point number.
If the optional argument BINARY is non-nil, use 1024 instead of 1000 as
the base multiplier."
  (if (zerop n)
      "0"
    (let ((sign "")
          (b (if binary 1024 1000))
          (suffix "")
          (bigger-suffixes number-to-string-approx-suffixes))
      (if (< n 0)
          (setq n (- n)
                sign "-"))
      (while (and (>= n 9999.5) (consp bigger-suffixes))
        (setq n (/ n b) ; TODO: this is rounding down; nearest would be better
              suffix (car bigger-suffixes)
              bigger-suffixes (cdr bigger-suffixes)))
      (concat sign
                  (if (integerp n)
                  (int-to-string n)
                (number-to-string (floor n)))
              suffix))))

バッファメニューのサイズ欄で使用しています。

(defvar Buffer-menu-buffer+size-shorten 'binary)
(defadvice Buffer-menu-buffer+size (before Buffer-menu-shorten-size
                                    compile activate)
  "Shorten the size column in a buffer menu by using multiplier suffixes
\(k, M, G, T\).
This is done only if `Buffer-menu-buffer+size-shorten' is non-nil.
If `Buffer-menu-buffer+size-shorten' is the symbol `binary', use binary
multipliers (powers of 1024). Otherwise use decimal (powers of 1000)
multipliers."
  (if Buffer-menu-buffer+size-shorten
      (let ((binary (eq Buffer-menu-buffer+size-shorten 'binary)))
        (save-match-data
          (if (string-match "^[0-9]+$" size)
              (setq size (number-to-string-approx-suffix (string-to-number size)
                                                         binary)))))))
于 2011-04-12T22:35:10.023 に答える