mirror of
https://github.com/Llewellynvdm/exa.git
synced 2024-11-26 22:06:26 +00:00
Change the way columns are created
You can now have different columns per directory. So now, the Git column only appears when there's a Git repository in the current directory.
This commit is contained in:
parent
947087567c
commit
b0cdd17b97
@ -56,7 +56,7 @@ fn exa(options: &Options) {
|
|||||||
let mut first = files.is_empty();
|
let mut first = files.is_empty();
|
||||||
|
|
||||||
if !files.is_empty() {
|
if !files.is_empty() {
|
||||||
options.view(files);
|
options.view(None, files);
|
||||||
}
|
}
|
||||||
|
|
||||||
for dir_name in dirs.iter() {
|
for dir_name in dirs.iter() {
|
||||||
@ -68,7 +68,7 @@ fn exa(options: &Options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
match Dir::readdir(Path::new(dir_name.clone())) {
|
match Dir::readdir(Path::new(dir_name.clone())) {
|
||||||
Ok(dir) => {
|
Ok(ref dir) => {
|
||||||
let unsorted_files = dir.files();
|
let unsorted_files = dir.files();
|
||||||
let files: Vec<File> = options.transform_files(unsorted_files);
|
let files: Vec<File> = options.transform_files(unsorted_files);
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ fn exa(options: &Options) {
|
|||||||
println!("{}:", dir_name);
|
println!("{}:", dir_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
options.view(files);
|
options.view(Some(dir), files);
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("{}: {}", dir_name, e);
|
println!("{}: {}", dir_name, e);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
extern crate getopts;
|
extern crate getopts;
|
||||||
extern crate natord;
|
extern crate natord;
|
||||||
|
|
||||||
|
use dir::Dir;
|
||||||
use file::File;
|
use file::File;
|
||||||
use column::{Column, SizeFormat};
|
use column::{Column, SizeFormat};
|
||||||
use column::Column::*;
|
use column::Column::*;
|
||||||
@ -78,8 +79,8 @@ impl Options {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Display the files using this Option's View.
|
/// Display the files using this Option's View.
|
||||||
pub fn view(&self, files: Vec<File>) {
|
pub fn view(&self, dir: Option<&Dir>, files: Vec<File>) {
|
||||||
self.view.view(files)
|
self.view.view(dir, files)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Transform the files (sorting, reversing, filtering) before listing them.
|
/// Transform the files (sorting, reversing, filtering) before listing them.
|
||||||
@ -187,7 +188,7 @@ fn view(matches: &getopts::Matches) -> Result<View, Misfire> {
|
|||||||
Err(Misfire::Useless("oneline", true, "long"))
|
Err(Misfire::Useless("oneline", true, "long"))
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Ok(View::Details(try!(columns(matches)), matches.opt_present("header")))
|
Ok(View::Details(try!(Columns::new(matches)), matches.opt_present("header")))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if matches.opt_present("binary") {
|
else if matches.opt_present("binary") {
|
||||||
@ -237,40 +238,62 @@ fn file_size(matches: &getopts::Matches) -> Result<SizeFormat, Misfire> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Turns the Getopts results object into a list of columns for the columns
|
#[derive(PartialEq, Copy, Debug)]
|
||||||
/// view, depending on the passed-in command-line arguments.
|
pub struct Columns {
|
||||||
fn columns(matches: &getopts::Matches) -> Result<Vec<Column>, Misfire> {
|
size_format: SizeFormat,
|
||||||
|
inode: bool,
|
||||||
|
links: bool,
|
||||||
|
blocks: bool,
|
||||||
|
group: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Columns {
|
||||||
|
pub fn new(matches: &getopts::Matches) -> Result<Columns, Misfire> {
|
||||||
|
Ok(Columns {
|
||||||
|
size_format: try!(file_size(matches)),
|
||||||
|
inode: matches.opt_present("inode"),
|
||||||
|
links: matches.opt_present("links"),
|
||||||
|
blocks: matches.opt_present("blocks"),
|
||||||
|
group: matches.opt_present("group"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn for_dir(&self, dir: Option<&Dir>) -> Vec<Column> {
|
||||||
let mut columns = vec![];
|
let mut columns = vec![];
|
||||||
|
|
||||||
if matches.opt_present("inode") {
|
if self.inode {
|
||||||
columns.push(Inode);
|
columns.push(Inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
columns.push(Permissions);
|
columns.push(Permissions);
|
||||||
|
|
||||||
if matches.opt_present("links") {
|
if self.links {
|
||||||
columns.push(HardLinks);
|
columns.push(HardLinks);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fail early here if two file size flags are given
|
columns.push(FileSize(self.size_format));
|
||||||
columns.push(FileSize(try!(file_size(matches))));
|
|
||||||
|
|
||||||
if matches.opt_present("blocks") {
|
if self.blocks {
|
||||||
columns.push(Blocks);
|
columns.push(Blocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
columns.push(User);
|
columns.push(User);
|
||||||
|
|
||||||
if matches.opt_present("group") {
|
if self.group {
|
||||||
columns.push(Group);
|
columns.push(Group);
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg!(feature="git") {
|
if cfg!(feature="git") {
|
||||||
|
if let Some(d) = dir {
|
||||||
|
if d.has_git_repo() {
|
||||||
columns.push(GitStatus);
|
columns.push(GitStatus);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
columns.push(FileName);
|
columns.push(FileName);
|
||||||
Ok(columns)
|
columns
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -373,5 +396,4 @@ mod test {
|
|||||||
let opts = Options::getopts(&[ "--blocks".to_string() ]);
|
let opts = Options::getopts(&[ "--blocks".to_string() ]);
|
||||||
assert_eq!(opts.unwrap_err(), Misfire::Useless("blocks", false, "long"))
|
assert_eq!(opts.unwrap_err(), Misfire::Useless("blocks", false, "long"))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,23 +3,25 @@ use std::iter::{AdditiveIterator, repeat};
|
|||||||
|
|
||||||
use column::{Column, Cell};
|
use column::{Column, Cell};
|
||||||
use column::Alignment::Left;
|
use column::Alignment::Left;
|
||||||
|
use dir::Dir;
|
||||||
use file::File;
|
use file::File;
|
||||||
|
use options::Columns;
|
||||||
use users::OSUsers;
|
use users::OSUsers;
|
||||||
|
|
||||||
use ansi_term::Style::Plain;
|
use ansi_term::Style::Plain;
|
||||||
|
|
||||||
#[derive(PartialEq, Debug)]
|
#[derive(PartialEq, Copy, Debug)]
|
||||||
pub enum View {
|
pub enum View {
|
||||||
Details(Vec<Column>, bool),
|
Details(Columns, bool),
|
||||||
Lines,
|
Lines,
|
||||||
Grid(bool, usize),
|
Grid(bool, usize),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl View {
|
impl View {
|
||||||
pub fn view(&self, files: Vec<File>) {
|
pub fn view(&self, dir: Option<&Dir>, files: Vec<File>) {
|
||||||
match *self {
|
match *self {
|
||||||
View::Grid(across, width) => grid_view(across, width, files),
|
View::Grid(across, width) => grid_view(across, width, files),
|
||||||
View::Details(ref cols, header) => details_view(cols, files, header),
|
View::Details(ref cols, header) => details_view(&*cols.for_dir(dir), files, header),
|
||||||
View::Lines => lines_view(files),
|
View::Lines => lines_view(files),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,7 +122,7 @@ fn grid_view(across: bool, console_width: usize, files: Vec<File>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn details_view(columns: &Vec<Column>, files: Vec<File>, header: bool) {
|
fn details_view(columns: &[Column], files: Vec<File>, header: bool) {
|
||||||
// The output gets formatted into columns, which looks nicer. To
|
// The output gets formatted into columns, which looks nicer. To
|
||||||
// do this, we have to write the results into a table, instead of
|
// do this, we have to write the results into a table, instead of
|
||||||
// displaying each file immediately, then calculating the maximum
|
// displaying each file immediately, then calculating the maximum
|
||||||
|
Loading…
Reference in New Issue
Block a user