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.
To pass a config file directly to zellij run it either with:
`cargo run -- config [FILE]` or `zellij config [FILE]`.
* To ignore the default config file location:
`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:
```
@ -77,6 +80,13 @@ keybinds:
```
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?
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:
unbind: true
normal:
- action: [GoToTab: 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 {
#[serde(flatten)]
keybinds: HashMap<InputMode, Vec<KeyActionUnbind>>,
#[serde(default)]
unbind: Unbind,
}
@ -50,7 +51,7 @@ struct UnbindFromYaml {
#[serde(untagged)]
enum Unbind {
All(bool),
// TODO: use the enum
// TODO@a-kenji: use the enum
//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.
#[cfg(test)]
#[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));
}
//#[test]
//fn from_keybinds_from_yaml_to_keybinds(){
//let mut keybinds_from_yaml = KeybindsFromYaml(HashMap<InputMode, Vec<KeyActionFromYaml>>);
//let actions = vec![Action::NoOp, Action::GoToTab(1), ];
//let keyaction = KeyActionFromYaml {
//action : actions.clone(),
//key : vec![ Key::F(1), Key::Backspace , Key::Char('t'), ],
//};
//}
#[test]
fn toplevel_unbind_unbinds_all() {
let from_yaml = KeybindsFromYaml {
unbind: Unbind::All(true),
keybinds: HashMap::new(),
};
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());
}