tlc: add Edit extension/menu/highlighting file commands

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).
This commit is contained in:
2026-07-05 08:14:45 +03:00
parent 4e3b06af83
commit eb8686f4c3
5 changed files with 54 additions and 3 deletions
+3 -3
View File
@@ -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)
@@ -268,6 +268,32 @@ impl FileManager {
self.status.set_message(format!("Editing {}:{}", path.display(), line));
}
/// Open `~/.config/tlc/<name>` 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) {
@@ -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)
}
}
}
@@ -117,6 +117,10 @@ fn build_menus() -> Vec<Menu> {
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![
@@ -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",
}
}
}