diff --git a/src/cli.rs b/src/cli.rs index f975ec7..4507613 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -84,8 +84,6 @@ impl clap::Args for Negations { #[derive(Parser)] #[command( version, - after_help = "Note: `fd -h` prints a short and concise overview while `fd --help` gives all \ - details.", after_long_help = "Bugs can be reported on GitHub: https://github.com/sharkdp/fd/issues", args_override_self = true, group(ArgGroup::new("execs").args(&["exec", "exec_batch", "list_details"]).conflicts_with_all(&[ @@ -93,208 +91,269 @@ impl clap::Args for Negations { )] pub struct Opts { /// Search hidden files and directories - /// - /// Include hidden directories and files in the search results (default: - /// hidden files and directories are skipped). Files and directories are considered - /// to be hidden if their name starts with a `.` sign (dot). - /// The flag can be overridden with --no-hidden. - #[arg(long, short = 'H')] + #[arg( + long, + short = 'H', + long_help = "Include hidden directories and files in the search results (default: \ + hidden files and directories are skipped). Files and directories are \ + considered to be hidden if their name starts with a `.` sign (dot). \ + The flag can be overridden with --no-hidden." + )] pub hidden: bool, /// Do not respect .(git|fd)ignore files - /// - /// Show search results from files and directories that would otherwise be - /// ignored by '.gitignore', '.ignore', '.fdignore', or the global ignore file. - /// The flag can be overridden with --ignore. - #[arg(long, short = 'I')] + #[arg( + long, + short = 'I', + long_help = "Show search results from files and directories that would otherwise be \ + ignored by '.gitignore', '.ignore', '.fdignore', or the global ignore file. \ + The flag can be overridden with --ignore." + )] pub no_ignore: bool, /// Do not respect .gitignore files - /// - ///Show search results from files and directories that would otherwise be - ///ignored by '.gitignore' files. The flag can be overridden with --ignore-vcs. - #[arg(long, hide_short_help = true)] + #[arg( + long, + hide_short_help = true, + long_help = "Show search results from files and directories that would otherwise be \ + ignored by '.gitignore' files. The flag can be overridden with --ignore-vcs." + )] pub no_ignore_vcs: bool, /// Do not respect .(git|fd)ignore files in parent directories - /// - /// Show search results from files and directories that would otherwise be - /// ignored by '.gitignore', '.ignore', or '.fdignore' files in parent directories. - #[arg(long, hide_short_help = true)] + #[arg( + long, + hide_short_help = true, + long_help = "Show search results from files and directories that would otherwise be \ + ignored by '.gitignore', '.ignore', or '.fdignore' files in parent directories." + )] pub no_ignore_parent: bool, /// Do not respect the global ignore file #[arg(long, hide = true)] pub no_global_ignore_file: bool, - ///Perform an unrestricted search, including ignored and hidden files. This is - ///an alias for '--no-ignore --hidden'. - #[arg(long = "unrestricted", short = 'u', overrides_with_all(&["ignore", "no_hidden"]), action(ArgAction::Count), hide_short_help = true)] + /// Unrestricted search, alias for '--no-ignore --hidden' + #[arg(long = "unrestricted", short = 'u', overrides_with_all(&["ignore", "no_hidden"]), action(ArgAction::Count), hide_short_help = true, + long_help = "Perform an unrestricted search, including ignored and hidden files. This is \ + an alias for '--no-ignore --hidden'." + )] rg_alias_hidden_ignore: u8, /// Case-sensitive search (default: smart case) - /// - ///Perform a case-sensitive search. By default, fd uses case-insensitive - ///searches, unless the pattern contains an uppercase character (smart case). - #[arg(long, short = 's', overrides_with("ignore_case"))] + #[arg( + long, + short = 's', + overrides_with("ignore_case"), + long_help = "Perform a case-sensitive search. By default, fd uses case-insensitive \ + searches, unless the pattern contains an uppercase character (smart \ + case)." + )] pub case_sensitive: bool, /// Case-insensitive search (default: smart case) - /// - /// Perform a case-insensitive search. By default, fd uses case-insensitive searches, unless - /// the pattern contains an uppercase character (smart case). - #[arg(long, short = 'i', overrides_with("case_sensitive"))] + #[arg( + long, + short = 'i', + overrides_with("case_sensitive"), + long_help = "Perform a case-insensitive search. By default, fd uses case-insensitive \ + searches, unless the pattern contains an uppercase character (smart \ + case)." + )] pub ignore_case: bool, /// Glob-based search (default: regular expression) - /// - /// Perform a glob-based search instead of a regular expression search. - #[arg(long, short = 'g', conflicts_with("fixed_strings"))] + #[arg( + long, + short = 'g', + conflicts_with("fixed_strings"), + long_help = "Perform a glob-based search instead of a regular expression search." + )] pub glob: bool, - /// Perform a regular-expression based search (default). This can be used to override --glob. - #[arg(long, overrides_with("glob"), hide_short_help = true)] + /// Regular-expression based search (default) + #[arg( + long, + overrides_with("glob"), + hide_short_help = true, + long_help = "Perform a regular-expression based search (default). This can be used to \ + override --glob." + )] pub regex: bool, - /// Treat the pattern as a literal string instead of a regular expression. Note - /// that this also performs substring comparison. If you want to match on an - /// exact filename, consider using '--glob'. - #[arg(long, short = 'F', alias = "literal", hide_short_help = true)] + /// Treat pattern as literal string stead of regex + #[arg( + long, + short = 'F', + alias = "literal", + hide_short_help = true, + long_help = "Treat the pattern as a literal string instead of a regular expression. Note \ + that this also performs substring comparison. If you want to match on an \ + exact filename, consider using '--glob'." + )] pub fixed_strings: bool, /// Show absolute instead of relative paths - /// - /// Shows the full path starting with the root as opposed to relative paths. - /// The flag can be overridden with --relative-path. - #[arg(long, short = 'a')] + #[arg( + long, + short = 'a', + long_help = "Shows the full path starting from the root as opposed to relative paths. \ + The flag can be overridden with --relative-path." + )] pub absolute_path: bool, /// Use a long listing format with file metadata - /// - /// Use a detailed listing format like 'ls -l'. This is basically an alias - /// for '--exec-batch ls -l' with some additional 'ls' options. This can be - /// used to see more metadata, to show symlink targets and to achieve a - /// deterministic sort order. - #[arg(long, short = 'l', conflicts_with("absolute_path"))] + #[arg( + long, + short = 'l', + conflicts_with("absolute_path"), + long_help = "Use a detailed listing format like 'ls -l'. This is basically an alias \ + for '--exec-batch ls -l' with some additional 'ls' options. This can be \ + used to see more metadata, to show symlink targets and to achieve a \ + deterministic sort order." + )] pub list_details: bool, /// Follow symbolic links - /// - /// By default, fd does not descend into symlinked directories. Using this - /// flag, symbolic links are also traversed. - /// Flag can be overridden with --no-follow. - #[arg(long, short = 'L', alias = "dereference")] + #[arg( + long, + short = 'L', + alias = "dereference", + long_help = "By default, fd does not descend into symlinked directories. Using this \ + flag, symbolic links are also traversed. \ + Flag can be overriden with --no-follow." + )] pub follow: bool, /// Search full abs. path (default: filename only) - /// - /// By default, the search pattern is only matched against the filename (or - /// directory name). Using this flag, the pattern is matched against the full - /// (absolute) path. - /// Example: - /// fd --glob -p '**/.git/config' - #[arg(long, short = 'p', verbatim_doc_comment)] + #[arg( + long, + short = 'p', + long_help = "By default, the search pattern is only matched against the filename (or \ + directory name). Using this flag, the pattern is matched against the full \ + (absolute) path. Example:\n \ + fd --glob -p '**/.git/config'" + )] pub full_path: bool, - /// Separate search results by the null character (instead of newlines). - /// Useful for piping results to 'xargs'. + /// Separate search results by the null character #[arg( long = "print0", short = '0', conflicts_with("list_details"), - hide_short_help = true + hide_short_help = true, + long_help = "Separate search results by the null character (instead of newlines). \ + Useful for piping results to 'xargs'." )] pub null_separator: bool, /// Set maximum search depth (default: none) - /// - /// Limit the directory traversal to a given depth. By default, there is no - /// limit on the search depth. - #[arg(long, short = 'd', value_name = "depth", alias("maxdepth"))] + #[arg( + long, + short = 'd', + value_name = "depth", + alias("maxdepth"), + long_help = "Limit the directory traversal to a given depth. By default, there is no \ + limit on the search depth." + )] max_depth: Option, /// Only show search results starting at the given depth. - /// See also: '--max-depth' and '--exact-depth' - #[arg(long, value_name = "depth", hide_short_help = true)] + #[arg( + long, + value_name = "depth", + hide_short_help = true, + long_help = "Only show search results starting at the given depth. \ + See also: '--max-depth' and '--exact-depth'" + )] min_depth: Option, - /// Only show search results at the exact given depth. This is an alias for - /// '--min-depth --max-depth '. - #[arg(long, value_name = "depth", hide_short_help = true, conflicts_with_all(&["max_depth", "min_depth"]))] + /// Only show search results at the exact given depth + #[arg(long, value_name = "depth", hide_short_help = true, conflicts_with_all(&["max_depth", "min_depth"]), + long_help = "Only show search results at the exact given depth. This is an alias for \ + '--min-depth --max-depth '.", + )] exact_depth: Option, /// Do not traverse into directories that match the search criteria. If /// you want to exclude specific directories, use the '--exclude=…' option. - #[arg(long, hide_short_help = true, conflicts_with_all(&["size", "exact_depth"]))] + #[arg(long, hide_short_help = true, conflicts_with_all(&["size", "exact_depth"]), + long_help = "Do not traverse into directories that match the search criteria. If \ + you want to exclude specific directories, use the '--exclude=…' option.", + )] pub prune: bool, /// Filter by type: file (f), directory (d), symlink (l), /// executable (x), empty (e), socket (s), pipe (p) - /// - /// Filter the search by type: - /// - /// 'f' or 'file': regular files - /// 'd' or 'directory': directories - /// 'l' or 'symlink': symbolic links - /// 's' or 'socket': socket - /// 'p' or 'pipe': named pipe (FIFO) - /// - /// 'x' or 'executable': executables - /// 'e' or 'empty': empty files or directories - /// - /// This option can be specified more than once to include multiple file types. - /// Searching for '--type file --type symlink' will show both regular files as - /// well as symlinks. Note that the 'executable' and 'empty' filters work differently: - /// '--type executable' implies '--type file' by default. And '--type empty' searches - /// for empty files and directories, unless either '--type file' or '--type directory' - /// is specified in addition. - /// - /// Examples: - /// - /// - Only search for files: - /// fd --type file … - /// fd -tf … - /// - Find both files and symlinks - /// fd --type file --type symlink … - /// fd -tf -tl … - /// - Find executable files: - /// fd --type executable - /// fd -tx - /// - Find empty files: - /// fd --type empty --type file - /// fd -te -tf - /// - Find empty directories: - /// fd --type empty --type directory - /// fd -te -td" #[arg( long = "type", short = 't', value_name = "filetype", hide_possible_values = true, value_enum, - verbatim_doc_comment + long_help = "Filter the search by type:\n \ + 'f' or 'file': regular files\n \ + 'd' or 'directory': directories\n \ + 'l' or 'symlink': symbolic links\n \ + 's' or 'socket': socket\n \ + 'p' or 'pipe': named pipe (FIFO)\n\n \ + 'x' or 'executable': executables\n \ + 'e' or 'empty': empty files or directories\n\n\ + This option can be specified more than once to include multiple file types. \ + Searching for '--type file --type symlink' will show both regular files as \ + well as symlinks. Note that the 'executable' and 'empty' filters work differently: \ + '--type executable' implies '--type file' by default. And '--type empty' searches \ + for empty files and directories, unless either '--type file' or '--type directory' \ + is specified in addition.\n\n\ + Examples:\n \ + - Only search for files:\n \ + fd --type file …\n \ + fd -tf …\n \ + - Find both files and symlinks\n \ + fd --type file --type symlink …\n \ + fd -tf -tl …\n \ + - Find executable files:\n \ + fd --type executable\n \ + fd -tx\n \ + - Find empty files:\n \ + fd --type empty --type file\n \ + fd -te -tf\n \ + - Find empty directories:\n \ + fd --type empty --type directory\n \ + fd -te -td" )] pub filetype: Option>, /// Filter by file extension - /// - /// (Additionally) filter search results by their file extension. Multiple - /// allowable file extensions can be specified. - /// If you want to search for files without extension, - /// you can use the regex '^[^.]+$' as a normal search pattern. - #[arg(long = "extension", short = 'e', value_name = "ext")] + #[arg( + long = "extension", + short = 'e', + value_name = "ext", + long_help = "(Additionally) filter search results by their file extension. Multiple \ + allowable file extensions can be specified.\n\ + If you want to search for files without extension, \ + you can use the regex '^[^.]+$' as a normal search pattern." + )] pub extensions: Option>, #[command(flatten)] pub exec: Exec, - /// Maximum number of arguments to pass to the command given with -X. - /// If the number of results is greater than the given size, - /// the command given with -X is run again with remaining arguments. - /// A batch size of zero means there is no limit (default), but note - /// that batching might still happen due to OS restrictions on the - /// maximum length of command lines. + /// Max number of arguments to run as a batch size with -X #[arg( long, value_name = "size", hide_short_help = true, requires("exec_batch"), value_parser = value_parser!(usize), - default_value_t + default_value_t, + long_help = "Maximum number of arguments to pass to the command given with -X. \ + If the number of results is greater than the given size, \ + the command given with -X is run again with remaining arguments. \ + A batch size of zero means there is no limit (default), but note \ + that batching might still happen due to OS restrictions on the \ + maximum length of command lines.", )] pub batch_size: usize, /// Exclude entries that match the given glob pattern - /// - /// Exclude files/directories that match the given glob pattern. This overrides any other - /// ignore logic. Multiple exclude patterns can be specified. - /// - /// Examples: - /// --exclude '*.pyc' - /// --exclude node_modules - #[arg(long, short = 'E', value_name = "pattern", verbatim_doc_comment)] + #[arg( + long, + short = 'E', + value_name = "pattern", + long_help = "Exclude files/directories that match the given glob pattern. This \ + overrides any other ignore logic. Multiple exclude patterns can be \ + specified.\n\n\ + Examples:\n \ + --exclude '*.pyc'\n \ + --exclude node_modules" + )] pub exclude: Vec, - /// Add a custom ignore-file in '.gitignore' format. These files have a low - /// precedence. - #[arg(long, value_name = "path", hide_short_help = true)] + /// Add a custom ignore-file in '.gitignore' format + #[arg( + long, + value_name = "path", + hide_short_help = true, + long_help = "Add a custom ignore-file in '.gitignore' format. These files have a low precedence" + )] pub ignore_file: Vec, /// When to use colors #[arg( @@ -303,7 +362,7 @@ pub struct Opts { value_enum, default_value_t = ColorWhen::Auto, value_name = "when", - verbatim_doc_comment + long_help = "Declare when to use color for the pattern match output", )] pub color: ColorWhen, /// Set number of threads to use for searching & executing (default: number @@ -311,24 +370,24 @@ pub struct Opts { #[arg(long, short = 'j', value_name = "num", hide_short_help = true, value_parser = 1..)] pub threads: Option, /// Limit results based on the size of files - /// - /// Limit results based on the size of files using the format <+->. - /// '+': file size must be greater than or equal to this - /// '-': file size must be less than or equal to this - /// If neither '+' nor '-' is specified, file size must be exactly equal to this. - /// 'NUM': The numeric size (e.g. 500) - /// 'UNIT': The units for NUM. They are not case-sensitive. - /// Allowed unit values: - /// 'b': bytes - /// 'k': kilobytes (base ten, 10^3 = 1000 bytes) - /// 'm': megabytes - /// 'g': gigabytes - /// 't': terabytes - /// 'ki': kibibytes (base two, 2^10 = 1024 bytes) - /// 'mi': mebibytes - /// 'gi': gibibytes - /// 'ti': tebibytes - #[arg(long, short = 'S', value_parser = SizeFilter::from_string, allow_hyphen_values = true, verbatim_doc_comment, value_name = "size")] + #[arg(long, short = 'S', value_parser = SizeFilter::from_string, allow_hyphen_values = true, verbatim_doc_comment, value_name = "size", + long_help = "Limit results based on the size of files using the format <+->.\n \ + '+': file size must be greater than or equal to this\n \ + '-': file size must be less than or equal to this\n\ + If neither '+' nor '-' is specified, file size must be exactly equal to this.\n \ + 'NUM': The numeric size (e.g. 500)\n \ + 'UNIT': The units for NUM. They are not case-sensitive.\n\ + Allowed unit values:\n \ + 'b': bytes\n \ + 'k': kilobytes (base ten, 10^3 = 1000 bytes)\n \ + 'm': megabytes\n \ + 'g': gigabytes\n \ + 't': terabytes\n \ + 'ki': kibibytes (base two, 2^10 = 1024 bytes)\n \ + 'mi': mebibytes\n \ + 'gi': gibibytes\n \ + 'ti': tebibytes", + )] pub size: Vec, /// Milliseconds to buffer before streaming search results to console /// @@ -337,131 +396,153 @@ pub struct Opts { #[arg(long, hide = true, value_parser = parse_millis)] pub max_buffer_time: Option, /// Filter by file modification time (newer than) - /// - /// The argument can be provided as a specific point in time (YYYY-MM-DD HH:MM:SS) - /// or as a duration (10h, 1d, 35min). - /// If the time is not specified, it defaults to 00:00:00. - /// '--change-newer-than' or '--newer' can be used as aliases. - /// Examples: - /// --changed-within 2weeks - /// --change-newer-than '2018-10-27 10:00:00' - /// --newer 2018-10-27 #[arg( long, alias("change-newer-than"), alias("newer"), value_name = "date|dur", - verbatim_doc_comment + long_help = "Filter results based on the file modification time. The argument can be provided \ + as a specific point in time (YYYY-MM-DD HH:MM:SS) or as a duration (10h, 1d, 35min). \ + If the time is not specified, it defaults to 00:00:00. \ + '--change-newer-than' or '--newer' can be used as aliases.\n\ + Examples:\n \ + --changed-within 2weeks\n \ + --change-newer-than '2018-10-27 10:00:00'\n \ + --newer 2018-10-27" )] pub changed_within: Option, /// Filter by file modification time (older than) - /// - /// The argument can be provided as a specific point in time (YYYY-MM-DD HH:MM:SS) - /// or as a duration (10h, 1d, 35min). - /// '--change-older-than' or '--older' can be used as aliases. - /// - /// Examples: - /// --changed-before '2018-10-27 10:00:00' - /// --change-older-than 2weeks - /// --older 2018-10-27 #[arg( long, alias("change-older-than"), alias("older"), value_name = "date|dur", - verbatim_doc_comment + long_help = "Filter results based on the file modification time. The argument can be provided \ + as a specific point in time (YYYY-MM-DD HH:MM:SS) or as a duration (10h, 1d, 35min). \ + '--change-older-than' or '--older' can be used as aliases.\n\ + Examples:\n \ + --changed-before '2018-10-27 10:00:00'\n \ + --change-older-than 2weeks\n \ + --older 2018-10-27" )] pub changed_before: Option, /// Limit number of search results - /// - /// Limit the number of search results to 'count' and quit immediately. - #[arg(long, value_name = "count", hide_short_help = true)] + #[arg( + long, + value_name = "count", + hide_short_help = true, + long_help = "Limit the number of search results to 'count' and quit immediately." + )] max_results: Option, - /// Limit search to a single result and quit immediately - /// - /// This is an alias for '--max-results=1'. - #[arg(short = '1', hide_short_help = true, overrides_with("max_results"))] + /// Limit search to a single result + #[arg( + short = '1', + hide_short_help = true, + overrides_with("max_results"), + long_help = "Limit the search to a single result and quit immediately. \ + This is an alias for '--max-results=1'." + )] max_one_result: bool, /// Print nothing, exit code 0 if match found, 1 otherwise - /// - /// When the flag is present, the program does not print anything and will - /// return with an exit code of 0 if there is at least one match. Otherwise, the - /// exit code will be 1. - /// - /// '--has-results' can be used as an alias. #[arg( long, short = 'q', alias = "has-results", hide_short_help = true, - conflicts_with("max_results") + conflicts_with("max_results"), + long_help = "When the flag is present, the program does not print anything and will \ + return with an exit code of 0 if there is at least one match. Otherwise, the \ + exit code will be 1. \ + '--has-results' can be used as an alias." )] pub quiet: bool, /// Show filesystem errors - /// - ///Enable the display of filesystem errors for situations such as - ///insufficient permissions or dead symlinks. - #[arg(long, hide_short_help = true)] + #[arg( + long, + hide_short_help = true, + long_help = "Enable the display of filesystem errors for situations such as \ + insufficient permissions or dead symlinks." + )] pub show_errors: bool, - /// Change the current working directory of fd to the provided path. This - /// means that search results will be shown with respect to the given base - /// path. Note that relative paths which are passed to fd via the positional - /// argument or the '--search-path' option will also be resolved - /// relative to this directory. - #[arg(long, value_name = "path", hide_short_help = true)] + /// Change current working directory + #[arg( + long, + value_name = "path", + hide_short_help = true, + long_help = "Change the current working directory of fd to the provided path. This \ + means that search results will be shown with respect to the given base \ + path. Note that relative paths which are passed to fd via the positional \ + argument or the '--search-path' option will also be resolved \ + relative to this directory." + )] pub base_directory: Option, /// the search pattern (a regular expression, unless '--glob' is used; optional) - /// - /// the search pattern which is either a regular expression (default) or a glob - /// pattern (if --glob is used). If no pattern has been specified, every entry - /// is considered a match. If your pattern starts with a dash (-), make sure to - /// pass '--' first, or it will be considered as a flag (fd -- '-foo'). - #[arg(default_value = "", hide_default_value = true)] + #[arg( + default_value = "", + hide_default_value = true, + value_name = "pattern", + long_help = "the search pattern which is either a regular expression (default) or a glob \ + pattern (if --glob is used). If no pattern has been specified, every entry \ + is considered a match. If your pattern starts with a dash (-), make sure to \ + pass '--' first, or it will be considered as a flag (fd -- '-foo')." + )] pub pattern: String, /// Set path separator when printing file paths - /// Set the path separator to use when printing file paths. The default is - /// the OS-specific separator ('/' on Unix, '\\' on Windows). - #[arg(long, value_name = "separator", hide_short_help = true)] + #[arg( + long, + value_name = "separator", + hide_short_help = true, + long_help = "Set the path separator to use when printing file paths. The default is \ + the OS-specific separator ('/' on Unix, '\\' on Windows)." + )] pub path_separator: Option, /// the root directories for the filesystem search (optional) - /// - /// The directories where the filesystem search is rooted. - /// If omitted, search the current working directory. - #[arg(action = ArgAction::Append)] + #[arg(action = ArgAction::Append, + value_name = "path", + long_help = "The directory where the filesystem search is rooted (optional). If \ + omitted, search the current working directory.", + )] path: Vec, /// Provides paths to search as an alternative to the positional argument - /// - /// Changes the usage to `fd [OPTIONS] --search-path --search-path []` - #[arg(long, conflicts_with("path"), hide_short_help = true)] + #[arg( + long, + conflicts_with("path"), + value_name = "search-path", + hide_short_help = true, + long_help = "Provide paths to search as an alternative to the positional \ + argument. Changes the usage to `fd [OPTIONS] --search-path \ + --search-path []`" + )] search_path: Vec, - /// strip './' prefix from -0/--print-0 output - /// /// By default, relative paths are prefixed with './' when -x/--exec, /// -X/--exec-batch, or -0/--print0 are given, to reduce the risk of a /// path starting with '-' being treated as a command line option. Use /// this flag to disable this behaviour. - #[arg(long, conflicts_with_all(&["path", "search_path"]), hide_short_help = true)] + #[arg(long, conflicts_with_all(&["path", "search_path"]), hide_short_help = true, + long_help = "By default, relative paths are prefixed with './' when -x/--exec, \ + -X/--exec-batch, or -0/--print0 are given, to reduce the risk of a \ + path starting with '-' being treated as a command line option. Use \ + this flag to disable this behaviour.", + )] pub strip_cwd_prefix: bool, /// Filter by owning user and/or group - /// - /// Format: [(user|uid)][:(group|gid)]. - /// Either side is optional. Precede either side with a '!' to exclude files instead. - /// - /// Examples: - /// --owner john - /// --owner :students - /// --owner '!john:students' #[cfg(unix)] - #[arg(long, short = 'o', value_parser = OwnerFilter::from_string, value_name = "user:group", verbatim_doc_comment)] + #[arg(long, short = 'o', value_parser = OwnerFilter::from_string, value_name = "user:group", + long_help = "Filter files by their user and/or group. \ + Format: [(user|uid)][:(group|gid)]. Either side is optional. \ + Precede either side with a '!' to exclude files instead.\n\ + Examples:\n \ + --owner john\n \ + --owner :students\n \ + --owner '!john:students'" + )] pub owner: Option, - /// Do not descend into a different file system - /// - /// By default, fd will traverse the file system tree as far as other options - /// dictate. With this flag, fd ensures that it does not descend into a - /// different file system than the one it started in. Comparable to the -mount - /// or -xdev filters of find(1). #[cfg(any(unix, windows))] - #[arg(long, aliases(&["mount", "xdev"]), hide_short_help = true)] + #[arg(long, aliases(&["mount", "xdev"]), hide_short_help = true, + long_help = "By default, fd will traverse the file system tree as far as other options \ + dictate. With this flag, fd ensures that it does not descend into a \ + different file system than the one it started in. Comparable to the -mount \ + or -xdev filters of find(1).")] pub one_file_system: bool, #[cfg(feature = "completions")] @@ -609,8 +690,8 @@ impl ColorWhen { use ColorWhen::*; match *self { Auto => "auto", - Always => "always", Never => "never", + Always => "always", } } }