diff options
author | Aram Drevekenin <aram@poor.dev> | 2023-02-16 16:33:49 +0100 |
---|---|---|
committer | Aram Drevekenin <aram@poor.dev> | 2023-02-16 16:33:49 +0100 |
commit | 7dabede2abe5c391def805abc62208197d90ec48 (patch) | |
tree | f3faaa542855affc4901b12d096ad2417610f65b | |
parent | c83c2f711e82a2248164a75639d005958a0f939e (diff) | |
parent | 27d577753c783f12bfeaaf7070c46b6fff934bc6 (diff) |
Merge branch 'main' into apply-layouts-at-runtime
-rw-r--r-- | CHANGELOG.md | 10 | ||||
-rw-r--r-- | default-plugins/compact-bar/src/line.rs | 20 | ||||
-rw-r--r-- | default-plugins/status-bar/src/main.rs | 8 | ||||
-rw-r--r-- | default-plugins/tab-bar/src/line.rs | 20 | ||||
-rw-r--r-- | zellij-utils/src/input/actions.rs | 8 | ||||
-rw-r--r-- | zellij-utils/src/kdl/mod.rs | 93 |
6 files changed, 124 insertions, 35 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f30fc85d..9accb5544 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) * feat: add cli action to switch to tab by name (https://github.com/zellij-org/zellij/pull/2120) * dev: use the wasmer Singlepass compiler when compiling plugins in development (https://github.com/zellij-org/zellij/pull/2134 + https://github.com/zellij-org/zellij/pull/2146) * feat: add pencil light theme (https://github.com/zellij-org/zellij/pull/2157) +* fix: apply correct color on 'more tabs' message (https://github.com/zellij-org/zellij/pull/2166) +* feat: add args to new-tab action in keybinds (https://github.com/zellij-org/zellij/pull/2072) + + Eg: + ```kdl + tab { + bind "n" { NewTab; SwitchToMode "Normal"; } + bind "m" { NewTab { cwd "/tmp"; name "example"; layout "/tmp/example.kdl"; }; SwitchToMode "Normal"; } + } + ``` ## [0.34.4] - 2022-12-13 diff --git a/default-plugins/compact-bar/src/line.rs b/default-plugins/compact-bar/src/line.rs index 13394a092..6bcbab18a 100644 --- a/default-plugins/compact-bar/src/line.rs +++ b/default-plugins/compact-bar/src/line.rs @@ -122,13 +122,13 @@ fn left_more_message( // 238 // chars length plus separator length on both sides let more_text_len = more_text.width() + 2 * separator.width(); - let text_color = match palette.theme_hue { - ThemeHue::Dark => palette.white, - ThemeHue::Light => palette.black, + let (text_color, sep_color) = match palette.theme_hue { + ThemeHue::Dark => (palette.white, palette.black), + ThemeHue::Light => (palette.black, palette.white), }; - let left_separator = style!(text_color, palette.orange).paint(separator); + let left_separator = style!(sep_color, palette.orange).paint(separator); let more_styled_text = style!(text_color, palette.orange).bold().paint(more_text); - let right_separator = style!(palette.orange, text_color).paint(separator); + let right_separator = style!(palette.orange, sep_color).paint(separator); let more_styled_text = ANSIStrings(&[left_separator, more_styled_text, right_separator]).to_string(); LinePart { @@ -154,13 +154,13 @@ fn right_more_message( }; // chars length plus separator length on both sides let more_text_len = more_text.width() + 2 * separator.width(); - let text_color = match palette.theme_hue { - ThemeHue::Dark => palette.white, - ThemeHue::Light => palette.black, + let (text_color, sep_color) = match palette.theme_hue { + ThemeHue::Dark => (palette.white, palette.black), + ThemeHue::Light => (palette.black, palette.white), }; - let left_separator = style!(text_color, palette.orange).paint(separator); + let left_separator = style!(sep_color, palette.orange).paint(separator); let more_styled_text = style!(text_color, palette.orange).bold().paint(more_text); - let right_separator = style!(palette.orange, text_color).paint(separator); + let right_separator = style!(palette.orange, sep_color).paint(separator); let more_styled_text = ANSIStrings(&[left_separator, more_styled_text, right_separator]).to_string(); LinePart { diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index f269fdf55..3e6685596 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -359,7 +359,13 @@ pub fn action_key(keymap: &[(Key, Vec<Action>)], action: &[Action]) -> Vec<Key> keymap .iter() .filter_map(|(key, acvec)| { - if acvec.as_slice() == action { + let matching = acvec + .iter() + .zip(action) + .filter(|(a, b)| a.shallow_eq(b)) + .count(); + + if matching == acvec.len() && matching == action.len() { Some(*key) } else { None diff --git a/default-plugins/tab-bar/src/line.rs b/default-plugins/tab-bar/src/line.rs index 1022cda46..cb24873a9 100644 --- a/default-plugins/tab-bar/src/line.rs +++ b/default-plugins/tab-bar/src/line.rs @@ -123,13 +123,13 @@ fn left_more_message( // 238 // chars length plus separator length on both sides let more_text_len = more_text.width() + 2 * separator.width(); - let text_color = match palette.theme_hue { - ThemeHue::Dark => palette.white, - ThemeHue::Light => palette.black, + let (text_color, sep_color) = match palette.theme_hue { + ThemeHue::Dark => (palette.white, palette.black), + ThemeHue::Light => (palette.black, palette.white), }; - let left_separator = style!(text_color, palette.orange).paint(separator); + let left_separator = style!(sep_color, palette.orange).paint(separator); let more_styled_text = style!(text_color, palette.orange).bold().paint(more_text); - let right_separator = style!(palette.orange, text_color).paint(separator); + let right_separator = style!(palette.orange, sep_color).paint(separator); let more_styled_text = ANSIStrings(&[left_separator, more_styled_text, right_separator]).to_string(); LinePart { @@ -155,13 +155,13 @@ fn right_more_message( }; // chars length plus separator length on both sides let more_text_len = more_text.width() + 2 * separator.width(); - let text_color = match palette.theme_hue { - ThemeHue::Dark => palette.white, - ThemeHue::Light => palette.black, + let (text_color, sep_color) = match palette.theme_hue { + ThemeHue::Dark => (palette.white, palette.black), + ThemeHue::Light => (palette.black, palette.white), }; - let left_separator = style!(text_color, palette.orange).paint(separator); + let left_separator = style!(sep_color, palette.orange).paint(separator); let more_styled_text = style!(text_color, palette.orange).bold().paint(more_text); - let right_separator = style!(palette.orange, text_color).paint(separator); + let right_separator = style!(palette.orange, sep_color).paint(separator); let more_styled_text = ANSIStrings(&[left_separator, more_styled_text, right_separator]).to_string(); LinePart { diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs index b6282bf95..a4f4b74f6 100644 --- a/zellij-utils/src/input/actions.rs +++ b/zellij-utils/src/input/actions.rs @@ -219,6 +219,14 @@ pub enum Action { } impl Action { + /// Checks that two Action are match except their mutable attributes. + pub fn shallow_eq(&self, other_action: &Action) -> bool { + match (self, other_action) { + (Action::NewTab(..), Action::NewTab(..)) => true, + _ => self == other_action, + } + } + pub fn actions_from_cli( cli_action: CliAction, get_current_dir: Box<dyn Fn() -> PathBuf>, diff --git a/zellij-utils/src/kdl/mod.rs b/zellij-utils/src/kdl/mod.rs index 6c53bd202..f56843e24 100644 --- a/zellij-utils/src/kdl/mod.rs +++ b/zellij-utils/src/kdl/mod.rs @@ -303,10 +303,10 @@ macro_rules! keys_from_kdl { #[macro_export] macro_rules! actions_from_kdl { - ( $kdl_node:expr ) => { + ( $kdl_node:expr, $config_options:expr ) => { kdl_children_nodes_or_error!($kdl_node, "no actions found for key_block") .iter() - .map(|kdl_action| Action::try_from(kdl_action)) + .map(|kdl_action| Action::try_from((kdl_action, $config_options))) .collect::<Result<_, _>>()? }; } @@ -617,9 +617,9 @@ impl TryFrom<(&str, &KdlDocument)> for PaletteColor { } } -impl TryFrom<&KdlNode> for Action { +impl TryFrom<(&KdlNode, &Options)> for Action { type Error = ConfigError; - fn try_from(kdl_action: &KdlNode) -> Result<Self, Self::Error> { + fn try_from((kdl_action, config_options): (&KdlNode, &Options)) -> Result<Self, Self::Error> { let action_name = kdl_name!(kdl_action); let action_arguments: Vec<&KdlEntry> = kdl_argument_values!(kdl_action); let action_children: Vec<&KdlDocument> = kdl_children!(kdl_action); @@ -750,7 +750,64 @@ impl TryFrom<&KdlNode> for Action { "PaneNameInput" => { parse_kdl_action_u8_arguments!(action_name, action_arguments, kdl_action) }, - "NewTab" => Ok(Action::NewTab(None, vec![], None, None, None)), + "NewTab" => { + let command_metadata = action_children.iter().next(); + if command_metadata.is_none() { + return Ok(Action::NewTab(None, vec![], None, None, None)); + } + + let current_dir = std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")); + + let layout = command_metadata + .and_then(|c_m| kdl_child_string_value_for_entry(c_m, "layout")) + .map(|layout_string| PathBuf::from(layout_string)) + .or_else(|| config_options.default_layout.clone()); + let cwd = command_metadata + .and_then(|c_m| kdl_child_string_value_for_entry(c_m, "cwd")) + .map(|cwd_string| PathBuf::from(cwd_string)) + .map(|cwd| current_dir.join(cwd)); + let name = command_metadata + .and_then(|c_m| kdl_child_string_value_for_entry(c_m, "name")) + .map(|name_string| name_string.to_string()); + + let (path_to_raw_layout, raw_layout, swap_layouts) = + Layout::stringified_from_path_or_default(layout.as_ref(), None).map_err( + |e| { + ConfigError::new_kdl_error( + format!("Failed to load layout: {}", e), + kdl_action.span().offset(), + kdl_action.span().len(), + ) + }, + )?; + + let layout = + Layout::from_str(&raw_layout, path_to_raw_layout, swap_layouts.as_ref().map(|(f, p)| (f.as_str(), p.as_str())), cwd).map_err(|e| { + ConfigError::new_kdl_error( + format!("Failed to load layout: {}", e), + kdl_action.span().offset(), + kdl_action.span().len(), + ) + })?; + + let mut tabs = layout.tabs(); + if tabs.len() > 1 { + return Err(ConfigError::new_kdl_error( + "Tab layout cannot itself have tabs".to_string(), + kdl_action.span().offset(), + kdl_action.span().len(), + )); + } else if !tabs.is_empty() { + let (tab_name, layout, floating_panes_layout) = tabs.drain(..).next().unwrap(); + let name = tab_name.or(name); + + Ok(Action::NewTab(Some(layout), floating_panes_layout, None, None, name)) + } else { + let (layout, floating_panes_layout) = layout.new_tab(); + + Ok(Action::NewTab(Some(layout), floating_panes_layout, None, None, name)) + } + }, "GoToTab" => parse_kdl_action_u8_arguments!(action_name, action_arguments, kdl_action), "TabNameInput" => { parse_kdl_action_u8_arguments!(action_name, action_arguments, kdl_action) @@ -1413,12 +1470,13 @@ impl Keybinds { fn bind_keys_in_block( block: &KdlNode, input_mode_keybinds: &mut HashMap<Key, Vec<Action>>, + config_options: &Options, ) -> Result<(), ConfigError> { let all_nodes = kdl_children_nodes_or_error!(block, "no keybinding block for mode"); let bind_nodes = all_nodes.iter().filter(|n| kdl_name!(n) == "bind"); let unbind_nodes = all_nodes.iter().filter(|n| kdl_name!(n) == "unbind"); for key_block in bind_nodes { - Keybinds::bind_actions_for_each_key(key_block, input_mode_keybinds)?; + Keybinds::bind_actions_for_each_key(key_block, input_mode_keybinds, config_options)?; } // we loop a second time so that the unbinds always happen after the binds for key_block in unbind_nodes { @@ -1435,7 +1493,11 @@ impl Keybinds { } Ok(()) } - pub fn from_kdl(kdl_keybinds: &KdlNode, base_keybinds: Keybinds) -> Result<Self, ConfigError> { + pub fn from_kdl( + kdl_keybinds: &KdlNode, + base_keybinds: Keybinds, + config_options: &Options, + ) -> Result<Self, ConfigError> { let clear_defaults = kdl_arg_is_truthy!(kdl_keybinds, "clear-defaults"); let mut keybinds_from_config = if clear_defaults { Keybinds::default() @@ -1459,7 +1521,7 @@ impl Keybinds { continue; } let mut input_mode_keybinds = keybinds_from_config.get_input_mode_mut(&mode); - Keybinds::bind_keys_in_block(block, &mut input_mode_keybinds)?; + Keybinds::bind_keys_in_block(block, &mut input_mode_keybinds, config_options)?; } } if kdl_name!(block) == "shared_among" { @@ -1472,7 +1534,7 @@ impl Keybinds { continue; } let mut input_mode_keybinds = keybinds_from_config.get_input_mode_mut(&mode); - Keybinds::bind_keys_in_block(block, &mut input_mode_keybinds)?; + Keybinds::bind_keys_in_block(block, &mut input_mode_keybinds, config_options)?; } } } @@ -1486,7 +1548,7 @@ impl Keybinds { } let mut input_mode_keybinds = Keybinds::input_mode_keybindings(mode, &mut keybinds_from_config)?; - Keybinds::bind_keys_in_block(mode, &mut input_mode_keybinds)?; + Keybinds::bind_keys_in_block(mode, &mut input_mode_keybinds, config_options)?; } if let Some(global_unbind) = kdl_keybinds.children().and_then(|c| c.get("unbind")) { Keybinds::unbind_keys_in_all_modes(global_unbind, &mut keybinds_from_config)?; @@ -1496,9 +1558,10 @@ impl Keybinds { fn bind_actions_for_each_key( key_block: &KdlNode, input_mode_keybinds: &mut HashMap<Key, Vec<Action>>, + config_options: &Options, ) -> Result<(), ConfigError> { let keys: Vec<Key> = keys_from_kdl!(key_block); - let actions: Vec<Action> = actions_from_kdl!(key_block); + let actions: Vec<Action> = actions_from_kdl!(key_block, config_options); for key in keys { input_mode_keybinds.insert(key, actions.clone()); } @@ -1551,13 +1614,15 @@ impl Config { pub fn from_kdl(kdl_config: &str, base_config: Option<Config>) -> Result<Config, ConfigError> { let mut config = base_config.unwrap_or_else(|| Config::default()); let kdl_config: KdlDocument = kdl_config.parse()?; + + let config_options = Options::from_kdl(&kdl_config)?; + config.options = config.options.merge(config_options); + // TODO: handle cases where we have more than one of these blocks (eg. two "keybinds") // this should give an informative parsing error if let Some(kdl_keybinds) = kdl_config.get("keybinds") { - config.keybinds = Keybinds::from_kdl(&kdl_keybinds, config.keybinds)?; + config.keybinds = Keybinds::from_kdl(&kdl_keybinds, config.keybinds, &config.options)?; } - let config_options = Options::from_kdl(&kdl_config)?; - config.options = config.options.merge(config_options); if let Some(kdl_themes) = kdl_config.get("themes") { let config_themes = Themes::from_kdl(kdl_themes)?; config.themes = config.themes.merge(config_themes); |