use super::{App, FormatMode};
use std::path::PathBuf;
impl App {
pub fn handle_vim_input(&mut self, c: char) -> bool {
self.vim_buffer.push(c);
if self.explorer_open && self.explorer_has_focus {
if self.vim_buffer == "go" {
self.explorer_preview_entry();
self.vim_buffer.clear();
return true;
}
}
if self.vim_buffer == "gg" {
if self.showing_help {
self.scroll_to_top();
} else if self.format_mode == FormatMode::Edit {
self.scroll_to_top();
self.content_cursor_line = 0;
self.content_cursor_col = 0;
} else if !self.relf_entries.is_empty() {
self.selected_entry_index = 0;
} else {
self.scroll_to_top();
self.content_cursor_line = 0;
self.content_cursor_col = 0;
}
self.vim_buffer.clear();
return true;
} else if self.vim_buffer == "g-" {
if !self.showing_help && self.format_mode == FormatMode::Edit {
self.undo();
}
self.vim_buffer.clear();
return true;
} else if self.vim_buffer == "g+" {
if !self.showing_help && self.format_mode == FormatMode::Edit {
self.redo();
}
self.vim_buffer.clear();
return true;
} else if self.vim_buffer.len() >= 2 {
self.vim_buffer.clear();
}
false
}
pub fn execute_command(&mut self) -> bool {
let cmd = self.command_buffer.clone();
let cmd = cmd.trim();
if self.explorer_open && self.explorer_has_focus {
if cmd == "a" {
self.explorer_create_file();
return false;
} else if cmd == "d" {
self.explorer_create_dir();
return false;
} else if cmd == "m" {
self.explorer_rename_file();
return false;
} else if cmd == "dd" {
self.explorer_delete_file();
return false;
} else if cmd == "yy" {
self.explorer_copy_file();
return false;
}
}
if cmd == "w" {
self.save_file();
} else if cmd == "wq" {
self.save_file();
return true; } else if cmd == "q" {
if self.explorer_open && self.explorer_has_focus {
self.explorer_open = false;
self.explorer_has_focus = false;
return false; } else {
return true; }
} else if cmd.starts_with("w ") {
let filename = cmd.strip_prefix("w ").unwrap().trim().to_string();
if !filename.ends_with(".json") {
self.set_status("Error: Filename must end with .json");
} else {
self.save_file_as(&filename);
}
} else if cmd.starts_with("wq ") {
let filename = cmd.strip_prefix("wq ").unwrap().trim().to_string();
if !filename.ends_with(".json") {
self.set_status("Error: Filename must end with .json");
return false; } else {
self.save_file_as(&filename);
return true; }
} else if cmd == "e" {
self.reload_file();
} else if cmd.starts_with("e ") {
let filename = cmd.strip_prefix("e ").unwrap().trim().to_string();
if !filename.ends_with(".json") {
self.set_status("Error: Filename must end with .json");
} else {
let path = PathBuf::from(filename);
self.load_file(path);
}
} else if cmd == "enew" {
self.json_input = String::new();
self.file_path = None;
self.file_path_changed = false;
self.is_modified = false;
self.content_cursor_line = 0;
self.content_cursor_col = 0;
self.scroll = 0;
self.convert_json();
self.set_status("New empty buffer");
} else if cmd == "ar" {
self.auto_reload = !self.auto_reload;
let status = if self.auto_reload {
"Auto-reload enabled"
} else {
"Auto-reload disabled"
};
self.set_status(status);
} else if cmd == "ai" {
self.append_inside();
} else if cmd == "ao" {
self.append_outside();
} else if cmd == "o" {
self.order_entries();
} else if cmd == "op" {
self.order_by_percentage();
} else if cmd == "on" {
self.order_by_name();
} else if cmd == "gi" {
self.jump_to_first_inside();
} else if cmd == "go" {
self.jump_to_first_outside();
} else if cmd == "ci" {
self.copy_inside_data();
} else if cmd == "co" {
self.copy_outside_data();
} else if cmd == "cu" {
self.copy_selected_url();
} else if cmd == "cc" {
self.copy_cards_rendered();
} else if cmd == "ccj" {
self.copy_cards_json();
} else if cmd == "dc" {
self.delete_cards();
} else if cmd == "vu" {
self.paste_url_to_selected();
} else if cmd == "vi" {
self.paste_inside_overwrite();
} else if cmd == "vo" {
self.paste_outside_overwrite();
} else if cmd == "va" {
self.paste_append_all();
} else if cmd == "vai" {
self.paste_inside_append();
} else if cmd == "vao" {
self.paste_outside_append();
} else if cmd == "xi" {
self.clear_inside();
} else if cmd == "xo" {
self.clear_outside();
} else if cmd == "dd" {
if self.format_mode == FormatMode::Edit {
self.delete_current_entry();
self.is_modified = true;
} else if !self.relf_entries.is_empty() {
self.delete_selected_entry();
self.is_modified = true;
self.save_file();
}
} else if cmd == "yy" {
self.duplicate_selected_entry();
} else if cmd == "noh" {
self.clear_search_highlight();
} else if cmd == "nof" {
self.clear_filter();
} else if cmd.starts_with("f ") {
if self.format_mode == FormatMode::View {
let pattern = cmd.strip_prefix("f ").unwrap().trim().to_string();
self.apply_filter(pattern);
} else {
self.set_status("Filter only works in View mode");
}
} else if cmd == "Lexplore" || cmd == "Lex" || cmd == "lx" {
self.toggle_explorer();
} else if cmd == "h" {
self.toggle_help();
} else if cmd == "c" {
self.copy_to_clipboard();
} else if cmd == "v" {
self.paste_from_clipboard();
} else if cmd == "x" {
self.clear_content();
} else if cmd.starts_with("s/") || cmd.starts_with("%s/") {
self.execute_substitute(cmd);
} else if cmd == "set number" || cmd == "set nu" {
self.show_line_numbers = true;
self.set_status("Line numbers enabled");
} else if cmd == "set nonumber" || cmd == "set nonu" {
self.show_line_numbers = false;
self.set_status("Line numbers disabled");
} else if cmd.starts_with("set card=") {
if let Some(value_str) = cmd.strip_prefix("set card=") {
if let Ok(value) = value_str.trim().parse::<usize>() {
if value >= 1 && value <= 10 {
self.max_visible_cards = value;
self.set_status(&format!("Max visible cards set to {}", value));
} else {
self.set_status("Card value must be between 1 and 10");
}
} else {
self.set_status("Invalid card value");
}
}
} else if cmd.starts_with("colorscheme ") {
use super::ColorScheme;
let scheme_name = cmd.strip_prefix("colorscheme ").unwrap().trim();
if let Some(scheme) = ColorScheme::by_name(scheme_name) {
self.colorscheme = scheme;
self.set_status(&format!("Color scheme changed to {}", scheme_name));
} else {
self.set_status(&format!("Unknown color scheme: {}", scheme_name));
}
} else {
self.set_status(&format!("Unknown command: {}", cmd));
}
false }
}