From c0ca596539d7aff3f7d2d7e3e565312316b35c73 Mon Sep 17 00:00:00 2001 From: Arijit Basu Date: Fri, 2 Apr 2021 18:03:56 +0530 Subject: [PATCH] Fix create mode, refactor readers, fix init focus --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/app.rs | 2 +- src/config.rs | 5 +-- src/event_reader.rs | 35 +++++++++++++++++++++ src/lib.rs | 2 ++ src/main.rs | 77 +++++++++++---------------------------------- src/pipe_reader.rs | 24 ++++++++++++++ 8 files changed, 85 insertions(+), 64 deletions(-) create mode 100644 src/event_reader.rs create mode 100644 src/pipe_reader.rs diff --git a/Cargo.lock b/Cargo.lock index 7d20c39..aadd86b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1123,7 +1123,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "xplr" -version = "0.2.11" +version = "0.2.12" dependencies = [ "anyhow", "criterion", diff --git a/Cargo.toml b/Cargo.toml index e622128..9135a3a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "xplr" -version = "0.2.11" # Update app.rs +version = "0.2.12" # Update app.rs authors = ["Arijit Basu "] edition = "2018" description = "An experimental, minimal, configurable TUI file explorer, stealing ideas from nnn and fzf." diff --git a/src/app.rs b/src/app.rs index 1b4105b..adb5d79 100644 --- a/src/app.rs +++ b/src/app.rs @@ -13,7 +13,7 @@ use std::fs; use std::io; use std::path::PathBuf; -pub const VERSION: &str = "v0.2.11"; // Update Cargo.toml +pub const VERSION: &str = "v0.2.12"; // Update Cargo.toml pub const TEMPLATE_TABLE_ROW: &str = "TEMPLATE_TABLE_ROW"; diff --git a/src/config.rs b/src/config.rs index 9b98fda..805b27a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -280,6 +280,7 @@ impl Default for KeyBindings { - Call: command: bash args: [] + - Explore /: help: search @@ -521,7 +522,7 @@ impl Default for Config { name: create key_bindings: on_key: - f: + enter: help: create file messages: - Call: @@ -534,7 +535,7 @@ impl Default for Config { - SwitchMode: default - Explore - d: + ctrl-d: help: create directory messages: - Call: diff --git a/src/event_reader.rs b/src/event_reader.rs new file mode 100644 index 0000000..e6adb25 --- /dev/null +++ b/src/event_reader.rs @@ -0,0 +1,35 @@ +use crate::app::Task; +use crate::app::{ExternalMsg, InternalMsg, MsgIn}; +use crate::input::Key; +use crossterm::event::{self, Event}; +use std::sync::mpsc::{Receiver, Sender}; +use std::thread; + +pub fn keep_reading(tx_msg_in: Sender, rx_event_reader: Receiver) { + thread::spawn(move || { + let mut is_paused = false; + loop { + if let Some(paused) = rx_event_reader.try_recv().ok() { + is_paused = paused; + }; + + if !is_paused { + if event::poll(std::time::Duration::from_millis(1)).unwrap() { + match event::read().unwrap() { + Event::Key(key) => { + let key = Key::from_event(key); + let msg = MsgIn::Internal(InternalMsg::HandleKey(key)); + tx_msg_in.send(Task::new(0, msg, Some(key))).unwrap(); + } + + Event::Resize(_, _) => { + let msg = MsgIn::External(ExternalMsg::Refresh); + tx_msg_in.send(Task::new(0, msg, None)).unwrap(); + } + _ => {} + } + } + } + } + }); +} diff --git a/src/lib.rs b/src/lib.rs index c635daa..ecd2d56 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,3 +3,5 @@ pub mod config; pub mod explorer; pub mod input; pub mod ui; +pub mod pipe_reader; +pub mod event_reader; diff --git a/src/main.rs b/src/main.rs index 2e6275f..dafe693 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,19 +1,18 @@ use anyhow::Result; -use crossterm::event::Event; use crossterm::terminal as term; -use crossterm::{event, execute}; +use crossterm::execute; use handlebars::Handlebars; use std::fs; use std::io::prelude::*; +use std::path::PathBuf; use std::sync::mpsc; -use std::thread; -use std::time::Duration; use termion::get_tty; use tui::backend::CrosstermBackend; use tui::Terminal; use xplr::app; +use xplr::event_reader; use xplr::explorer; -use xplr::input::Key; +use xplr::pipe_reader; use xplr::ui; fn main() -> Result<()> { @@ -36,10 +35,7 @@ fn main() -> Result<()> { let mut result = Ok(()); let mut output = None; - let (tx_key, rx) = mpsc::channel(); - let tx_init = tx_key.clone(); - let tx_pipe = tx_key.clone(); - let tx_explorer = tx_key.clone(); + let (tx_msg_in, rx_msg_in) = mpsc::channel(); term::enable_raw_mode()?; let mut stdout = get_tty()?; @@ -50,54 +46,17 @@ fn main() -> Result<()> { let mut terminal = Terminal::new(backend)?; terminal.hide_cursor()?; - let (tx, rx_key) = mpsc::channel(); - thread::spawn(move || { - let mut is_paused = false; - loop { - if let Some(paused) = rx_key.try_recv().ok() { - is_paused = paused; - }; - - if !is_paused { - if event::poll(std::time::Duration::from_millis(1)).unwrap() { - match event::read().unwrap() { - Event::Key(key) => { - let key = Key::from_event(key); - let msg = app::MsgIn::Internal(app::InternalMsg::HandleKey(key)); - tx_key.send(app::Task::new(0, msg, Some(key))).unwrap(); - } - - Event::Resize(_, _) => { - let msg = app::MsgIn::External(app::ExternalMsg::Refresh); - tx_key.send(app::Task::new(0, msg, None)).unwrap(); - } - _ => {} - } - } - } - } + let focused_path = std::env::args().skip(1).next().and_then(|p| { + PathBuf::from(p) + .file_name() + .map(|n| n.to_string_lossy().to_string()) }); + explorer::explore(app.pwd().clone(), focused_path, tx_msg_in.clone()); - let pipe_msg_in = app.pipes().msg_in.clone(); - thread::spawn(move || loop { - let in_str = fs::read_to_string(&pipe_msg_in).unwrap_or_default(); - - if !in_str.is_empty() { - let msgs = in_str - .lines() - .filter_map(|s| serde_yaml::from_str::(s.trim()).ok()); - - msgs.for_each(|msg| { - tx_pipe - .send(app::Task::new(2, app::MsgIn::External(msg), None)) - .unwrap(); - }); - fs::write(&pipe_msg_in, "").unwrap(); - }; - thread::sleep(Duration::from_millis(10)); - }); + pipe_reader::keep_reading(app.pipes().msg_in.clone(), tx_msg_in.clone()); - explorer::explore(app.pwd().clone(), std::env::args().skip(1).next(), tx_init); + let (tx_event_reader, rx_event_reader) = mpsc::channel(); + event_reader::keep_reading(tx_msg_in.clone(), rx_event_reader); let mut last_pwd = app.pwd().clone(); 'outer: while result.is_ok() { @@ -126,7 +85,7 @@ fn main() -> Result<()> { explorer::explore( app.pwd().clone(), app.focused_node().map(|n| n.relative_path.clone()), - tx_explorer.clone(), + tx_msg_in.clone(), ); } @@ -135,7 +94,7 @@ fn main() -> Result<()> { explorer::explore( app.pwd().clone(), app.focused_node().map(|n| n.relative_path.clone()), - tx_explorer.clone(), + tx_msg_in.clone(), ); last_pwd = app.pwd().to_owned(); }; @@ -166,7 +125,7 @@ fn main() -> Result<()> { } app::MsgOut::Call(cmd) => { - tx.send(true)?; + tx_event_reader.send(true)?; terminal.clear()?; term::disable_raw_mode()?; execute!(terminal.backend_mut(), term::LeaveAlternateScreen)?; @@ -232,13 +191,13 @@ fn main() -> Result<()> { terminal.hide_cursor()?; execute!(terminal.backend_mut(), term::EnterAlternateScreen)?; term::enable_raw_mode()?; - tx.send(false)?; + tx_event_reader.send(false)?; terminal.draw(|f| ui::draw(f, &app, &hb))?; } }; } - for task in rx.try_iter() { + for task in rx_msg_in.try_iter() { app = app.enqueue(task); } diff --git a/src/pipe_reader.rs b/src/pipe_reader.rs new file mode 100644 index 0000000..c984819 --- /dev/null +++ b/src/pipe_reader.rs @@ -0,0 +1,24 @@ +use crate::app::{ExternalMsg, MsgIn, Task}; +use serde_yaml; +use std::fs; +use std::sync::mpsc::Sender; +use std::thread; +use std::time::Duration; + +pub fn keep_reading(pipe: String, tx: Sender) { + thread::spawn(move || loop { + let in_str = fs::read_to_string(&pipe).unwrap_or_default(); + + if !in_str.is_empty() { + let msgs = in_str + .lines() + .filter_map(|s| serde_yaml::from_str::(s.trim()).ok()); + + msgs.for_each(|msg| { + tx.send(Task::new(2, MsgIn::External(msg), None)).unwrap(); + }); + fs::write(&pipe, "").unwrap(); + }; + thread::sleep(Duration::from_millis(10)); + }); +}