Add Unbind for Keybindings (#241)

* will unbind all default keybindings for now

* add test for toplevel unbind

* add example/default.yaml

* add example/README.md
This commit is contained in:
a-kenji 2021-04-17 09:53:13 +02:00
parent 60ad749473
commit e5fc158503
6 changed files with 258 additions and 13 deletions

View file

@ -45,8 +45,11 @@ An example file can be found under `example/config.yaml`.
Zellij will look for a file `/zellij/config.yaml` in the default configuration location of your os. Zellij will look for a file `/zellij/config.yaml` in the default configuration location of your os.
To pass a config file directly to zellij run it either with: * To ignore the default config file location:
`cargo run -- config [FILE]` or `zellij config [FILE]`. `zellij config --clean` or `cargo make run -- config --clean`
* To pass a config file directly to zellij run it either with:
`zellij config [FILE]` or `cargo make run -- config [FILE]` .
The structure is as follows: The structure is as follows:
``` ```
@ -77,6 +80,13 @@ keybinds:
``` ```
Will create a new tab on pressing either the `c` or the `d` key. Will create a new tab on pressing either the `c` or the `d` key.
* It is possible to unbind the default Keybindings:
```
keybinds:
unbind: true
```
# What is the current status of the project? # What is the current status of the project?
Zellij is in the last stages of being VT compatible. As much as modern terminals are. Zellij is in the last stages of being VT compatible. As much as modern terminals are.

5
example/README.md Normal file
View file

@ -0,0 +1,5 @@
# Special considerations when using the configuration:
While trying to bind the newline character in the Config, use double quotes:
`Ctrl: "\n"` instead of `Ctrl: '\n'`

View file

@ -1,6 +1,5 @@
--- ---
keybinds: keybinds:
unbind: true
normal: normal:
- action: [GoToTab: 1,] - action: [GoToTab: 1,]
key: [F: 1,] key: [F: 1,]

211
example/default.yaml Normal file
View file

@ -0,0 +1,211 @@
---
keybinds:
unbind: true
normal:
- action: [SwitchToMode: Locked,]
key: [Ctrl: 'g',]
- action: [SwitchToMode: Pane,]
key: [Ctrl: 'p',]
- action: [SwitchToMode: Resize,]
key: [Ctrl: 'r',]
- action: [SwitchToMode: Tab,]
key: [Ctrl: 't',]
- action: [SwitchToMode: Scroll,]
key: [Ctrl: 's',]
- action: [Quit,]
key: [Ctrl: 'q',]
- action: [NewPane: ]
key: [ Alt: 'n',]
- action: [MoveFocus: Left,]
key: [ Alt: 'h',]
- action: [MoveFocus: Right,]
key: [ Alt: 'l',]
- action: [MoveFocus: Down,]
key: [ Alt: 'j',]
- action: [MoveFocus: Up,]
key: [ Alt: 'k',]
- action: [FocusPreviousPane,]
key: [ Alt: '[',]
- action: [FocusNextPane,]
key: [ Alt: ']',]
locked:
- action: [SwitchToMode: Normal,]
key: [Ctrl: 'g',]
resize:
- action: [SwitchToMode: Locked,]
key: [Ctrl: 'g']
- action: [SwitchToMode: Pane,]
key: [Ctrl: 'p', ]
- action: [SwitchToMode: Tab,]
key: [Ctrl: 't', ]
- action: [SwitchToMode: Normal,]
key: [Ctrl: 'r', Char: "\n", Char: ' ',]
- action: [SwitchToMode: Scroll,]
key: [Ctrl: 's']
- action: [Quit]
key: [Ctrl: 'q']
- action: [Resize: Left,]
key: [Char: 'h', Left, ]
- action: [Resize: Down,]
key: [Char: 'h', Down, ]
- action: [Resize: Up,]
key: [Char: 'h', Up, ]
- action: [Resize: Right,]
key: [Char: 'h', Right, ]
- action: [NewPane: ,]
key: [ Alt: 'n',]
- action: [MoveFocus: Left,]
key: [ Alt: 'h', Left,]
- action: [MoveFocus: Right,]
key: [ Alt: 'l', Right,]
- action: [MoveFocus: Down,]
key: [ Alt: 'j', Down,]
- action: [MoveFocus: Up,]
key: [ Alt: 'k', Up,]
- action: [FocusPreviousPane,]
key: [ Alt: '[',]
- action: [FocusNextPane,]
key: [ Alt: ']',]
pane:
- action: [SwitchToMode: Locked,]
key: [Ctrl: 'g']
- action: [SwitchToMode: Pane,]
key: [Ctrl: 'p', ]
- action: [SwitchToMode: Tab,]
key: [Ctrl: 't', ]
- action: [SwitchToMode: Normal,]
key: [Ctrl: 'r', Char: "\n", Char: ' ',]
- action: [SwitchToMode: Scroll,]
key: [Ctrl: 's']
- action: [Quit,]
key: [Ctrl: 'q',]
- action: [MoveFocus: Left,]
key: [ Alt: 'h', Left,]
- action: [MoveFocus: Right,]
key: [ Alt: 'l', Right,]
- action: [MoveFocus: Down,]
key: [ Alt: 'j', Down,]
- action: [MoveFocus: Up,]
key: [ Alt: 'k', Up,]
- action: [SwitchFocus,]
key: [Char: 'p']
- action: [NewPane: ,]
key: [Char: 'n', Alt: 'n',]
- action: [NewPane: Down,]
key: [Char: 'd', ]
- action: [NewPane: Right,]
key: [Char: 'r', ]
- action: [CloseFocus,]
key: [Char: 'x', ]
- action: [ToggleFocusFullscreen,]
key: [Char: 'f', ]
- action: [FocusPreviousPane,]
key: [ Alt: '[',]
- action: [FocusNextPane,]
key: [ Alt: ']',]
tab:
- action: [SwitchToMode: Locked,]
key: [Ctrl: 'g']
- action: [SwitchToMode: Pane,]
key: [Ctrl: 'p', ]
- action: [SwitchToMode: Normal,]
key: [Ctrl: 'r', Ctrl: 't', Char: "\n", Char: ' ',]
- action: [SwitchToMode: Scroll,]
key: [Ctrl: 's']
- action: [SwitchToMode: RenameTab, TabNameInput: [0],]
key: [Char: 'r']
- action: [Quit,]
key: [Ctrl: 'q',]
- action: [FocusPreviousPane,]
key: [ Alt: '[',]
- action: [FocusNextPane,]
key: [ Alt: ']',]
- action: [GoToPreviousTab,]
key: [ Char: 'h',]
- action: [GoToNextTab,]
key: [ Char: 'l', ]
- action: [GoToNextTab,]
key: [ Char: 'j', ]
- action: [GoToPreviousTab,]
key: [ Char: 'k', ]
- action: [NewTab,]
key: [ Char: 'n', ]
- action: [CloseTab,]
key: [ Char: 'x', ]
- action: [MoveFocus: Left,]
key: [ Alt: 'h',]
- action: [MoveFocus: Right,]
key: [ Alt: 'l', ]
- action: [MoveFocus: Down,]
key: [ Alt: 'j', ]
- action: [MoveFocus: Up,]
key: [ Alt: 'k', ]
- action: [GoToTab: 1,]
key: [ Char: '1', ]
- action: [GoToTab: 2,]
key: [ Char: '2', ]
- action: [GoToTab: 3,]
key: [ Char: '3', ]
- action: [GoToTab: 4,]
key: [ Char: '4', ]
- action: [GoToTab: 5,]
key: [ Char: '5', ]
- action: [GoToTab: 6,]
key: [ Char: '6', ]
- action: [GoToTab: 7,]
key: [ Char: '7', ]
- action: [GoToTab: 8,]
key: [ Char: '8', ]
- action: [GoToTab: 9,]
key: [ Char: '9', ]
scroll:
- action: [SwitchToMode: Normal,]
key: [Ctrl: 'r', Ctrl: 's', Char: ' ',
Char: "\n",]
- action: [SwitchToMode: Tab,]
key: [Ctrl: 't', ]
- action: [SwitchToMode: Locked,]
key: [Ctrl: 'g', ]
- action: [SwitchToMode: Pane,]
key: [Ctrl: 'p', ]
- action: [Quit,]
key: [Ctrl: 'q',]
- action: [ScrollDown,]
key: [Char: 'j', Down,]
- action: [ScrollUp,]
key: [Char: 'k', Up,]
- action: [NewPane: ,]
key: [ Alt: 'n',]
- action: [MoveFocus: Left,]
key: [ Alt: 'h',]
- action: [MoveFocus: Right,]
key: [ Alt: 'l',]
- action: [MoveFocus: Down,]
key: [ Alt: 'j',]
- action: [MoveFocus: Up,]
key: [ Alt: 'k',]
- action: [FocusPreviousPane,]
key: [ Alt: '[',]
- action: [FocusNextPane,]
key: [ Alt: ']',]
renametab:
- action: [SwitchToMode: Normal,]
key: [Ctrl: 'r', Ctrl: 's', Char: ' ', Char: 'g',]
- action: [SwitchToMode: Tab,]
key: [Char: "\n",]
- action: [TabNameInput: [27] , SwitchToMode: Tab,]
key: [Esc,]
- action: [NewPane: ,]
key: [ Alt: 'n',]
- action: [MoveFocus: Left,]
key: [ Alt: 'h',]
- action: [MoveFocus: Right,]
key: [ Alt: 'l',]
- action: [MoveFocus: Down,]
key: [ Alt: 'j',]
- action: [MoveFocus: Up,]
key: [ Alt: 'k',]
- action: [FocusPreviousPane,]
key: [ Alt: '[',]
- action: [FocusNextPane,]
key: [ Alt: ']',]

View file

@ -19,6 +19,7 @@ pub struct ModeKeybinds(HashMap<Key, Vec<Action>>);
pub struct KeybindsFromYaml { pub struct KeybindsFromYaml {
#[serde(flatten)] #[serde(flatten)]
keybinds: HashMap<InputMode, Vec<KeyActionUnbind>>, keybinds: HashMap<InputMode, Vec<KeyActionUnbind>>,
#[serde(default)]
unbind: Unbind, unbind: Unbind,
} }
@ -50,7 +51,7 @@ struct UnbindFromYaml {
#[serde(untagged)] #[serde(untagged)]
enum Unbind { enum Unbind {
All(bool), All(bool),
// TODO: use the enum // TODO@a-kenji: use the enum
//Keys(Vec<Key>), //Keys(Vec<Key>),
} }
@ -456,6 +457,12 @@ impl From<KeyActionUnbind> for ModeKeybinds {
} }
} }
impl Default for Unbind {
fn default() -> Unbind {
Unbind::All(false)
}
}
// The unit test location. // The unit test location.
#[cfg(test)] #[cfg(test)]
#[path = "./unit/keybinds_test.rs"] #[path = "./unit/keybinds_test.rs"]

