diff --git a/README.md b/README.md index af7e1bc4b7..e54e0eee21 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000000..abeb847a83 --- /dev/null +++ b/example/README.md @@ -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'` diff --git a/example/config.yaml b/example/config.yaml index 644d4e4f23..3bb4fbfada 100644 --- a/example/config.yaml +++ b/example/config.yaml @@ -1,6 +1,5 @@ --- keybinds: - unbind: true normal: - action: [GoToTab: 1,] key: [F: 1,] diff --git a/example/default.yaml b/example/default.yaml new file mode 100644 index 0000000000..4950b86466 --- /dev/null +++ b/example/default.yaml @@ -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: ']',] diff --git a/src/common/input/keybinds.rs b/src/common/input/keybinds.rs index 3b57dc0258..6239475eb4 100644 --- a/src/common/input/keybinds.rs +++ b/src/common/input/keybinds.rs @@ -19,6 +19,7 @@ pub struct ModeKeybinds(HashMap>); pub struct KeybindsFromYaml { #[serde(flatten)] keybinds: HashMap>, + #[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), } @@ -456,6 +457,12 @@ impl From for ModeKeybinds { } } +impl Default for Unbind { + fn default() -> Unbind { + Unbind::All(false) + } +} + // The unit test location. #[cfg(test)] #[path = "./unit/keybinds_test.rs"] diff --git a/src/common/input/unit/keybinds_test.rs b/src/common/input/unit/keybinds_test.rs index 6411d01747..e0d78b6248 100644 --- a/src/common/input/unit/keybinds_test.rs +++ b/src/common/input/unit/keybinds_test.rs @@ -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>); -//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()); +}