From eb8686f4c34852bb0a70e2f73fa561a7846246e7 Mon Sep 17 00:00:00 2001 From: vasilito Date: Sun, 5 Jul 2026 08:14:45 +0300 Subject: [PATCH] tlc: add Edit extension/menu/highlighting file commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wire three Command menu items that open TLC's config files in the built-in editor: extensions, user menu, and file highlighting rules. Files are created empty if they don't exist. Cmd::EditExtensionFile → ~/.config/tlc/extensions Cmd::EditMenuFile → ~/.config/tlc/menu Cmd::EditHighlightFile → ~/.config/tlc/filehighlight.ini Added open_config_file() helper in dialog_ops.rs that resolves the config dir via ProjectDirs, creates parent + empty file if missing, then opens the editor. Command menu now has all 20 items (was 17/20). --- local/recipes/tui/tlc/PLAN.md | 6 ++--- .../tlc/source/src/filemanager/dialog_ops.rs | 26 +++++++++++++++++++ .../tlc/source/src/filemanager/dispatch.rs | 12 +++++++++ .../tui/tlc/source/src/filemanager/menubar.rs | 4 +++ .../recipes/tui/tlc/source/src/keymap/mod.rs | 9 +++++++ 5 files changed, 54 insertions(+), 3 deletions(-) diff --git a/local/recipes/tui/tlc/PLAN.md b/local/recipes/tui/tlc/PLAN.md index e9258f212a..c9de66f9db 100644 --- a/local/recipes/tui/tlc/PLAN.md +++ b/local/recipes/tui/tlc/PLAN.md @@ -790,9 +790,9 @@ MC's F9 bar has 5 entries: **Left** · **File** · **Command** · **Options** · | 15 | Screen list | Alt-` | ✅ Done | — | `Cmd::ScreenList` dialog (15g) | | 16 | Undelete files | (none) | ❌ N/A | SKIP | | 17 | Listing format edit | (none) | ❌ Missing | SKIP | -| 18 | Edit extension file | (menu) | ❌ Missing | LOW | -| 19 | Edit menu file | (menu) | ❌ Missing | LOW | -| 20 | Edit highlighting file | (menu) | ❌ Missing | LOW | +| 18 | Edit extension file | (menu) | ✅ Done | — | Opens `~/.config/tlc/extensions` in editor | +| 19 | Edit menu file | (menu) | ✅ Done | — | Opens `~/.config/tlc/menu` in editor | +| 20 | Edit highlighting file | (menu) | ✅ Done | — | Opens `~/.config/tlc/filehighlight.ini` in editor | #### Options Menu (10 items) diff --git a/local/recipes/tui/tlc/source/src/filemanager/dialog_ops.rs b/local/recipes/tui/tlc/source/src/filemanager/dialog_ops.rs index 49d8ae8ec5..ee7f278d1e 100644 --- a/local/recipes/tui/tlc/source/src/filemanager/dialog_ops.rs +++ b/local/recipes/tui/tlc/source/src/filemanager/dialog_ops.rs @@ -268,6 +268,32 @@ impl FileManager { self.status.set_message(format!("Editing {}:{}", path.display(), line)); } + /// Open `~/.config/tlc/` in the editor, creating it + /// empty if it does not exist. Used by the Command menu's + /// "Edit extension file", "Edit menu file", and "Edit + /// highlighting file" entries. + pub fn open_config_file(&mut self, name: &str) { + let path = match directories::ProjectDirs::from("org", "redbearos", "tlc") { + Some(d) => d.config_dir().join(name), + None => { + self.status + .set_message("Cannot determine config directory".to_string()); + return; + } + }; + if !path.exists() { + if let Some(parent) = path.parent() { + let _ = std::fs::create_dir_all(parent); + } + let _ = std::fs::write(&path, ""); + } + let mut ed = crate::editor::Editor::open(&path); + let _ = ed.restore_cursor_position(); + self.editor = Some(ed); + self.status + .set_message(format!("Editing {}", path.display())); + } + /// Open the F3 viewer at a specific 1-based line number. pub fn open_viewer_at_line(&mut self, path: &Path, line: u64) { match crate::viewer::Viewer::open(path) { diff --git a/local/recipes/tui/tlc/source/src/filemanager/dispatch.rs b/local/recipes/tui/tlc/source/src/filemanager/dispatch.rs index 128a50b4d6..30d9d817e2 100644 --- a/local/recipes/tui/tlc/source/src/filemanager/dispatch.rs +++ b/local/recipes/tui/tlc/source/src/filemanager/dispatch.rs @@ -516,6 +516,18 @@ impl FileManager { ))); Ok(true) } + Cmd::EditExtensionFile => { + self.open_config_file("extensions"); + Ok(true) + } + Cmd::EditMenuFile => { + self.open_config_file("menu"); + Ok(true) + } + Cmd::EditHighlightFile => { + self.open_config_file("filehighlight.ini"); + Ok(true) + } } } diff --git a/local/recipes/tui/tlc/source/src/filemanager/menubar.rs b/local/recipes/tui/tlc/source/src/filemanager/menubar.rs index dac2b55e74..4b87a33ae6 100644 --- a/local/recipes/tui/tlc/source/src/filemanager/menubar.rs +++ b/local/recipes/tui/tlc/source/src/filemanager/menubar.rs @@ -117,6 +117,10 @@ fn build_menus() -> Vec { MenuItem::item("Active VFS list", Cmd::VfsList), MenuItem::item("Background jobs", Cmd::Jobs), MenuItem::separator(), + MenuItem::item("Edit extension file", Cmd::EditExtensionFile), + MenuItem::item("Edit menu file", Cmd::EditMenuFile), + MenuItem::item("Edit highlighting file", Cmd::EditHighlightFile), + MenuItem::separator(), MenuItem::item("Toggle panels", Cmd::TogglePanels), ]), Menu::new("Options", vec![ diff --git a/local/recipes/tui/tlc/source/src/keymap/mod.rs b/local/recipes/tui/tlc/source/src/keymap/mod.rs index c92a391d74..81e16a6636 100644 --- a/local/recipes/tui/tlc/source/src/keymap/mod.rs +++ b/local/recipes/tui/tlc/source/src/keymap/mod.rs @@ -183,6 +183,12 @@ pub enum Cmd { Encoding, /// Alt-n — open a network connection (FTP/SFTP/Shell). Connection, + /// Command menu — edit the extension mapping file. + EditExtensionFile, + /// Command menu — edit the user menu file. + EditMenuFile, + /// Command menu — edit the file highlighting rules. + EditHighlightFile, } impl Cmd { @@ -265,6 +271,9 @@ impl Cmd { Cmd::PanelFilter => "Panel filter", Cmd::Encoding => "Display encoding", Cmd::Connection => "Network connection", + Cmd::EditExtensionFile => "Edit extension file", + Cmd::EditMenuFile => "Edit menu file", + Cmd::EditHighlightFile => "Edit highlighting file", } } }