diff --git a/src/app.rs b/src/app.rs index 8af17b4..82b94b9 100644 --- a/src/app.rs +++ b/src/app.rs @@ -171,8 +171,8 @@ pub fn build() -> App<'static, 'static> { .multiple(true) .number_of_values(1) .require_delimiter(true) - .possible_values(&["permission", "user", "group", "size", "date", "name"]) - .default_value("permission,user,group,size,date,name") + .possible_values(&["filetype","permission", "user", "group", "size", "date", "name", "namewithsymlink"]) + .default_value("filetype,permission,user,group,size,date,namewithsymlink") .help("Specify the blocks that will be displayed and in what order"), ) .arg( diff --git a/src/display.rs b/src/display.rs index ff74b8a..f5b56e7 100644 --- a/src/display.rs +++ b/src/display.rs @@ -19,6 +19,7 @@ struct PaddingRules { size: (usize, usize), date: usize, name: usize, + name_with_symlink: usize, } pub fn one_line(metas: Vec, flags: &Flags, colors: &Colors, icons: &Icons) -> String { @@ -57,6 +58,7 @@ fn inner_display_one_line( size: detect_size_lengths(&metas, &flags), date: detect_date_length(&metas, &flags), name: detect_name_length(&metas, &icons), + name_with_symlink: detect_name_with_symlink_length(&metas, &icons) }) } @@ -281,10 +283,8 @@ fn get_long_output( let mut strings: Vec = Vec::new(); for block in flags.blocks.iter() { match block { - Block::Permission => { - strings.push(meta.file_type.render(colors)); - strings.push(meta.permissions.render(colors)); - } + Block::FileType => strings.push(meta.file_type.render(colors)), + Block::Permission => strings.push(meta.permissions.render(colors)), Block::User => strings.push(meta.owner.render_user(colors, padding_rules.user)), Block::Group => strings.push(meta.owner.render_group(colors, padding_rules.group)), Block::Size => strings.push(meta.size.render( @@ -294,8 +294,9 @@ fn get_long_output( &flags, )), Block::Date => strings.push(meta.date.render(colors, padding_rules.date, &flags)), - Block::Name => { - strings.push(meta.name.render(colors, icons, Some(padding_rules.name))); + Block::Name => strings.push(meta.name.render(colors, icons, Some(padding_rules.name))), + Block::NameWithSymlink => { + strings.push(meta.name.render(colors, icons, None)); strings.push(meta.indicator.render(&flags)); strings.push(meta.symlink.render(colors)); } @@ -391,6 +392,7 @@ fn detect_size_lengths(metas: &[Meta], flags: &Flags) -> (usize, usize) { (max_value_length, max_unit_size) } + fn detect_name_length(metas: &[Meta], icons: &Icons) -> usize { let mut max_value_length: usize = 0; @@ -403,6 +405,22 @@ fn detect_name_length(metas: &[Meta], icons: &Icons) -> usize { max_value_length } +fn detect_name_with_symlink_length(metas: &[Meta], icons: &Icons) -> usize { + let mut max_value_length: usize = 0; + + for meta in metas { + let mut len = meta.name.name_string(&icons).len(); + if let Some(syml) = meta.symlink.symlink_string() { + len += syml.len(); + } + if len > max_value_length { + max_value_length = len; + } + } + + max_value_length +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/flags.rs b/src/flags.rs index 7c431d7..12bc84a 100644 --- a/src/flags.rs +++ b/src/flags.rs @@ -156,24 +156,26 @@ impl Default for Flags { #[derive(Clone, Debug, Copy, PartialEq, Eq)] pub enum Block { - // Type, + FileType, Permission, User, Group, Size, Date, Name, + NameWithSymlink, } impl<'a> From<&'a str> for Block { fn from(block: &'a str) -> Self { match block { - // "type" => Block::Type, + "filetype" => Block::FileType, "permission" => Block::Permission, "user" => Block::User, "group" => Block::Group, "size" => Block::Size, "date" => Block::Date, "name" => Block::Name, + "namewithsymlink" => Block::NameWithSymlink, _ => panic!("invalid \"time\" flag: {}", block), } } diff --git a/src/meta/symlink.rs b/src/meta/symlink.rs index 9767f26..31db9c1 100644 --- a/src/meta/symlink.rs +++ b/src/meta/symlink.rs @@ -43,8 +43,16 @@ impl<'a> From<&'a Path> for SymLink { } impl SymLink { - pub fn render(&self, colors: &Colors) -> ColoredString { + pub fn symlink_string(&self) -> Option { if let Some(ref target) = self.target { + Some(target.to_string()) + } else { + None + } + } + + pub fn render(&self, colors: &Colors) -> ColoredString { + if let Some(target_string) = self.symlink_string() { let elem = if self.valid { &Elem::SymLink } else { @@ -53,7 +61,7 @@ impl SymLink { let strings: &[ColoredString] = &[ ColoredString::from(" \u{21d2} "), // ⇒ - colors.colorize(target.to_string(), elem), + colors.colorize(target_string, elem), ]; let res = ANSIStrings(strings).to_string();