Ver código fonte

Change format of file sizes to be shorter

I'm copying ls here because we don't really need the 'B' for bytes to be
listed every time. I think it looks better the new way. Unlike ls, don't
list directory sizes, because I've never found the pseudo-sizes they get
given at all useful.

Also, fix a bug where aligning columns didn't work when the number of
format characters (like '\x1B' and '[') were different between each
line.
Ben S 11 anos atrás
pai
commit
b116889abc
3 arquivos alterados com 24 adições e 14 exclusões
  1. 1 1
      exa.rs
  2. 11 9
      file.rs
  3. 12 4
      format.rs

+ 1 - 1
exa.rs

@@ -82,7 +82,7 @@ fn list(options: Options, path: Path) {
                 print!(" ");
             }
             print!("{}", cell.as_slice());
-            for _ in range(cell.len(), *length) {
+            for _ in range(colours::strip_formatting(cell).len(), *length) {
                 print!(" ");
             }
         }

+ 11 - 9
file.rs

@@ -66,17 +66,19 @@ impl<'a> File<'a> {
     }
 
     fn file_size(&self, si: bool) -> StrBuf {
-        let sizeStr = if si {
-            formatBinaryBytes(self.stat.size)
+        // Don't report file sizes for directories. I've never looked
+        // at one of those numbers and gained any information from it.
+        if self.stat.kind == io::TypeDirectory {
+            Black.bold().paint("---")
         } else {
-            formatDecimalBytes(self.stat.size)
-        };
+            let sizeStr = if si {
+                formatBinaryBytes(self.stat.size)
+            } else {
+                formatDecimalBytes(self.stat.size)
+            };
 
-        return if self.stat.kind == io::TypeDirectory {
-            Green.normal()
-        } else {
-            Green.bold()
-        }.paint(sizeStr.as_slice());
+            return Green.bold().paint(sizeStr.as_slice());
+        }
     }
 
     fn type_char(&self) -> StrBuf {

+ 12 - 4
format.rs

@@ -1,16 +1,24 @@
-fn formatBytes(mut amount: u64, kilo: u64, prefixes: ~[&str]) -> StrBuf {
+static METRIC_PREFIXES: &'static [&'static str] = &[
+    "", "K", "M", "G", "T", "P", "E", "Z", "Y"
+];
+
+static IEC_PREFIXES: &'static [&'static str] = &[
+    "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi"
+];
+
+fn formatBytes(mut amount: u64, kilo: u64, prefixes: &[&str]) -> StrBuf {
     let mut prefix = 0;
     while amount > kilo {
         amount /= kilo;
         prefix += 1;
     }
-    return format!("{:4}{}", amount, prefixes[prefix]);
+    format!("{}{}", amount, prefixes[prefix])
 }
 
 pub fn formatBinaryBytes(amount: u64) -> StrBuf {
-    formatBytes(amount, 1024, ~[ "B  ", "KiB", "MiB", "GiB", "TiB" ])
+    formatBytes(amount, 1024, IEC_PREFIXES)
 }
 
 pub fn formatDecimalBytes(amount: u64) -> StrBuf {
-    formatBytes(amount, 1000, ~[ "B ", "KB", "MB", "GB", "TB" ])
+    formatBytes(amount, 1000, METRIC_PREFIXES)
 }