View file

@ -124,12 +124,25 @@ fn from_keyaction_from_yaml_to_mode_keybindings() {
assert_eq!(expected, ModeKeybinds::from(keyaction)); assert_eq!(expected, ModeKeybinds::from(keyaction));
} }
//#[test] #[test]
//fn from_keybinds_from_yaml_to_keybinds(){ fn toplevel_unbind_unbinds_all() {
//let mut keybinds_from_yaml = KeybindsFromYaml(HashMap<InputMode, Vec<KeyActionFromYaml>>); let from_yaml = KeybindsFromYaml {
//let actions = vec![Action::NoOp, Action::GoToTab(1), ]; unbind: Unbind::All(true),
//let keyaction = KeyActionFromYaml { keybinds: HashMap::new(),
//action : actions.clone(), };
//key : vec![ Key::F(1), Key::Backspace , Key::Char('t'), ],
//}; let keybinds_from_yaml = Keybinds::get_default_keybinds_with_config(Some(from_yaml));
//}
assert_eq!(keybinds_from_yaml, Keybinds::new());
}
fn no_unbind_unbinds_none() {
let from_yaml = KeybindsFromYaml {
unbind: Unbind::All(false),
keybinds: HashMap::new(),
};
let keybinds_from_yaml = Keybinds::get_default_keybinds_with_config(Some(from_yaml));
assert_eq!(keybinds_from_yaml, Keybinds::new());
}