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());