Run commands in current terminal by default; 'o' opens in new window
This commit is contained in:
parent
378b6d3645
commit
a09b8b5573
3 changed files with 36 additions and 7 deletions
|
|
@ -19,6 +19,7 @@ pub struct App {
|
||||||
pub file_index: usize,
|
pub file_index: usize,
|
||||||
pub section_index: usize,
|
pub section_index: usize,
|
||||||
pub focus: Focus,
|
pub focus: Focus,
|
||||||
|
pub pending_command: Option<Vec<String>>,
|
||||||
pub message: Option<String>,
|
pub message: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -34,6 +35,7 @@ impl App {
|
||||||
file_index: 0,
|
file_index: 0,
|
||||||
section_index: 0,
|
section_index: 0,
|
||||||
focus: Focus::Groups,
|
focus: Focus::Groups,
|
||||||
|
pending_command: None,
|
||||||
message: None,
|
message: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,11 +41,28 @@ pub fn handle_event(app: &mut App, event: AppEvent) -> bool {
|
||||||
edit_file(&file.path, &app.terminal, &app.shell);
|
edit_file(&file.path, &app.terminal, &app.shell);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
KeyCode::Enter => {
|
KeyCode::Char('o') => {
|
||||||
if let (Some(section), Some(file)) = (app.current_section(), app.current_file()) {
|
if let (Some(section), Some(file)) = (app.current_section(), app.current_file()) {
|
||||||
run_section(section, file, &app.terminal, &app.shell, &app.data_dir);
|
run_section(section, file, &app.terminal, &app.shell, &app.data_dir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
KeyCode::Enter => {
|
||||||
|
if let (Some(section), Some(file)) = (app.current_section(), app.current_file()) {
|
||||||
|
let commands = if section.is_run_all() {
|
||||||
|
file.sections
|
||||||
|
.iter()
|
||||||
|
.filter(|s| !s.is_run_all())
|
||||||
|
.flat_map(|s| s.commands.clone())
|
||||||
|
.collect()
|
||||||
|
} else {
|
||||||
|
section.commands.clone()
|
||||||
|
};
|
||||||
|
if !commands.is_empty() {
|
||||||
|
app.pending_command = Some(commands);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
|
|
|
||||||
22
src/main.rs
22
src/main.rs
|
|
@ -7,6 +7,7 @@ mod ui;
|
||||||
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
use std::process::Command;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
|
@ -40,7 +41,11 @@ fn main() -> io::Result<()> {
|
||||||
|
|
||||||
// Ensure data directory exists
|
// Ensure data directory exists
|
||||||
if let Err(e) = std::fs::create_dir_all(&config.data_dir) {
|
if let Err(e) = std::fs::create_dir_all(&config.data_dir) {
|
||||||
eprintln!("Nepodařilo se vytvořit datovou složku {}: {}", config.data_dir.display(), e);
|
eprintln!(
|
||||||
|
"Nepodařilo se vytvořit datovou složku {}: {}",
|
||||||
|
config.data_dir.display(),
|
||||||
|
e
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let app = App::new(config.data_dir, config.terminal, config.shell);
|
let app = App::new(config.data_dir, config.terminal, config.shell);
|
||||||
|
|
@ -51,7 +56,7 @@ fn main() -> io::Result<()> {
|
||||||
let backend = CrosstermBackend::new(stdout);
|
let backend = CrosstermBackend::new(stdout);
|
||||||
let mut terminal = Terminal::new(backend)?;
|
let mut terminal = Terminal::new(backend)?;
|
||||||
|
|
||||||
let res = run_app(&mut terminal, app);
|
let app = run_app(&mut terminal, app)?;
|
||||||
|
|
||||||
disable_raw_mode()?;
|
disable_raw_mode()?;
|
||||||
execute!(
|
execute!(
|
||||||
|
|
@ -61,14 +66,14 @@ fn main() -> io::Result<()> {
|
||||||
)?;
|
)?;
|
||||||
terminal.show_cursor()?;
|
terminal.show_cursor()?;
|
||||||
|
|
||||||
if let Err(err) = res {
|
if let Some(commands) = app.pending_command {
|
||||||
eprintln!("{}", err);
|
run_in_current_terminal(&commands, &app.shell);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_app<B: Backend>(terminal: &mut Terminal<B>, mut app: App) -> io::Result<()>
|
fn run_app<B: Backend>(terminal: &mut Terminal<B>, mut app: App) -> io::Result<App>
|
||||||
where
|
where
|
||||||
io::Error: From<<B as Backend>::Error>,
|
io::Error: From<<B as Backend>::Error>,
|
||||||
{
|
{
|
||||||
|
|
@ -80,7 +85,12 @@ where
|
||||||
if let Some(event) = poll_event(tick_rate)?
|
if let Some(event) = poll_event(tick_rate)?
|
||||||
&& !handle_event(&mut app, event)
|
&& !handle_event(&mut app, event)
|
||||||
{
|
{
|
||||||
return Ok(());
|
return Ok(app);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn run_in_current_terminal(commands: &[String], shell: &str) {
|
||||||
|
let script = commands.join("\n");
|
||||||
|
let _ = Command::new(shell).arg("-c").arg(script).status();
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue