diff options
-rw-r--r-- | Cargo.toml | 3 | ||||
-rw-r--r-- | src/files.rs | 23 | ||||
-rw-r--r-- | src/listview.rs | 22 | ||||
-rw-r--r-- | src/main.rs | 1 |
4 files changed, 35 insertions, 14 deletions
@@ -9,4 +9,5 @@ termion = "*" unicode-width = "0.1.5" lazy_static = "*" x11-clipboard = "*" -alphanumeric-sort = "1.0.6"
\ No newline at end of file +alphanumeric-sort = "1.0.6" +lscolors = { version = "0.5.0", features = [ "ansi_term" ] }
\ No newline at end of file diff --git a/src/files.rs b/src/files.rs index d1422f5..1192659 100644 --- a/src/files.rs +++ b/src/files.rs @@ -5,12 +5,15 @@ use std::ffi::OsStr; use std::cmp::{Ord, Ordering}; pub struct Files(Vec<File>); +use lscolors::{LsColors, Style}; impl Index<usize> for Files { type Output = File; fn index(&self, pos: usize) -> &Self::Output { &self.0[pos] } +lazy_static! { + static ref COLORS: LsColors = LsColors::from_env().unwrap(); } impl PartialOrd for File { @@ -45,8 +48,14 @@ impl Files { let name = name.to_string_lossy(); let kind = get_kind(&file); let path = file.path(); - let size = file.metadata()?.len() / 1024; - let file = File::new(&name, path, kind, size as usize); + let meta = file.metadata()?; + let size = meta.len() / 1024; + let style + = match COLORS.style_for_path_with_metadata(file.path(), Some(&meta)) { + Some(style) => Some(style.clone()), + None => None + }; + let file = File::new(&name, path, kind, size as usize, style); match kind { Kind::Directory => dirs.push(file), _ => files.push(file), @@ -84,6 +93,7 @@ pub struct File { pub path: PathBuf, pub size: Option<usize>, pub kind: Kind, + pub style: Option<Style> // owner: Option<String>, // group: Option<String>, // flags: Option<String>, @@ -93,12 +103,17 @@ pub struct File { impl File { - pub fn new(name: &str, path: PathBuf, kind: Kind, size: usize) -> File { + pub fn new(name: &str, + path: PathBuf, + kind: Kind, + size: usize, + style: Option<Style>) -> File { File { name: name.to_string(), path: path, size: Some(size), - kind: kind + kind: kind, + style: style // owner: None, // group: None, // flags: None, diff --git a/src/listview.rs b/src/listview.rs index 1ec0dfb..93424d7 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -61,17 +61,22 @@ impl<T: 'static> ListView<T> where ListView<T>: Widget { self.selection += 1; } - fn render_line(&self, name: &str, size: usize, unit: &str) -> String { + fn render_line(&self, file: &File) -> String { + let name = &file.name; + let (size, unit) = file.calculate_size(); + let (xsize, _) = self.get_dimensions(); - let sized_string = term::sized_string(name, xsize); + let sized_string = term::sized_string(&name, xsize); let padding = xsize - sized_string.width() as u16; - - + let styled_string = match &file.style { + Some(style) => style.to_ansi_term_style().paint(sized_string).to_string(), + _ => format!("{}{}", term::normal_color(), sized_string), + }; + format!( - "{}{}{:padding$}{}{}{}{}", - term::normal_color(), - sized_string, + "{}{:padding$}{}{}{}{}", + styled_string, " ", term::highlight_color(), term::cursor_left(size.to_string().width() + unit.width()), @@ -150,8 +155,7 @@ impl Widget for ListView<Files> { fn render(&self) -> Vec<String> { self.content.iter().map(|file| { - let (size, unit) = file.calculate_size(); - self.render_line(&file.name, size, &unit) + self.render_line(&file) }).collect() } diff --git a/src/main.rs b/src/main.rs index 4ec5400..4a79322 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ extern crate unicode_width; #[macro_use] extern crate lazy_static; extern crate alphanumeric_sort; +extern crate lscolors; use std::io::{stdout, Write}; |