diff --git a/exa.rs b/exa.rs index b0ffcf5..a181e6e 100644 --- a/exa.rs +++ b/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!(" "); } } diff --git a/file.rs b/file.rs index 9945a8b..d4b2a92 100644 --- a/file.rs +++ b/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 { diff --git a/format.rs b/format.rs index 0c921ac..5ac7b80 100644 --- a/format.rs +++ b/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) }