diff --git a/config.tar.gz b/config.tar.gz index f95e07d..761e080 100644 Binary files a/config.tar.gz and b/config.tar.gz differ diff --git a/src/file_browser.rs b/src/file_browser.rs index 1ff263a..3550db0 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -928,6 +928,37 @@ impl FileBrowser { .log(); } + pub fn help_menu(&mut self) -> HResult<()> { + self.core.get_sender().send(Events::InputEnabled(false))?; + self.preview_widget().map(|preview| preview.cancel_animation()).log(); + self.core.screen.suspend().log(); + + let pager_result = (|| { + let pager = std::env::var("PAGER").unwrap_or("less".into()); + let mut pager_proc = std::process::Command::new(pager.as_str()) + .stdin(std::process::Stdio::piped()) + .spawn()?; + let pager_stdin = pager_proc.stdin.as_mut().unwrap(); + writeln!(pager_stdin, "hunter version {}", env!("CARGO_PKG_VERSION"))?; + writeln!(pager_stdin, "github: https://github.com/rabite0/hunter")?; + writeln!(pager_stdin, "irc: #hunter @ Freenode https://webchat.freenode.net/#hunter")?; + writeln!(pager_stdin)?; + write!(pager_stdin, "{}", self.core.config().keybinds)?; + pager_proc.wait() + })(); + + self.core.screen.activate().log(); + self.core.get_sender().send(Events::InputEnabled(true))?; + + match pager_result { + Err(err) => + self.core.show_status(&format!("Couldn't open help menu: {}", err)).log(), + Ok(_) => {} + } + + Ok(()) + } + pub fn quit_with_dir(&self) -> HResult<()> { let cwd = self.cwd()?.clone().path; let selected_file = self.selected_file()?; @@ -1631,7 +1662,8 @@ impl Acting for FileBrowser { ToggleColumns => self.toggle_colums(), ZoomPreview => self.zoom_preview(), // Tab implementation needs to call exec_cmd because ALL files are needed - ExecCmd => Err(HError::FileBrowserNeedTabFiles)? + ExecCmd => Err(HError::FileBrowserNeedTabFiles)?, + HelpMenu => self.help_menu()?, } Ok(()) } diff --git a/src/keybind.rs b/src/keybind.rs index 64a725a..e14c66f 100644 --- a/src/keybind.rs +++ b/src/keybind.rs @@ -119,6 +119,74 @@ impl Default for KeyBinds { } } +impl Display for KeyBinds { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + + writeln!(f, "[movement]")?; + display_group(f, &self.movement)?; + writeln!(f)?; + + writeln!(f, "[filebrowser]")?; + display_group(f, &self.filebrowser)?; + writeln!(f)?; + + writeln!(f, "[filelist]")?; + display_group(f, &self.filelist)?; + writeln!(f)?; + + writeln!(f, "[tab]")?; + display_group(f, &self.tab)?; + writeln!(f)?; + + writeln!(f, "[media]")?; + display_group(f, &self.media)?; + writeln!(f)?; + + writeln!(f, "[bookmark]")?; + display_group(f, &self.bookmark)?; + writeln!(f)?; + + writeln!(f, "[process]")?; + display_group(f, &self.process)?; + writeln!(f)?; + + writeln!(f, "[minibuffer]")?; + display_group(f, &self.minibuffer)?; + writeln!(f)?; + + writeln!(f, "[fold]")?; + display_group(f, &self.fold)?; + writeln!(f)?; + + writeln!(f, "[log]")?; + display_group(f, &self.log)?; + writeln!(f)?; + + writeln!(f, "[quickaction]")?; + display_group(f, &self.quickaction)?; + Ok(()) + } +} + +fn display_group(f: &mut std::fmt::Formatter<'_>, bindings: &Bindings) -> std::fmt::Result +where + A: Display + Ord +{ + let mut by_action = std::collections::BTreeMap::new(); + for (key, action) in bindings.0.iter() { + by_action.entry(action).or_insert(vec![]).push(key); + } + + for (action, keys) in by_action { + let key_str = keys + .into_iter() + .map(|k| k.to_string()) + .collect::>() + .join(", "); + writeln!(f, "{} = {}", action, key_str)?; + } + Ok(()) +} impl KeyBinds { pub fn load() -> HResult { @@ -448,7 +516,7 @@ where -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum Movement { Up(usize), Down(usize), @@ -462,7 +530,7 @@ pub enum Movement { -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum FileBrowserAction { LeftColumnDown, LeftColumnUp, @@ -482,12 +550,13 @@ pub enum FileBrowserAction { RunSubshell, ToggleColumns, ZoomPreview, - ExecCmd + ExecCmd, + HelpMenu, } -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum FileListAction { Search, SearchNext, @@ -508,7 +577,7 @@ pub enum FileListAction { -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum TabAction { NewTab, CloseTab, @@ -519,7 +588,7 @@ pub enum TabAction { -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum MediaAction { TogglePause, ToggleMute, @@ -529,7 +598,7 @@ pub enum MediaAction { -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum BookmarkAction { GotoLastCwd, Goto(char), @@ -538,7 +607,7 @@ pub enum BookmarkAction { -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum ProcessAction { Close, Remove, @@ -554,7 +623,7 @@ pub enum ProcessAction { -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum MiniBufferAction { InsertChar(char), InsertTab(usize), @@ -573,17 +642,17 @@ pub enum MiniBufferAction { CursorToEnd } -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum FoldAction { ToggleFold } -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum LogAction { Close } -#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug)] +#[derive(EnumString, EnumIter, Copy, Clone, Display, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum QuickActionAction { Close, SelectOrRun(char) @@ -688,7 +757,8 @@ impl Default for Bindings { RunSubshell => Char('z'), ToggleColumns => Char('c'), ZoomPreview => Char('C'), - ExecCmd => Char('!') + ExecCmd => Char('!'), + HelpMenu => Char('H'), }; filebrowser.insert(key, action.as_default());