diff --git a/Cargo.toml b/Cargo.toml index cb5325ce9..fc95d5e74 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -51,7 +51,7 @@ xdg = "^2" [dependencies.nix] version = "^0" -default_features = false +default-features = false features = ["user"] [dependencies.ratatui] diff --git a/src/commands/bulk_rename.rs b/src/commands/bulk_rename.rs index 816ff5eeb..80f09ba4d 100644 --- a/src/commands/bulk_rename.rs +++ b/src/commands/bulk_rename.rs @@ -1,6 +1,6 @@ use std::env; use std::fs; -use std::io::{self, BufRead, Write}; +use std::io::{BufRead, Write}; use std::path; use std::process; @@ -89,7 +89,7 @@ pub fn _bulk_rename(context: &mut AppContext) -> AppResult { } if paths_renamed.len() < entries.len() { return Err(AppError::new( - AppErrorKind::Io(io::ErrorKind::InvalidInput), + AppErrorKind::Io, "Insufficient inputs".to_string(), )); } diff --git a/src/commands/file_ops.rs b/src/commands/file_ops.rs index f138528d0..91d9ee537 100644 --- a/src/commands/file_ops.rs +++ b/src/commands/file_ops.rs @@ -1,4 +1,3 @@ -use std::io; use std::process::{Command, Stdio}; use crate::context::{AppContext, LocalStateContext}; @@ -46,7 +45,7 @@ pub fn paste(context: &mut AppContext, options: FileOperationOptions) -> AppResu Ok(()) } _ => Err(AppError::new( - AppErrorKind::Io(io::ErrorKind::InvalidData), + AppErrorKind::Io, "no files selected".to_string(), )), } diff --git a/src/commands/open_file.rs b/src/commands/open_file.rs index 0a4432f8d..c9b1707c3 100644 --- a/src/commands/open_file.rs +++ b/src/commands/open_file.rs @@ -1,4 +1,3 @@ -use std::io; use std::path; use crate::commands::{quit, reload}; @@ -209,7 +208,7 @@ pub fn open_with_index( if paths.is_empty() { return Err(AppError::new( - AppErrorKind::Io(io::ErrorKind::NotFound), + AppErrorKind::Io, String::from("No files selected"), )); } @@ -218,7 +217,7 @@ pub fn open_with_index( if index >= options.len() { return Err(AppError::new( - AppErrorKind::Io(std::io::ErrorKind::InvalidData), + AppErrorKind::Io, "option does not exist".to_string(), )); } diff --git a/src/commands/quit.rs b/src/commands/quit.rs index 12a0d2aee..7c1eb6ed1 100644 --- a/src/commands/quit.rs +++ b/src/commands/quit.rs @@ -1,5 +1,3 @@ -use std::io; - use crate::context::AppContext; use crate::error::{AppError, AppErrorKind, AppResult}; @@ -33,7 +31,7 @@ pub fn quit_with_action(context: &mut AppContext, quit_action: QuitAction) -> Ap let worker_context = context.worker_context_ref(); if worker_context.is_busy() || !worker_context.is_empty() { Err(AppError::new( - AppErrorKind::Io(io::ErrorKind::Other), + AppErrorKind::Io, String::from("operations running in background, use `quit --force` to quit"), )) } else { diff --git a/src/commands/search_fzf.rs b/src/commands/search_fzf.rs index 72c325695..50cb436fc 100644 --- a/src/commands/search_fzf.rs +++ b/src/commands/search_fzf.rs @@ -1,5 +1,3 @@ -use std::io; - use crate::commands::{cursor_move, fzf}; use crate::context::AppContext; use crate::error::{AppError, AppErrorKind, AppResult}; @@ -22,7 +20,7 @@ pub fn search_fzf(context: &mut AppContext, backend: &mut AppBackend) -> AppResu if items.is_empty() { return Err(AppError::new( - AppErrorKind::Io(io::ErrorKind::InvalidData), + AppErrorKind::Io, "no files to select".to_string(), )); } diff --git a/src/commands/select_fzf.rs b/src/commands/select_fzf.rs index 5271da4ef..996d19701 100644 --- a/src/commands/select_fzf.rs +++ b/src/commands/select_fzf.rs @@ -1,5 +1,3 @@ -use std::io; - use crate::context::AppContext; use crate::error::{AppError, AppErrorKind, AppResult}; use crate::ui::AppBackend; @@ -28,7 +26,7 @@ pub fn select_fzf( if items.is_empty() { return Err(AppError::new( - AppErrorKind::Io(io::ErrorKind::InvalidData), + AppErrorKind::Io, "no files to select".to_string(), )); } diff --git a/src/ui/views/tui_textfield.rs b/src/ui/views/tui_textfield.rs index f28bd13a3..7b1270f35 100644 --- a/src/ui/views/tui_textfield.rs +++ b/src/ui/views/tui_textfield.rs @@ -227,14 +227,24 @@ impl<'a> TuiTextField<'a> { AppEvent::Termion(Event::Key(key)) => { let dirty = match key { Key::Backspace => { - let res = line_buffer.backspace(1, listener); + if line_buffer.is_empty() { + let _ = terminal.hide_cursor(); + return None; + } + let res = line_buffer.backspace(1, listener); if let Ok(command) = Command::from_str(line_buffer.as_str()) { command.interactive_execute(context) } res } - Key::Delete => line_buffer.delete(1, listener).is_some(), + Key::Delete => { + if line_buffer.is_empty() { + let _ = terminal.hide_cursor(); + return None; + } + line_buffer.delete(1, listener).is_some() + } Key::Home => line_buffer.move_home(), Key::End => line_buffer.move_end(), Key::Up => { diff --git a/src/util/mimetype.rs b/src/util/mimetype.rs index ffd7e488a..30274be48 100644 --- a/src/util/mimetype.rs +++ b/src/util/mimetype.rs @@ -1,5 +1,5 @@ use std::path::Path; -use std::{io, process::Command}; +use std::process::Command; use crate::error::{AppError, AppErrorKind, AppResult}; @@ -36,7 +36,7 @@ pub fn get_mimetype(p: &Path) -> AppResult { if !output.status.success() { let stderr_msg = String::from_utf8_lossy(&output.stderr).to_string(); - let error = AppError::new(AppErrorKind::Io(io::ErrorKind::InvalidInput), stderr_msg); + let error = AppError::new(AppErrorKind::Io, stderr_msg); return Err(error); } @@ -44,10 +44,7 @@ pub fn get_mimetype(p: &Path) -> AppResult { match stdout_msg.trim().split_once('/') { Some((ttype, subtype)) => Ok(Mimetype::new(ttype.to_string(), subtype.to_string())), None => { - let error = AppError::new( - AppErrorKind::Io(io::ErrorKind::InvalidInput), - "Unknown mimetype".to_string(), - ); + let error = AppError::new(AppErrorKind::Io, "Unknown mimetype".to_string()); Err(error) } }