summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2018-12-23 21:37:27 -0500
committerJiayi Zhao <jeff.no.zhao@gmail.com>2018-12-23 21:37:27 -0500
commit2fd5508cf2e4fd2addcc13f2d77eafb571004271 (patch)
tree1b8f293a73cdc93425acbc92ba2ab869f4659c1f
parent04b7cf5ba6aec5d491de98178522040c6a73bc03 (diff)
add support for multiple keybindings mapping to same command
-rw-r--r--config/keymap.toml65
-rw-r--r--src/joshuto/keymap.rs28
-rw-r--r--src/joshuto/keymapll.rs42
3 files changed, 98 insertions, 37 deletions
diff --git a/config/keymap.toml b/config/keymap.toml
index f62108a..bb17e79 100644
--- a/config/keymap.toml
+++ b/config/keymap.toml
@@ -1,19 +1,54 @@
[keymaps]
-Quit = [ "q" ]
+Quit = [ ["q"] ]
-MoveUp = [ "UP" ]
-MoveDown = [ "DOWN" ]
-MoveHome = [ "HOME" ]
-MoveEnd = [ "END" ]
-Open = [ "RIGHT" ]
-ParentDirectory = [ "LEFT" ]
-MovePageUp = [ "PPAGE" ]
-MovePageDown = [ "NPAGE" ]
+MoveUp = [
+ ["UP"],
+ ["j"]
+]
+MoveDown = [
+ ["DOWN"],
+ ["h"]
+]
+ParentDirectory = [
+ ["LEFT"],
+ ["h"]
+]
+Open = [
+ ["RIGHT"],
+ ["ENTER"]
+]
-DeleteFile = [ "d", "D" ]
-CutFile = [ "d", "d" ]
-RenameFile = [ "a" ]
-CopyFile = [ "y", "y" ]
+MoveHome = [
+ ["HOME"]
+]
+MoveEnd = [
+ ["END"]
+]
+MovePageUp = [
+ ["PPAGE"]
+]
+MovePageDown = [
+ ["NPAGE"]
+]
-OpenWith = [ "r" ]
-ToggleHiddenFiles = [ "z", "h" ]
+DeleteFile = [
+ ["d", "D"],
+ [ "DELETE" ]
+]
+CutFile = [
+ [ "d", "d" ]
+]
+RenameFile = [
+ [ "a" ]
+]
+CopyFile = [
+ ["y", "y"]
+]
+
+OpenWith = [
+ [ "r" ]
+]
+ToggleHiddenFiles = [
+ [ "z", "h" ],
+ ["H"]
+]
diff --git a/src/joshuto/keymap.rs b/src/joshuto/keymap.rs
index 97f8440..7c71d6b 100644
--- a/src/joshuto/keymap.rs
+++ b/src/joshuto/keymap.rs
@@ -8,7 +8,7 @@ use joshuto::keymapll::Keycode;
#[derive(Debug, Deserialize)]
pub struct JoshutoRawKeymaps {
- keymaps: Option<HashMap<String, Vec<String>>>,
+ keymaps: Option<HashMap<String, Vec<Vec<String>>>>,
}
impl JoshutoRawKeymaps {
@@ -36,24 +36,26 @@ impl JoshutoRawKeymaps {
}
}
- fn unflatten_hashmap(map: HashMap<String, Vec<String>>) -> HashMap<i32, JoshutoCommand>
+ fn unflatten_hashmap(map: HashMap<String, Vec<Vec<String>>>) -> HashMap<i32, JoshutoCommand>
{
let mut new_map: HashMap<i32, JoshutoCommand> = HashMap::new();
for (keycommand, keycomb) in &map {
match JoshutoCommand::from_str(&keycommand) {
Some(keybind) => {
- let mut keys = keycomb.iter();
- if let Some(key) = keys.next() {
- let key = match Keycode::from_str(&key) {
- Some(s) => s,
- None => {
- eprintln!("Error: Unknown keycode for: {:?}", &keycommand);
- process::exit(1);
- }
- };
- JoshutoRawKeymaps::insert_keycommand(&mut new_map, &mut keys,
- key, keybind);
+ for comb in keycomb {
+ let mut keys = comb.iter();
+ if let Some(key) = keys.next() {
+ let key = match Keycode::from_str(&key) {
+ Some(s) => s,
+ None => {
+ eprintln!("Error: Unknown keycode for: {:?}", &keycommand);
+ process::exit(1);
+ }
+ };
+ JoshutoRawKeymaps::insert_keycommand(&mut new_map, &mut keys,
+ key, keybind.clone());
+ }
}
}
None => {
diff --git a/src/joshuto/keymapll.rs b/src/joshuto/keymapll.rs
index aaaba4a..cd5f58f 100644
--- a/src/joshuto/keymapll.rs
+++ b/src/joshuto/keymapll.rs
@@ -2,6 +2,7 @@ extern crate ncurses;
use std::collections::HashMap;
+#[allow(non_camel_case_types)]
#[derive(Debug,Clone)]
pub enum Keycode {
CTRL = ncurses::BUTTON_CTRL as isize,
@@ -34,23 +35,23 @@ pub enum Keycode {
F13 = ncurses::KEY_F13 as isize,
F14 = ncurses::KEY_F14 as isize,
F15 = ncurses::KEY_F15 as isize,
- DL = ncurses::KEY_DL as isize,
- IL = ncurses::KEY_IL as isize,
- DC = ncurses::KEY_DC as isize,
- IC = ncurses::KEY_IC as isize,
+ DL = ncurses::KEY_DL as isize, /* delete-line key */
+ IL = ncurses::KEY_IL as isize, /* insert-line key */
+ DC = ncurses::KEY_DC as isize, /* delete-character key */
+ IC = ncurses::KEY_IC as isize, /* insert-character key */
EIC = ncurses::KEY_EIC as isize,
CLEAR = ncurses::KEY_CLEAR as isize,
EOS = ncurses::KEY_EOS as isize,
EOL = ncurses::KEY_EOL as isize,
SF = ncurses::KEY_SF as isize,
SR = ncurses::KEY_SR as isize,
- NPAGE = ncurses::KEY_NPAGE as isize,
- PPAGE = ncurses::KEY_PPAGE as isize,
+ NPAGE = ncurses::KEY_NPAGE as isize, /* next-page key */
+ PPAGE = ncurses::KEY_PPAGE as isize, /* previous-page key */
STAB = ncurses::KEY_STAB as isize,
CTAB = ncurses::KEY_CTAB as isize,
CATAB = ncurses::KEY_CATAB as isize,
ENTER = ncurses::KEY_ENTER as isize,
- PRINT = ncurses::KEY_PRINT as isize,
+ PRINT = ncurses::KEY_PRINT as isize, /* print key */
LL = ncurses::KEY_LL as isize,
A1 = ncurses::KEY_A1 as isize,
A3 = ncurses::KEY_A3 as isize,
@@ -284,8 +285,8 @@ impl Keycode {
"F15" => Some(Keycode::F15),
"DL" => Some(Keycode::DL),
"IL" => Some(Keycode::IL),
- "DC" => Some(Keycode::DC),
- "IC" => Some(Keycode::IC),
+ "DELETE" => Some(Keycode::DC),
+ "INSERT" => Some(Keycode::IC),
"EIC" => Some(Keycode::EIC),
"CLEAR" => Some(Keycode::CLEAR),
"EOS" => Some(Keycode::EOS),
@@ -418,6 +419,29 @@ impl JoshutoCommand {
"ToggleHiddenFiles" => Some(JoshutoCommand::ToggleHiddenFiles),
_ => None,
}
+ }
+
+ pub fn clone(&self) -> Self
+ {
+ match self {
+ JoshutoCommand::Quit => JoshutoCommand::Quit,
+ JoshutoCommand::MoveUp => JoshutoCommand::MoveUp,
+ JoshutoCommand::MoveDown => JoshutoCommand::MoveDown,
+ JoshutoCommand::MovePageUp => JoshutoCommand::MovePageUp,
+ JoshutoCommand::MovePageDown => JoshutoCommand::MovePageDown,
+ JoshutoCommand::MoveHome => JoshutoCommand::MoveHome,
+ JoshutoCommand::MoveEnd => JoshutoCommand::MoveEnd,
+ JoshutoCommand::ParentDirectory => JoshutoCommand::ParentDirectory,
+ JoshutoCommand::DeleteFile => JoshutoCommand::DeleteFile,
+ JoshutoCommand::RenameFile => JoshutoCommand::RenameFile,
+ JoshutoCommand::CutFile => JoshutoCommand::CutFile,
+ JoshutoCommand::CopyFile => JoshutoCommand::CopyFile,
+ JoshutoCommand::Open => JoshutoCommand::Open,
+ JoshutoCommand::OpenWith => JoshutoCommand::OpenWith,
+ JoshutoCommand::ToggleHiddenFiles => JoshutoCommand::ToggleHiddenFiles,
+
+ JoshutoCommand::CompositeKeybind(_) => JoshutoCommand::Quit,
+ }
}
}