Jelajahi Sumber

style(output): fix clippy issue in FileName.paint

Signed-off-by: Sandro-Alessio Gierens <sandro@gierens.de>
Sandro-Alessio Gierens 1 tahun lalu
induk
melakukan
17982a89ab

+ 7 - 1
.github/CODEOWNERS

@@ -49,7 +49,13 @@ completions/nush/* @PThorpe92
 # Grid + Output 
 src/output/grid.rs @PThorpe92
 src/output/grid_details.rs @PThorpe92
-src/output/file_name.rs @PThorpe92
+src/output/file_name.rs @PThorpe92 @gierens
+
+# Config + config parsing
+src/options/config.rs @PThorpe92 @gierens
+src/options/theme.rs @PThorpe92 @gierens
+src/theme/* @PThorpe92 @gierens
+themes/* @PThorpe92 @gierens
 
 # Options parsing
 src/options/* @MartinFillon

+ 0 - 1
completions/fish/eza.fish

@@ -125,6 +125,5 @@ complete -c eza -l git -d "List each file's Git status, if tracked"
 complete -c eza -l no-git -d "Suppress Git status"
 complete -c eza -l git-repos -d "List each git-repos status and branch name"
 complete -c eza -l git-repos-no-status -d "List each git-repos branch name (much faster)"
-complete -c eza -l write-theme -d "Write default theme.yml file to the specified path"
 complete -c eza -s '@' -l extended -d "List each file's extended attributes and sizes"
 complete -c eza -s Z -l context -d "List each file's security context"

+ 0 - 1
completions/nush/eza.nu

@@ -61,5 +61,4 @@ export extern "eza" [
     --context(-Z)              # List each file's security context
     --smart-group              # Only show group if it has a different name from owner
     --stdin                    # When piping to eza. Read file paths from stdin
-    --write-theme              # Write the default theme to some directory: default cwd 
 ]

+ 0 - 1
completions/zsh/_eza

@@ -65,7 +65,6 @@ __eza() {
         --no-git"[Suppress Git status]" \
         --git-repos"[List each git-repos status and branch name]" \
         --git-repos-no-status"[List each git-repos branch name (much faster)]" \
-        --write-theme="[Write the default theme.yml to a directory. default: cwd]" \
         {-@,--extended}"[List each file's extended attributes and sizes]" \
         {-Z,--context}"[List each file's security context]" \
         {-M,--mounts}"[Show mount details (long mode only)]" \

+ 0 - 6
man/eza.1.md

@@ -47,12 +47,6 @@ META OPTIONS
 `-v`, `--version`
 : Show version of eza.
 
-`--write-theme=DIR`
-: Write _eza_ default theme.yml file to the directory passed as argument, or defaults to the current working directory.
-
-`--config` [if eza was built with config support]
-: Specify a custom path to configuration file.
-
 DISPLAY OPTIONS
 ===============
 

+ 0 - 1
rustfmt.toml

@@ -1 +0,0 @@
-

+ 0 - 4
src/options/error.rs

@@ -39,9 +39,6 @@ pub enum OptionsError {
 
     /// A glob ignore was given that failed to be parsed as a pattern.
     FailedGlobPattern(String),
-
-    /// Error writing theme file to disk.
-    WriteTheme(String),
 }
 
 /// The source of a string that failed to be parsed as a number.
@@ -99,7 +96,6 @@ impl fmt::Display for OptionsError {
             Self::TreeAllAll                 => write!(f, "Option --tree is useless given --all --all"),
             Self::FailedParse(s, n, e)       => write!(f, "Value {s:?} not valid for {n}: {e}"),
             Self::FailedGlobPattern(ref e)   => write!(f, "Failed to parse glob pattern: {e}"),
-            Self::WriteTheme(ref e)          => write!(f, "Error writing theme file to disk: {e}"),
         };
     }
 }

+ 3 - 3
src/options/flags.rs

@@ -1,3 +1,4 @@
+#![cfg_attr(rustfmt, rustfmt_skip)]
 use crate::options::parser::{Arg, Args, TakesValue, Values};
 
 // exa options
@@ -86,8 +87,7 @@ pub static OCTAL:             Arg = Arg { short: Some(b'o'), long: "octal-permis
 pub static SECURITY_CONTEXT:  Arg = Arg { short: Some(b'Z'), long: "context",              takes_value: TakesValue::Forbidden };
 pub static STDIN:             Arg = Arg { short: None,       long: "stdin",                takes_value: TakesValue::Forbidden };
 pub static FILE_FLAGS:        Arg = Arg { short: Some(b'O'), long: "flags",                takes_value: TakesValue::Forbidden };
-pub static WRITE_THEME:       Arg = Arg { short: None,       long: "write-theme",          takes_value: TakesValue::Optional(None, ".")};
-pub static THEME:             Arg = Arg { short: None,       long: "theme",                takes_value: TakesValue::Optional(None, ".")};
+
 pub static ALL_ARGS: Args = Args(&[
     &VERSION, &HELP,
 
@@ -103,5 +103,5 @@ pub static ALL_ARGS: Args = Args(&[
     &NO_PERMISSIONS, &NO_FILESIZE, &NO_USER, &NO_TIME, &SMART_GROUP, &NO_SYMLINKS, &SHOW_SYMLINKS,
 
     &GIT, &NO_GIT, &GIT_REPOS, &GIT_REPOS_NO_STAT,
-    &EXTENDED, &OCTAL, &SECURITY_CONTEXT, &STDIN, &FILE_FLAGS, &WRITE_THEME, &THEME
+    &EXTENDED, &OCTAL, &SECURITY_CONTEXT, &STDIN, &FILE_FLAGS
 ]);

+ 3 - 2
src/options/mod.rs

@@ -79,9 +79,10 @@ use crate::theme::Options as ThemeOptions;
 mod dir_action;
 mod file_name;
 mod filter;
-#[rustfmt::skip] // this module becomes unreadable with rustfmt
-mod flags;
+
 mod error;
+#[rustfmt::skip]
+mod flags;
 mod theme;
 mod view;
 

+ 1 - 0
src/options/theme.rs

@@ -2,6 +2,7 @@ use crate::options::parser::MatchedFlags;
 use crate::options::{flags, vars, OptionsError, Vars};
 use crate::output::color_scale::ColorScaleOptions;
 use crate::theme::{Definitions, Options, UseColours};
+use std::path::PathBuf;
 
 use super::config::ThemeConfig;
 

+ 0 - 1
src/output/details.rs

@@ -65,7 +65,6 @@ use std::vec::IntoIter as VecIntoIter;
 
 use nu_ansi_term::Style;
 use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
-use rayon::prelude::*;
 
 use log::*;
 

+ 17 - 11
src/output/file_name.rs

@@ -10,7 +10,7 @@ use crate::output::cell::TextCellContents;
 use crate::output::escape;
 use crate::output::icons::{icon_for_file, iconify_style};
 use crate::output::render::FiletypeColours;
-use crate::theme::IconStyle;
+use crate::theme::FileNameStyle;
 
 /// Basically a file name factory.
 #[derive(Debug, Copy, Clone)]
@@ -190,6 +190,11 @@ impl<'a, 'dir, C: Colours> FileName<'a, 'dir, C> {
     /// width calculated.
     pub fn paint(&self) -> TextCellContents {
         let mut bits = Vec::new();
+        let (icon_override, filename_style_override) = match self.colours.style_override(self.file)
+        {
+            Some(FileNameStyle { icon, filename }) => (icon, filename),
+            None => (None, None),
+        };
 
         let spaces_count_opt = match self.options.show_icons {
             ShowIcons::Always(spaces_count) => Some(spaces_count),
@@ -204,15 +209,15 @@ impl<'a, 'dir, C: Colours> FileName<'a, 'dir, C> {
         };
 
         if let Some(spaces_count) = spaces_count_opt {
-            let (style, icon) = match self.colours.icon_style(self.file) {
+            let (style, icon) = match icon_override {
                 Some(icon_override) => (
                     if let Some(style_override) = icon_override.style {
-                        style_override.into()
+                        style_override
                     } else {
                         iconify_style(self.style())
                     },
                     icon_override
-                        .icon
+                        .glyph
                         .unwrap_or_else(|| icon_for_file(self.file))
                         .to_string(),
                 ),
@@ -239,7 +244,7 @@ impl<'a, 'dir, C: Colours> FileName<'a, 'dir, C> {
             // indicate this fact. But when showing targets, we can just
             // colour the path instead (see below), and leave the broken
             // link’s filename as the link colour.
-            for bit in self.escaped_file_name() {
+            for bit in self.escaped_file_name(filename_style_override) {
                 bits.push(bit);
             }
         }
@@ -274,7 +279,7 @@ impl<'a, 'dir, C: Colours> FileName<'a, 'dir, C> {
                             mount_style: MountStyle::JustDirectoryNames,
                         };
 
-                        for bit in target_name.escaped_file_name() {
+                        for bit in target_name.escaped_file_name(filename_style_override) {
                             bits.push(bit);
                         }
 
@@ -393,13 +398,16 @@ impl<'a, 'dir, C: Colours> FileName<'a, 'dir, C> {
     ///
     /// So in that situation, those characters will be escaped and highlighted in
     /// a different colour.
-    fn escaped_file_name<'unused>(&self) -> Vec<ANSIString<'unused>> {
+    fn escaped_file_name<'unused>(
+        &self,
+        style_override: Option<Style>,
+    ) -> Vec<ANSIString<'unused>> {
         use percent_encoding::{utf8_percent_encode, CONTROLS};
 
         const HYPERLINK_START: &str = "\x1B]8;;";
         const HYPERLINK_END: &str = "\x1B\x5C";
 
-        let file_style = self.style();
+        let file_style = style_override.unwrap_or(self.style());
         let mut bits = Vec::new();
 
         let mut display_hyperlink = false;
@@ -527,9 +535,7 @@ pub trait Colours: FiletypeColours {
     /// The style to paint a directory that has a filesystem mounted on it.
     fn mount_point(&self) -> Style;
 
-    fn icon(&self) -> Option<Style>;
-
     fn colour_file(&self, file: &File<'_>) -> Style;
 
-    fn icon_style(&self, file: &File<'_>) -> Option<IconStyle>;
+    fn style_override(&self, file: &File<'_>) -> Option<FileNameStyle>;
 }

+ 2 - 2
src/theme/default_theme.rs

@@ -124,13 +124,13 @@ impl Default for UiStyles {
             flags: Some(Style::default()),
             header: Some(Style::default().underline()),
 
-            icon: None,
             symlink_path: Some(Cyan.normal()),
             control_char: Some(Red.normal()),
             broken_symlink: Some(Red.normal()),
             broken_path_overlay: Some(Style::default().underline()),
 
-            icons: None,
+            filenames: None,
+            extensions: None,
         }
     }
 }

+ 39 - 28
src/theme/mod.rs

@@ -25,7 +25,7 @@ pub struct Options {
 
     pub definitions: Definitions,
 
-    pub theme_config: ThemeConfig,
+    pub theme_config: Option<ThemeConfig>,
 }
 
 /// Under what circumstances we should display coloured, rather than plain,
@@ -65,22 +65,37 @@ impl Options {
         {
             let ui = UiStyles::plain();
             let exts = Box::new(NoFileStyle);
-            Theme { ui, exts }
-        } else {
-            Theme {
-                ui: self.theme_config.theme.clone(),
-                exts: Box::new(FileTypes),
+            return Theme { ui, exts };
+        };
+        match self.theme_config {
+            Some(ref theme) => {
+                if let Some(mut ui) = theme.to_theme() {
+                    let (exts, use_default_filetypes) = self.definitions.parse_color_vars(&mut ui);
+                    let exts: Box<dyn FileStyle> =
+                        match (exts.is_non_empty(), use_default_filetypes) {
+                            (false, false) => Box::new(NoFileStyle),
+                            (false, true) => Box::new(FileTypes),
+                            (true, false) => Box::new(exts),
+                            (true, true) => Box::new((exts, FileTypes)),
+                        };
+                    return Theme { ui, exts };
+                }
+                self.default_theme()
             }
+            None => self.default_theme(),
         }
-        //     // Use between 0 and 2 file name highlighters
-        //     let exts: Box<dyn FileStyle> = match (exts.is_non_empty(), use_default_filetypes) {
-        //         (false, false) => Box::new(NoFileStyle),
-        //         (false, true) => Box::new(FileTypes),
-        //         (true, false) => Box::new(exts),
-        //         (true, true) => Box::new((exts, FileTypes)),
-        //     };
-        //
-        //     Theme { ui, exts }
+    }
+
+    fn default_theme(&self) -> Theme {
+        let mut ui = UiStyles::default_theme(self.colour_scale);
+        let (exts, use_default_filetypes) = self.definitions.parse_color_vars(&mut ui);
+        let exts: Box<dyn FileStyle> = match (exts.is_non_empty(), use_default_filetypes) {
+            (false, false) => Box::new(NoFileStyle),
+            (false, true) => Box::new(FileTypes),
+            (true, false) => Box::new(exts),
+            (true, true) => Box::new((exts, FileTypes)),
+        };
+        Theme { ui, exts }
     }
 }
 
@@ -379,27 +394,23 @@ impl FileNameColours for Theme {
     fn executable_file(&self)     -> Style { self.ui.filekinds.unwrap_or_default().executable() }
     fn mount_point(&self)         -> Style { self.ui.filekinds.unwrap_or_default().mount_point() }
 
-    fn icon(&self)          -> Option<Style> { self.ui.icon }
-
     fn colour_file(&self, file: &File<'_>) -> Style {
         self.exts
             .get_style(file, self)
             .unwrap_or(self.ui.filekinds.unwrap_or_default().normal())
     }
 
-    fn icon_style(&self, file: &File<'_>) -> Option<IconStyle> {
-        if let Some(ref overrides) = self.ui.icons {
-            if let Some(ref name_overrides) = overrides.filenames {
-                if let Some(icon_override) = name_overrides.get(&file.name) {
-                    return Some(*icon_override);
-                }
+ fn style_override(&self, file: &File<'_>) -> Option<FileNameStyle> {
+        if let Some(ref name_overrides) = self.ui.filenames {
+            if let Some(file_override) = name_overrides.get(&file.name) {
+                return Some(*file_override);
             }
+        }
 
-            if let Some(ref ext_overrides) = overrides.extensions {
-                if let Some(ext) = file.ext.clone() {
-                    if let Some(icon_override) = ext_overrides.get(&ext) {
-                        return Some(*icon_override);
-                    }
+        if let Some(ref ext_overrides) = self.ui.extensions {
+            if let Some(ext) = file.ext.clone() {
+                if let Some(file_override) = ext_overrides.get(&ext) {
+                    return Some(*file_override);
                 }
             }
         }