Support args and renaming files
parent
15a2b700cd
commit
f5c36382b6
|
@ -2,6 +2,55 @@
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstream"
|
||||||
|
version = "0.6.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526"
|
||||||
|
dependencies = [
|
||||||
|
"anstyle",
|
||||||
|
"anstyle-parse",
|
||||||
|
"anstyle-query",
|
||||||
|
"anstyle-wincon",
|
||||||
|
"colorchoice",
|
||||||
|
"is_terminal_polyfill",
|
||||||
|
"utf8parse",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle"
|
||||||
|
version = "1.0.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle-parse"
|
||||||
|
version = "0.2.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb"
|
||||||
|
dependencies = [
|
||||||
|
"utf8parse",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle-query"
|
||||||
|
version = "1.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a"
|
||||||
|
dependencies = [
|
||||||
|
"windows-sys 0.52.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle-wincon"
|
||||||
|
version = "3.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8"
|
||||||
|
dependencies = [
|
||||||
|
"anstyle",
|
||||||
|
"windows-sys 0.52.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.3.0"
|
version = "1.3.0"
|
||||||
|
@ -32,6 +81,52 @@ version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap"
|
||||||
|
version = "4.5.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615"
|
||||||
|
dependencies = [
|
||||||
|
"clap_builder",
|
||||||
|
"clap_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_builder"
|
||||||
|
version = "4.5.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b"
|
||||||
|
dependencies = [
|
||||||
|
"anstream",
|
||||||
|
"anstyle",
|
||||||
|
"clap_lex",
|
||||||
|
"strsim",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_derive"
|
||||||
|
version = "4.5.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab"
|
||||||
|
dependencies = [
|
||||||
|
"heck",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_lex"
|
||||||
|
version = "0.7.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "colorchoice"
|
||||||
|
version = "1.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossterm"
|
name = "crossterm"
|
||||||
version = "0.25.0"
|
version = "0.25.0"
|
||||||
|
@ -77,6 +172,7 @@ dependencies = [
|
||||||
name = "dirbuilder"
|
name = "dirbuilder"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"clap",
|
||||||
"crossterm 0.28.1",
|
"crossterm 0.28.1",
|
||||||
"tui",
|
"tui",
|
||||||
]
|
]
|
||||||
|
@ -91,12 +187,24 @@ dependencies = [
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "heck"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hermit-abi"
|
name = "hermit-abi"
|
||||||
version = "0.3.9"
|
version = "0.3.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
|
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "is_terminal_polyfill"
|
||||||
|
version = "1.70.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.159"
|
version = "0.2.159"
|
||||||
|
@ -173,6 +281,24 @@ dependencies = [
|
||||||
"windows-targets 0.52.6",
|
"windows-targets 0.52.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.86"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.37"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.5.5"
|
version = "0.5.5"
|
||||||
|
@ -238,6 +364,23 @@ version = "1.13.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strsim"
|
||||||
|
version = "0.11.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.79"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tui"
|
name = "tui"
|
||||||
version = "0.19.0"
|
version = "0.19.0"
|
||||||
|
@ -251,6 +394,12 @@ dependencies = [
|
||||||
"unicode-width",
|
"unicode-width",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-segmentation"
|
name = "unicode-segmentation"
|
||||||
version = "1.12.0"
|
version = "1.12.0"
|
||||||
|
@ -263,6 +412,12 @@ version = "0.1.14"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
|
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "utf8parse"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasi"
|
name = "wasi"
|
||||||
version = "0.11.0+wasi-snapshot-preview1"
|
version = "0.11.0+wasi-snapshot-preview1"
|
||||||
|
|
|
@ -4,6 +4,7 @@ version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
clap = { version = "4.5.19", features = ["derive"] }
|
||||||
crossterm = "0.28.1"
|
crossterm = "0.28.1"
|
||||||
tui = "0.19.0"
|
tui = "0.19.0"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
use clap::Parser;
|
||||||
|
|
||||||
|
#[derive(Parser)]
|
||||||
|
pub struct Args {
|
||||||
|
/// root of the new filesystem
|
||||||
|
#[arg(
|
||||||
|
default_value_t = String::from(".")
|
||||||
|
)]
|
||||||
|
pub root: String
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
mod display;
|
mod display;
|
||||||
mod item;
|
mod item;
|
||||||
|
|
||||||
use std::fs::{remove_dir_all, remove_file, DirBuilder, File};
|
use std::fs::{remove_dir_all, remove_file, rename, DirBuilder, File};
|
||||||
use std::io::Error;
|
use std::io::Error;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ use item::Item;
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
pub struct Directory {
|
pub struct Directory {
|
||||||
dirs: Vec<Item>,
|
dirs: Vec<Item>,
|
||||||
|
src_name: Option<PathBuf>,
|
||||||
selection: u16,
|
selection: u16,
|
||||||
editing: bool,
|
editing: bool,
|
||||||
}
|
}
|
||||||
|
@ -28,6 +29,7 @@ impl Directory {
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
dirs: vec![Item::new(root, 0, false)],
|
dirs: vec![Item::new(root, 0, false)],
|
||||||
|
src_name: None,
|
||||||
selection: 0,
|
selection: 0,
|
||||||
editing: false,
|
editing: false,
|
||||||
})
|
})
|
||||||
|
@ -134,6 +136,7 @@ impl Directory {
|
||||||
KeyCode::Up => self.select_prev(),
|
KeyCode::Up => self.select_prev(),
|
||||||
KeyCode::Down => self.select_next(),
|
KeyCode::Down => self.select_next(),
|
||||||
KeyCode::Enter => {
|
KeyCode::Enter => {
|
||||||
|
self.src_name = Some(self.path());
|
||||||
self.editing = true;
|
self.editing = true;
|
||||||
},
|
},
|
||||||
KeyCode::Esc => return Message::Exit,
|
KeyCode::Esc => return Message::Exit,
|
||||||
|
@ -149,7 +152,6 @@ impl Directory {
|
||||||
.unwrap_or(self.dirs.len());
|
.unwrap_or(self.dirs.len());
|
||||||
|
|
||||||
self.dirs.drain(self.selection() .. end);
|
self.dirs.drain(self.selection() .. end);
|
||||||
|
|
||||||
}
|
}
|
||||||
if self.selection() >= self.dirs.len() {
|
if self.selection() >= self.dirs.len() {
|
||||||
self.selection -= 1;
|
self.selection -= 1;
|
||||||
|
@ -164,10 +166,23 @@ impl Directory {
|
||||||
pub fn update_edit(&mut self, key: KeyCode) -> Message {
|
pub fn update_edit(&mut self, key: KeyCode) -> Message {
|
||||||
match key {
|
match key {
|
||||||
KeyCode::Char(c) => self.selected_mut().name.push(c),
|
KeyCode::Char(c) => self.selected_mut().name.push(c),
|
||||||
KeyCode::Enter | KeyCode::Esc if !self.selected().name.is_empty() => {
|
KeyCode::Enter if !self.selected().name.is_empty() => {
|
||||||
self.create().unwrap();
|
self.create().unwrap();
|
||||||
|
if let Some(src) = self.src_name.take() {
|
||||||
|
rename(src, self.path()).unwrap();
|
||||||
|
}
|
||||||
self.editing = false;
|
self.editing = false;
|
||||||
},
|
},
|
||||||
|
KeyCode::Esc => {
|
||||||
|
if let Some(prev) = self.src_name.take() {
|
||||||
|
self.selected_mut().name = prev.file_name()
|
||||||
|
.and_then(|s| s.to_str())
|
||||||
|
.map_or(String::new(), ToOwned::to_owned);
|
||||||
|
self.editing = false;
|
||||||
|
} else if self.selected().name.len() > 0 {
|
||||||
|
self.editing = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
KeyCode::Backspace => {
|
KeyCode::Backspace => {
|
||||||
self.selected_mut().name.pop();
|
self.selected_mut().name.pop();
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
mod args;
|
||||||
mod command;
|
mod command;
|
||||||
mod command_output;
|
mod command_output;
|
||||||
mod directory;
|
mod directory;
|
||||||
|
@ -5,19 +6,23 @@ mod pane;
|
||||||
mod state;
|
mod state;
|
||||||
mod terminal;
|
mod terminal;
|
||||||
|
|
||||||
|
use args::Args;
|
||||||
use state::State;
|
use state::State;
|
||||||
use terminal::Terminal;
|
use terminal::Terminal;
|
||||||
use pane::prelude::*;
|
use pane::prelude::*;
|
||||||
|
|
||||||
use std::io::Error;
|
use std::io::Error;
|
||||||
|
|
||||||
|
use clap::Parser;
|
||||||
use crossterm::event::{read, Event, KeyEvent};
|
use crossterm::event::{read, Event, KeyEvent};
|
||||||
|
|
||||||
fn main() -> Result<(), Error> {
|
fn main() -> Result<(), Error> {
|
||||||
|
let args = Args::parse();
|
||||||
|
|
||||||
let mut terminal = Terminal::new()?;
|
let mut terminal = Terminal::new()?;
|
||||||
let area = terminal.size()?;
|
let area = terminal.size()?;
|
||||||
|
|
||||||
let mut state = State::new(area)?;
|
let mut state = State::new(args.root, area)?;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
state.render(&mut terminal)?;
|
state.render(&mut terminal)?;
|
||||||
|
|
|
@ -22,8 +22,8 @@ pub struct State {
|
||||||
command: Option<Either<Command, CommandOutput>>
|
command: Option<Either<Command, CommandOutput>>
|
||||||
}
|
}
|
||||||
impl State {
|
impl State {
|
||||||
pub fn new(area: Rect) -> Result<Self, Error> {
|
pub fn new(root: String, area: Rect) -> Result<Self, Error> {
|
||||||
let dir = Directory::new("root".into())?;
|
let dir = Directory::new(root)?;
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
dir,
|
dir,
|
||||||
size: area,
|
size: area,
|
||||||
|
|
Loading…
Reference in New Issue