aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-utils/src
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2024-02-26 15:30:15 +0100
committerGitHub <noreply@github.com>2024-02-26 15:30:15 +0100
commit21273ac95a2fed6b07d8550fe2d4f65993be7037 (patch)
treef5a7aa488ece8f21c17350bb3ec14ceaf15f60a7 /zellij-utils/src
parentdocs(changelog): add moving tab (diff)
downloadsl0ppij-21273ac95a2fed6b07d8550fe2d4f65993be7037.tar.gz
sl0ppij-21273ac95a2fed6b07d8550fe2d4f65993be7037.tar.xz
sl0ppij-21273ac95a2fed6b07d8550fe2d4f65993be7037.zip
feat(plugins): introduce plugin aliases (#3157)
* working prototype with passing tests * new tests and passing plugin tests as well * style(code): cleanups * cleanup strider from unused search feature * prototype of removing old plugin block from the config * aliases working from config file and all tests passing * fixups and cleanups * use aliases in layouts * update test snapshot * style(fmt): rustfmt
Diffstat (limited to 'zellij-utils/src')
-rw-r--r--zellij-utils/src/cli.rs2
-rw-r--r--zellij-utils/src/input/actions.rs82
-rw-r--r--zellij-utils/src/input/config.rs86
-rw-r--r--zellij-utils/src/input/layout.rs196
-rw-r--r--zellij-utils/src/input/plugins.rs113
-rw-r--r--zellij-utils/src/input/unit/layout_test.rs47
-rw-r--r--zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap134
-rw-r--r--zellij-utils/src/ipc.rs4
-rw-r--r--zellij-utils/src/kdl/kdl_layout_parser.rs31
-rw-r--r--zellij-utils/src/kdl/mod.rs99
-rw-r--r--zellij-utils/src/plugin_api/action.rs104
-rw-r--r--zellij-utils/src/session_serialization.rs31
-rw-r--r--zellij-utils/src/setup.rs14
-rw-r--r--zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-2.snap322
-rw-r--r--zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap180
-rw-r--r--zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap180
-rw-r--r--zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap158
-rw-r--r--zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap24
-rw-r--r--zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap180
-rw-r--r--zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap180
20 files changed, 1169 insertions, 998 deletions
diff --git a/zellij-utils/src/cli.rs b/zellij-utils/src/cli.rs
index 595293f4..e5b65d39 100644
--- a/zellij-utils/src/cli.rs
+++ b/zellij-utils/src/cli.rs
@@ -627,7 +627,7 @@ pub enum CliAction {
in_place: bool,
#[clap(short, long, value_parser)]
move_to_focused_tab: bool,
- url: Url,
+ url: String,
#[clap(short, long, value_parser)]
configuration: Option<PluginUserConfiguration>,
#[clap(short, long, value_parser)]
diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs
index b19529e4..18ed0a8d 100644
--- a/zellij-utils/src/input/actions.rs
+++ b/zellij-utils/src/input/actions.rs
@@ -2,8 +2,8 @@
use super::command::RunCommandAction;
use super::layout::{
- FloatingPaneLayout, Layout, RunPlugin, RunPluginLocation, SwapFloatingLayout, SwapTiledLayout,
- TiledPaneLayout,
+ FloatingPaneLayout, Layout, PluginAlias, RunPlugin, RunPluginLocation, RunPluginOrAlias,
+ SwapFloatingLayout, SwapTiledLayout, TiledPaneLayout,
};
use crate::cli::CliAction;
use crate::data::{Direction, Resize};
@@ -217,9 +217,9 @@ pub enum Action {
LeftClick(Position),
RightClick(Position),
MiddleClick(Position),
- LaunchOrFocusPlugin(RunPlugin, bool, bool, bool, bool), // bools => should float,
+ LaunchOrFocusPlugin(RunPluginOrAlias, bool, bool, bool, bool), // bools => should float,
// move_to_focused_tab, should_open_in_place, skip_cache
- LaunchPlugin(RunPlugin, bool, bool, bool, Option<PathBuf>), // bools => should float,
+ LaunchPlugin(RunPluginOrAlias, bool, bool, bool, Option<PathBuf>), // bools => should float,
// should_open_in_place, skip_cache, Option<PathBuf> is cwd
LeftMouseRelease(Position),
RightMouseRelease(Position),
@@ -246,19 +246,19 @@ pub enum Action {
/// Query all tab names
QueryTabNames,
/// Open a new tiled (embedded, non-floating) plugin pane
- NewTiledPluginPane(RunPlugin, Option<String>, bool, Option<PathBuf>), // String is an optional name, bool is
+ NewTiledPluginPane(RunPluginOrAlias, Option<String>, bool, Option<PathBuf>), // String is an optional name, bool is
// skip_cache, Option<PathBuf> is cwd
NewFloatingPluginPane(
- RunPlugin,
+ RunPluginOrAlias,
Option<String>,
bool,
Option<PathBuf>,
Option<FloatingPaneCoordinates>,
), // String is an optional name, bool is
// skip_cache, Option<PathBuf> is cwd
- NewInPlacePluginPane(RunPlugin, Option<String>, bool), // String is an optional name, bool is
+ NewInPlacePluginPane(RunPluginOrAlias, Option<String>, bool), // String is an optional name, bool is
// skip_cache
- StartOrReloadPlugin(RunPlugin),
+ StartOrReloadPlugin(RunPluginOrAlias),
CloseTerminalPane(u32),
ClosePluginPane(u32),
FocusTerminalPaneWithId(u32, bool), // bool is should_float_if_hidden
@@ -351,14 +351,20 @@ impl Action {
let cwd = cwd
.map(|cwd| current_dir.join(cwd))
.or_else(|| Some(current_dir));
- let user_configuration = configuration.unwrap_or_default();
if let Some(plugin) = plugin {
- let location = RunPluginLocation::parse(&plugin, cwd.clone())
- .map_err(|e| format!("Failed to parse plugin loction {plugin}: {}", e))?;
- let plugin = RunPlugin {
- _allow_exec_host_cmd: false,
- location,
- configuration: user_configuration,
+ let plugin = match RunPluginLocation::parse(&plugin, cwd.clone()) {
+ Ok(location) => {
+ let user_configuration = configuration.unwrap_or_default();
+ RunPluginOrAlias::RunPlugin(RunPlugin {
+ _allow_exec_host_cmd: false,
+ location,
+ configuration: user_configuration,
+ })
+ },
+ Err(_) => RunPluginOrAlias::Alias(PluginAlias::new(
+ &plugin,
+ &configuration.map(|c| c.inner().clone()),
+ )),
};
if floating {
Ok(vec![Action::NewFloatingPluginPane(
@@ -571,14 +577,13 @@ impl Action {
CliAction::QueryTabNames => Ok(vec![Action::QueryTabNames]),
CliAction::StartOrReloadPlugin { url, configuration } => {
let current_dir = get_current_dir();
- let run_plugin_location = RunPluginLocation::parse(&url, Some(current_dir))
- .map_err(|e| format!("Failed to parse plugin location: {}", e))?;
- let run_plugin = RunPlugin {
- location: run_plugin_location,
- _allow_exec_host_cmd: false,
- configuration: configuration.unwrap_or_default(),
- };
- Ok(vec![Action::StartOrReloadPlugin(run_plugin)])
+ let run_plugin_or_alias = RunPluginOrAlias::from_url(
+ &url,
+ &configuration.map(|c| c.inner().clone()),
+ None,
+ Some(current_dir),
+ )?;
+ Ok(vec![Action::StartOrReloadPlugin(run_plugin_or_alias)])
},
CliAction::LaunchOrFocusPlugin {
url,
@@ -589,15 +594,14 @@ impl Action {
skip_plugin_cache,
} => {
let current_dir = get_current_dir();
- let run_plugin_location = RunPluginLocation::parse(url.as_str(), Some(current_dir))
- .map_err(|e| format!("Failed to parse plugin location: {}", e))?;
- let run_plugin = RunPlugin {
- location: run_plugin_location,
- _allow_exec_host_cmd: false,
- configuration: configuration.unwrap_or_default(),
- };
+ let run_plugin_or_alias = RunPluginOrAlias::from_url(
+ url.as_str(),
+ &configuration.map(|c| c.inner().clone()),
+ None,
+ Some(current_dir),
+ )?;
Ok(vec![Action::LaunchOrFocusPlugin(
- run_plugin,
+ run_plugin_or_alias,
floating,
move_to_focused_tab,
in_place,
@@ -612,16 +616,14 @@ impl Action {
skip_plugin_cache,
} => {
let current_dir = get_current_dir();
- let run_plugin_location =
- RunPluginLocation::parse(url.as_str(), Some(current_dir.clone()))
- .map_err(|e| format!("Failed to parse plugin location: {}", e))?;
- let run_plugin = RunPlugin {
- location: run_plugin_location,
- _allow_exec_host_cmd: false,
- configuration: configuration.unwrap_or_default(),
- };
+ let run_plugin_or_alias = RunPluginOrAlias::from_url(
+ &url.as_str(),
+ &configuration.map(|c| c.inner().clone()),
+ None,
+ Some(current_dir.clone()),
+ )?;
Ok(vec![Action::LaunchPlugin(
- run_plugin,
+ run_plugin_or_alias,
floating,
in_place,
skip_plugin_cache,
diff --git a/zellij-utils/src/input/config.rs b/zellij-utils/src/input/config.rs
index eb8fe521..cf6620a9 100644
--- a/zellij-utils/src/input/config.rs
+++ b/zellij-utils/src/input/config.rs
@@ -9,7 +9,7 @@ use std::convert::TryFrom;
use super::keybinds::Keybinds;
use super::options::Options;
-use super::plugins::{PluginsConfig, PluginsConfigError};
+use super::plugins::{PluginAliases, PluginsConfigError};
use super::theme::{Themes, UiConfig};
use crate::cli::{CliArgs, Command};
use crate::envs::EnvironmentVariables;
@@ -25,7 +25,7 @@ pub struct Config {
pub keybinds: Keybinds,
pub options: Options,
pub themes: Themes,
- pub plugins: PluginsConfig,
+ pub plugins: PluginAliases,
pub ui: UiConfig,
pub env: EnvironmentVariables,
}
@@ -226,7 +226,7 @@ impl Config {
self.options = self.options.merge(other.options);
self.keybinds.merge(other.keybinds.clone());
self.themes = self.themes.merge(other.themes);
- self.plugins = self.plugins.merge(other.plugins);
+ self.plugins.merge(other.plugins);
self.ui = self.ui.merge(other.ui);
self.env = self.env.merge(other.env);
Ok(())
@@ -237,11 +237,11 @@ impl Config {
mod config_test {
use super::*;
use crate::data::{InputMode, Palette, PaletteColor, PluginTag};
- use crate::input::layout::RunPluginLocation;
+ use crate::input::layout::{RunPlugin, RunPluginLocation};
use crate::input::options::{Clipboard, OnForceClose};
- use crate::input::plugins::{PluginConfig, PluginType, PluginsConfig};
+ use crate::input::plugins::{PluginConfig, PluginType};
use crate::input::theme::{FrameConfig, Theme, Themes, UiConfig};
- use std::collections::HashMap;
+ use std::collections::{BTreeMap, HashMap};
use std::io::Write;
use tempfile::tempdir;
@@ -591,60 +591,54 @@ mod config_test {
fn can_define_plugin_configuration_in_configfile() {
let config_contents = r#"
plugins {
- tab-bar { path "tab-bar"; }
- status-bar { path "status-bar"; }
- strider {
- path "strider"
- _allow_exec_host_cmd true
+ tab-bar location="zellij:tab-bar"
+ status-bar location="zellij:status-bar"
+ strider location="zellij:strider"
+ compact-bar location="zellij:compact-bar"
+ session-manager location="zellij:session-manager"
+ welcome-screen location="zellij:session-manager" {
+ welcome_screen true
}
- compact-bar { path "compact-bar"; }
+ filepicker location="zellij:strider"
}
"#;
let config = Config::from_kdl(config_contents, None).unwrap();
- let mut expected_plugin_configuration = HashMap::new();
+ let mut expected_plugin_configuration = BTreeMap::new();
expected_plugin_configuration.insert(
- PluginTag::new("tab-bar"),
- PluginConfig {
- path: PathBuf::from("tab-bar"),
- run: PluginType::Pane(None),
- location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
- _allow_exec_host_cmd: false,
- userspace_configuration: Default::default(),
- },
+ "tab-bar".to_owned(),
+ RunPlugin::from_url("zellij:tab-bar").unwrap(),
);
expected_plugin_configuration.insert(
- PluginTag::new("status-bar"),
- PluginConfig {
- path: PathBuf::from("status-bar"),
- run: PluginType::Pane(None),
- location: RunPluginLocation::Zellij(PluginTag::new("status-bar")),
- _allow_exec_host_cmd: false,
- userspace_configuration: Default::default(),
- },
+ "status-bar".to_owned(),
+ RunPlugin::from_url("zellij:status-bar").unwrap(),
);
expected_plugin_configuration.insert(
- PluginTag::new("strider"),
- PluginConfig {
- path: PathBuf::from("strider"),
- run: PluginType::Pane(None),
- location: RunPluginLocation::Zellij(PluginTag::new("strider")),
- _allow_exec_host_cmd: true,
- userspace_configuration: Default::default(),
- },
+ "strider".to_owned(),
+ RunPlugin::from_url("zellij:strider").unwrap(),
);
expected_plugin_configuration.insert(
- PluginTag::new("compact-bar"),
- PluginConfig {
- path: PathBuf::from("compact-bar"),
- run: PluginType::Pane(None),
- location: RunPluginLocation::Zellij(PluginTag::new("compact-bar")),
- _allow_exec_host_cmd: false,
- userspace_configuration: Default::default(),
- },
+ "compact-bar".to_owned(),
+ RunPlugin::from_url("zellij:compact-bar").unwrap(),
+ );
+ expected_plugin_configuration.insert(
+ "session-manager".to_owned(),
+ RunPlugin::from_url("zellij:session-manager").unwrap(),
+ );
+ let mut welcome_screen_configuration = BTreeMap::new();
+ welcome_screen_configuration.insert("welcome_screen".to_owned(), "true".to_owned());
+ expected_plugin_configuration.insert(
+ "welcome-screen".to_owned(),
+ RunPlugin::from_url("zellij:session-manager")
+ .unwrap()
+ .with_configuration(welcome_screen_configuration),
+ );
+ expected_plugin_configuration.insert(
+ "filepicker".to_owned(),
+ RunPlugin::from_url("zellij:strider").unwrap(),
);
assert_eq!(
config.plugins,
- PluginsConfig::from_data(expected_plugin_configuration),
+ PluginAliases::from_data(expected_plugin_configuration),
"Plugins defined in config"
);
}
diff --git a/zellij-utils/src/input/layout.rs b/zellij-utils/src/input/layout.rs
index 3dfadb40..ad2fca89 100644
--- a/zellij-utils/src/input/layout.rs
+++ b/zellij-utils/src/input/layout.rs
@@ -23,7 +23,7 @@ use std::cmp::Ordering;
use std::fmt::{Display, Formatter};
use std::str::FromStr;
-use super::plugins::{PluginTag, PluginsConfigError};
+use super::plugins::{PluginAliases, PluginTag, PluginsConfigError};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::vec::Vec;
@@ -80,10 +80,122 @@ impl SplitSize {
}
}
+#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)]
+pub enum RunPluginOrAlias {
+ RunPlugin(RunPlugin),
+ Alias(PluginAlias),
+}
+
+impl Default for RunPluginOrAlias {
+ fn default() -> Self {
+ RunPluginOrAlias::RunPlugin(Default::default())
+ }
+}
+
+impl RunPluginOrAlias {
+ pub fn location_string(&self) -> String {
+ match self {
+ RunPluginOrAlias::RunPlugin(run_plugin) => run_plugin.location.display(),
+ RunPluginOrAlias::Alias(plugin_alias) => plugin_alias.name.clone(),
+ }
+ }
+ pub fn populate_run_plugin_if_needed(&mut self, plugin_aliases: &PluginAliases) {
+ if let RunPluginOrAlias::Alias(run_plugin_alias) = self {
+ if run_plugin_alias.run_plugin.is_some() {
+ log::warn!("Overriding plugin alias");
+ }
+ let merged_run_plugin = plugin_aliases
+ .aliases
+ .get(run_plugin_alias.name.as_str())
+ .map(|r| {
+ r.clone().merge_configuration(
+ &run_plugin_alias
+ .configuration
+ .as_ref()
+ .map(|c| c.inner().clone()),
+ )
+ });
+ run_plugin_alias.run_plugin = merged_run_plugin;
+ }
+ }
+ pub fn get_run_plugin(&self) -> Option<RunPlugin> {
+ match self {
+ RunPluginOrAlias::RunPlugin(run_plugin) => Some(run_plugin.clone()),
+ RunPluginOrAlias::Alias(plugin_alias) => plugin_alias.run_plugin.clone(),
+ }
+ }
+ pub fn get_configuration(&self) -> Option<PluginUserConfiguration> {
+ self.get_run_plugin().map(|r| r.configuration.clone())
+ }
+ pub fn from_url(
+ url: &str,
+ configuration: &Option<BTreeMap<String, String>>,
+ alias_dict: Option<&PluginAliases>,
+ cwd: Option<PathBuf>,
+ ) -> Result<Self, String> {
+ match RunPluginLocation::parse(&url, cwd) {
+ Ok(location) => Ok(RunPluginOrAlias::RunPlugin(RunPlugin {
+ _allow_exec_host_cmd: false,
+ location,
+ configuration: configuration
+ .as_ref()
+ .map(|c| PluginUserConfiguration::new(c.clone()))
+ .unwrap_or_default(),
+ })),
+ Err(PluginsConfigError::InvalidUrlScheme(_))
+ | Err(PluginsConfigError::InvalidUrl(..)) => {
+ let mut plugin_alias = PluginAlias::new(&url, configuration);
+ if let Some(alias_dict) = alias_dict {
+ plugin_alias.run_plugin = alias_dict
+ .aliases
+ .get(url)
+ .map(|r| r.clone().merge_configuration(configuration));
+ }
+ Ok(RunPluginOrAlias::Alias(plugin_alias))
+ },
+ Err(e) => {
+ return Err(format!("Failed to parse plugin location {url}: {}", e));
+ },
+ }
+ }
+ pub fn is_equivalent_to_run(&self, run: &Option<Run>) -> bool {
+ match (self, run) {
+ (
+ RunPluginOrAlias::Alias(self_alias),
+ Some(Run::Plugin(RunPluginOrAlias::Alias(run_alias))),
+ ) => {
+ self_alias.name == run_alias.name
+ && self_alias
+ .configuration
+ .as_ref()
+ // we do the is_empty() checks because an empty configuration is the same as no
+ // configuration (i.e. None)
+ .and_then(|c| if c.inner().is_empty() { None } else { Some(c) })
+ == run_alias.configuration.as_ref().and_then(|c| {
+ if c.inner().is_empty() {
+ None
+ } else {
+ Some(c)
+ }
+ })
+ },
+ (
+ RunPluginOrAlias::Alias(self_alias),
+ Some(Run::Plugin(RunPluginOrAlias::RunPlugin(other_run_plugin))),
+ ) => self_alias.run_plugin.as_ref() == Some(other_run_plugin),
+ (
+ RunPluginOrAlias::RunPlugin(self_run_plugin),
+ Some(Run::Plugin(RunPluginOrAlias::RunPlugin(other_run_plugin))),
+ ) => self_run_plugin == other_run_plugin,
+ _ => false,
+ }
+ }
+}
+
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub enum Run {
#[serde(rename = "plugin")]
- Plugin(RunPlugin),
+ Plugin(RunPluginOrAlias),
#[serde(rename = "command")]
Command(RunCommand),
EditFile(PathBuf, Option<usize>, Option<PathBuf>), // TODO: merge this with TerminalAction::OpenFile
@@ -227,6 +339,23 @@ impl Run {
Run::Cwd(cwd) => Some(cwd.clone()),
}
}
+ pub fn get_run_plugin(&self) -> Option<RunPlugin> {
+ match self {
+ Run::Plugin(RunPluginOrAlias::RunPlugin(run_plugin)) => Some(run_plugin.clone()),
+ Run::Plugin(RunPluginOrAlias::Alias(plugin_alias)) => {
+ plugin_alias.run_plugin.as_ref().map(|r| r.clone())
+ },
+ _ => None,
+ }
+ }
+ pub fn populate_run_plugin_if_needed(&mut self, alias_dict: &PluginAliases) {
+ match self {
+ Run::Plugin(run_plugin_alias) => {
+ run_plugin_alias.populate_run_plugin_if_needed(alias_dict)
+ },
+ _ => {},
+ }
+ }
}
#[allow(clippy::derive_hash_xor_eq)]
@@ -246,6 +375,35 @@ impl RunPlugin {
..Default::default()
})
}
+ pub fn with_configuration(mut self, configuration: BTreeMap<String, String>) -> Self {
+ self.configuration = PluginUserConfiguration::new(configuration);
+ self
+ }
+ pub fn merge_configuration(mut self, configuration: &Option<BTreeMap<String, String>>) -> Self {
+ if let Some(configuration) = configuration {
+ self.configuration.merge(configuration);
+ }
+ self
+ }
+}
+
+#[derive(Debug, Serialize, Deserialize, Clone, Hash, Default, PartialEq, Eq)]
+pub struct PluginAlias {
+ pub name: String,
+ pub configuration: Option<PluginUserConfiguration>,
+ pub run_plugin: Option<RunPlugin>,
+}
+
+impl PluginAlias {
+ pub fn new(name: &str, configuration: &Option<BTreeMap<String, String>>) -> Self {
+ PluginAlias {
+ name: name.to_owned(),
+ configuration: configuration
+ .as_ref()
+ .map(|c| PluginUserConfiguration::new(c.clone())),
+ ..Default::default()
+ }
+ }
}
#[allow(clippy::derive_hash_xor_eq)]
@@ -280,6 +438,11 @@ impl PluginUserConfiguration {
pub fn insert(&mut self, config_key: impl Into<String>, config_value: impl Into<String>) {
self.0.insert(config_key.into(), config_value.into());
}
+ pub fn merge(&mut self, other_config: &BTreeMap<String, String>) {
+ for (key, value) in other_config {
+ self.0.insert(key.to_owned(), value.clone());
+ }
+ }
}
impl FromStr for PluginUserConfiguration {
@@ -706,6 +869,15 @@ impl TiledPaneLayout {
child.add_cwd_to_layout(cwd);
}
}
+ pub fn populate_plugin_aliases_in_layout(&mut self, plugin_aliases: &PluginAliases) {
+ match self.run.as_mut() {
+ Some(run) => run.populate_run_plugin_if_needed(plugin_aliases),
+ _ => {},
+ }
+ for child in self.children.iter_mut() {
+ child.populate_plugin_aliases_in_layout(plugin_aliases);
+ }
+ }
pub fn deepest_depth(&self) -> usize {
let mut deepest_child_depth = 0;
for child in self.children.iter() {
@@ -1141,6 +1313,26 @@ impl Layout {
Err(_e) => None,
}
}
+ pub fn populate_plugin_aliases_in_layout(&mut self, plugin_aliases: &PluginAliases) {
+ for tab in self.tabs.iter_mut() {
+ tab.1.populate_plugin_aliases_in_layout(plugin_aliases);
+ for floating_pane_layout in tab.2.iter_mut() {
+ floating_pane_layout
+ .run
+ .as_mut()
+ .map(|f| f.populate_run_plugin_if_needed(&plugin_aliases));
+ }
+ }
+ if let Some(template) = self.template.as_mut() {
+ template.0.populate_plugin_aliases_in_layout(plugin_aliases);
+ for floating_pane_layout in template.1.iter_mut() {
+ floating_pane_layout
+ .run
+ .as_mut()
+ .map(|f| f.populate_run_plugin_if_needed(&plugin_aliases));
+ }
+ }
+ }
}
fn split_space(
diff --git a/zellij-utils/src/input/plugins.rs b/zellij-utils/src/input/plugins.rs
index 2a262222..cb3d6891 100644
--- a/zellij-utils/src/input/plugins.rs
+++ b/zellij-utils/src/input/plugins.rs
@@ -1,6 +1,5 @@
//! Plugins configuration metadata
-use std::borrow::Borrow;
-use std::collections::HashMap;
+use std::collections::BTreeMap;
use std::fs;
use std::path::{Path, PathBuf};
use thiserror::Error;
@@ -14,73 +13,17 @@ use crate::consts::ASSET_MAP;
pub use crate::data::PluginTag;
use crate::errors::prelude::*;
-use std::collections::BTreeMap;
-use std::fmt;
-
-/// Used in the config struct for plugin metadata
-#[derive(Clone, PartialEq, Deserialize, Serialize)]
-pub struct PluginsConfig(pub HashMap<PluginTag, PluginConfig>);
-
-impl fmt::Debug for PluginsConfig {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let mut stable_sorted = BTreeMap::new();
- for (plugin_tag, plugin_config) in self.0.iter() {
- stable_sorted.insert(plugin_tag, plugin_config);
- }
- write!(f, "{:#?}", stable_sorted)
- }
+#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)]
+pub struct PluginAliases {
+ pub aliases: BTreeMap<String, RunPlugin>,
}
-impl PluginsConfig {
- pub fn new() -> Self {
- Self(HashMap::new())
- }
- pub fn from_data(data: HashMap<PluginTag, PluginConfig>) -> Self {
- PluginsConfig(data)
- }
-
- /// Get plugin config from run configuration specified in layout files.
- pub fn get(&self, run: impl Borrow<RunPlugin>) -> Option<PluginConfig> {
- let run = run.borrow();
- match &run.location {
- RunPluginLocation::File(path) => Some(PluginConfig {
- path: path.clone(),
- run: PluginType::Pane(None),
- _allow_exec_host_cmd: run._allow_exec_host_cmd,
- location: run.location.clone(),
- userspace_configuration: run.configuration.clone(),
- }),
- RunPluginLocation::Zellij(tag) => self.0.get(tag).cloned().map(|plugin| PluginConfig {
- _allow_exec_host_cmd: run._allow_exec_host_cmd,
- userspace_configuration: run.configuration.clone(),
- ..plugin
- }),
- RunPluginLocation::Remote(_) => Some(PluginConfig {
- path: PathBuf::new(),
- run: PluginType::Pane(None),
- _allow_exec_host_cmd: run._allow_exec_host_cmd,
- location: run.location.clone(),
- userspace_configuration: run.configuration.clone(),
- }),
- }
- }
-
- pub fn iter(&self) -> impl Iterator<Item = &PluginConfig> {
- self.0.values()
+impl PluginAliases {
+ pub fn merge(&mut self, other: Self) {
+ self.aliases.extend(other.aliases);
}
-
- /// Merges two PluginConfig structs into one PluginConfig struct
- /// `other` overrides the PluginConfig of `self`.
- pub fn merge(&self, other: Self) -> Self {
- let mut plugin_config = self.0.clone();
- plugin_config.extend(other.0);
- Self(plugin_config)
- }
-}
-
-impl Default for PluginsConfig {
- fn default() -> Self {
- PluginsConfig(HashMap::new())
+ pub fn from_data(aliases: BTreeMap<String, RunPlugin>) -> Self {
+ PluginAliases { aliases }
}
}
@@ -100,6 +43,44 @@ pub struct PluginConfig {
}
impl PluginConfig {
+ pub fn from_run_plugin(run_plugin: &RunPlugin) -> Option<PluginConfig> {
+ match &run_plugin.location {
+ RunPluginLocation::File(path) => Some(PluginConfig {
+ path: path.clone(),
+ run: PluginType::Pane(None),
+ _allow_exec_host_cmd: run_plugin._allow_exec_host_cmd,
+ location: run_plugin.location.clone(),
+ userspace_configuration: run_plugin.configuration.clone(),
+ }),
+ RunPluginLocation::Zellij(tag) => {
+ let tag = tag.to_string();
+ if tag == "status-bar"
+ || tag == "tab-bar"
+ || tag == "compact-bar"
+ || tag == "strider"
+ || tag == "session-manager"
+ {
+ Some(PluginConfig {
+ path: PathBuf::from(&tag),
+ run: PluginType::Pane(None),
+ _allow_exec_host_cmd: run_plugin._allow_exec_host_cmd,
+ location: RunPluginLocation::parse(&format!("zellij:{}", tag), None)
+ .ok()?,
+ userspace_configuration: run_plugin.configuration.clone(),
+ })
+ } else {
+ None
+ }
+ },
+ RunPluginLocation::Remote(_) => Some(PluginConfig {
+ path: PathBuf::new(),
+ run: PluginType::Pane(None),
+ _allow_exec_host_cmd: run_plugin._allow_exec_host_cmd,
+ location: run_plugin.location.clone(),
+ userspace_configuration: run_plugin.configuration.clone(),
+ }),
+ }
+ }
/// Resolve wasm plugin bytes for the plugin path and given plugin directory.
///
/// If zellij was built without the 'disable_automatic_asset_installation' feature, builtin
diff --git a/zellij-utils/src/input/unit/layout_test.rs b/zellij-utils/src/input/unit/layout_test.rs
index 424a5b22..b2070ce1 100644
--- a/zellij-utils/src/input/unit/layout_test.rs
+++ b/zellij-utils/src/input/unit/layout_test.rs
@@ -551,29 +551,29 @@ fn layout_with_plugin_panes() {
TiledPaneLayout {
children: vec![
TiledPaneLayout {
- run: Some(Run::Plugin(RunPlugin {
+ run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin {
location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
_allow_exec_host_cmd: false,
configuration: Default::default(),
- })),
+ }))),
..Default::default()
},
TiledPaneLayout {
- run: Some(Run::Plugin(RunPlugin {
+ run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin {
location: RunPluginLocation::File(PathBuf::from(
"/path/to/my/plugin.wasm",
)),
_allow_exec_host_cmd: false,
configuration: Default::default(),
- })),
+ }))),
..Default::default()
},
TiledPaneLayout {
- run: Some(Run::Plugin(RunPlugin {
+ run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin {
location: RunPluginLocation::Zellij(PluginTag::new("status-bar")),
_allow_exec_host_cmd: false,
configuration: PluginUserConfiguration(expected_plugin_configuration),
- })),
+ }))),
..Default::default()
},
],
@@ -2079,6 +2079,9 @@ fn run_plugin_location_parsing() {
pane {
plugin location="file:c:/absolute/windows/plugin.wasm"
}
+ pane {
+ plugin location="filepicker"
+ }
}
"#;
let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into(), None, None).unwrap();
@@ -2087,59 +2090,67 @@ fn run_plugin_location_parsing() {
TiledPaneLayout {
children: vec![
TiledPaneLayout {
- run: Some(Run::Plugin(RunPlugin {
+ run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin {
_allow_exec_host_cmd: false,
location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
configuration: Default::default(),
- })),
+ }))),
..Default::default()
},
TiledPaneLayout {
- run: Some(Run::Plugin(RunPlugin {
+ run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin {
_allow_exec_host_cmd: false,
location: RunPluginLocation::File(PathBuf::from(
"/path/to/my/plugin.wasm",
)),
configuration: Default::default(),
- })),
+ }))),
..Default::default()
},
TiledPaneLayout {
- run: Some(Run::Plugin(RunPlugin {
+ run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin {
_allow_exec_host_cmd: false,
location: RunPluginLocation::File(PathBuf::from("plugin.wasm")),
configuration: Default::default(),
- })),
+ }))),
..Default::default()
},
TiledPaneLayout {
- run: Some(Run::Plugin(RunPlugin {
+ run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin {
_allow_exec_host_cmd: false,
location: RunPluginLocation::File(PathBuf::from(
"relative/with space/plugin.wasm",
)),
configuration: Default::default(),
- })),
+ }))),
..Default::default()
},
TiledPaneLayout {
- run: Some(Run::Plugin(RunPlugin {
+ run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin {
_allow_exec_host_cmd: false,
location: RunPluginLocation::File(PathBuf::from(
"/absolute/with space/plugin.wasm",
)),
configuration: Default::default(),
- })),
+ }))),
..Default::default()
},
TiledPaneLayout {
- run: Some(Run::Plugin(RunPlugin {
+ run: Some(Run::Plugin(RunPluginOrAlias::RunPlugin(RunPlugin {
_allow_exec_host_cmd: false,
location: RunPluginLocation::File(PathBuf::from(
"c:/absolute/windows/plugin.wasm",
)),
configuration: Default::default(),
- })),
+ }))),
+ ..Default::default()
+ },
+ TiledPaneLayout {
+ run: Some(Run::Plugin(RunPluginOrAlias::Alias(PluginAlias {
+ name: "filepicker".to_owned(),
+ configuration: Some(PluginUserConfiguration::default()),
+ ..Default::default()
+ }))),
..Default::default()
},
],
diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap
index 0ebdf2ca..abfd8801 100644
--- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap
+++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap
@@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
-assertion_line: 1880
+assertion_line: 1935
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@@ -65,17 +65,19 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "tab-bar",
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ ),
),
),
borderless: true,
@@ -167,17 +169,19 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "status-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ },
+ ),
),
),
borderless: true,
@@ -220,17 +224,19 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "tab-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ },
+ ),
),
),
borderless: true,
@@ -387,17 +393,19 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "status-bar",
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ ),
),
),
borderless: true,
@@ -440,17 +448,19 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "tab-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ },
+ ),
),
),
borderless: true,
@@ -688,17 +698,19 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "status-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ },
+ ),
),
),
borderless: true,
diff --git a/zellij-utils/src/ipc.rs b/zellij-utils/src/ipc.rs
index 902d0235..b91ff697 100644
--- a/zellij-utils/src/ipc.rs
+++ b/zellij-utils/src/ipc.rs
@@ -4,7 +4,7 @@ use crate::{
data::{ClientId, ConnectToSession, InputMode, Style},
errors::{get_current_ctx, prelude::*, ErrorContext},
input::keybinds::Keybinds,
- input::{actions::Action, layout::Layout, options::Options, plugins::PluginsConfig},
+ input::{actions::Action, layout::Layout, options::Options, plugins::PluginAliases},
pane_size::{Size, SizeInPixels},
};
use interprocess::local_socket::LocalSocketStream;
@@ -76,7 +76,7 @@ pub enum ClientToServerMsg {
Box<CliArgs>,
Box<Options>,
Box<Layout>,
- Option<PluginsConfig>,
+ Box<PluginAliases>,
),
AttachClient(
ClientAttributes,
diff --git a/zellij-utils/src/kdl/kdl_layout_parser.rs b/zellij-utils/src/kdl/kdl_layout_parser.rs
index 16be5fca..2aa3ba57 100644
--- a/zellij-utils/src/kdl/kdl_layout_parser.rs
+++ b/zellij-utils/src/kdl/kdl_layout_parser.rs
@@ -3,8 +3,8 @@ use crate::input::{
config::ConfigError,
layout::{
FloatingPaneLayout, Layout, LayoutConstraint, PercentOrFixed, PluginUserConfiguration, Run,
- RunPlugin, RunPluginLocation, SplitDirection, SplitSize, SwapFloatingLayout,
- SwapTiledLayout, TiledPaneLayout,
+ RunPluginOrAlias, SplitDirection, SplitSize, SwapFloatingLayout, SwapTiledLayout,
+ TiledPaneLayout,
},
};
@@ -313,20 +313,21 @@ impl<'a> KdlLayoutParser<'a> {
plugin_block.span().len(),
),
)?;
- let location =
- RunPluginLocation::parse(&string_url, self.cwd_prefix(None)?).map_err(|e| {
- ConfigError::new_layout_kdl_error(
- e.to_string(),
- url_node.span().offset(),
- url_node.span().len(),
- )
- })?;
let configuration = KdlLayoutParser::parse_plugin_user_configuration(&plugin_block)?;
- Ok(Some(Run::Plugin(RunPlugin {
- _allow_exec_host_cmd,
- location,
- configuration,
- })))
+ let run_plugin_or_alias = RunPluginOrAlias::from_url(
+ &string_url,
+ &Some(configuration.inner().clone()),
+ None,
+ self.cwd_prefix(None)?,
+ )
+ .map_err(|e| {
+ ConfigError::new_kdl_error(
+ format!("Failed to parse plugin: {}", e),
+ url_node.span().offset(),
+ url_node.span().len(),
+ )
+ })?;
+ Ok(Some(Run::Plugin(run_plugin_or_alias)))
}
pub fn parse_plugin_user_configuration(
plugin_block: &KdlNode,
diff --git a/zellij-utils/src/kdl/mod.rs b/zellij-utils/src/kdl/mod.rs
index 1d721090..23d7e69e 100644
--- a/zellij-utils/src/kdl/mod.rs
+++ b/zellij-utils/src/kdl/mod.rs
@@ -7,10 +7,10 @@ use crate::envs::EnvironmentVariables;
use crate::home::{find_default_config_dir, get_layout_dir};
use crate::input::config::{Config, ConfigError, KdlError};
use crate::input::keybinds::Keybinds;
-use crate::input::layout::{Layout, PluginUserConfiguration, RunPlugin, RunPluginLocation};
+use crate::input::layout::{Layout, RunPlugin, RunPluginOrAlias};
use crate::input::options::{Clipboard, OnForceClose, Options};
use crate::input::permission::{GrantedPermission, PermissionCache};
-use crate::input::plugins::{PluginConfig, PluginTag, PluginType, PluginsConfig};
+use crate::input::plugins::PluginAliases;
use crate::input::theme::{FrameConfig, Theme, Themes, UiConfig};
use kdl_layout_parser::KdlLayoutParser;
use std::collections::{BTreeMap, HashMap, HashSet};
@@ -981,15 +981,22 @@ impl TryFrom<(&KdlNode, &Options)> for Action {
.and_then(|c_m| kdl_child_bool_value_for_entry(c_m, "skip_plugin_cache"))
.unwrap_or(false);
let current_dir = std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."));
- let location = RunPluginLocation::parse(&plugin_path, Some(current_dir))?;
let configuration = KdlLayoutParser::parse_plugin_user_configuration(&kdl_action)?;
- let run_plugin = RunPlugin {
- location,
- _allow_exec_host_cmd: false,
- configuration,
- };
+ let run_plugin_or_alias = RunPluginOrAlias::from_url(
+ &plugin_path,
+ &Some(configuration.inner().clone()),
+ None,
+ Some(current_dir),
+ )
+ .map_err(|e| {
+ ConfigError::new_kdl_error(
+ format!("Failed to parse plugin: {}", e),
+ kdl_action.span().offset(),
+ kdl_action.span().len(),
+ )
+ })?;
Ok(Action::LaunchOrFocusPlugin(
- run_plugin,
+ run_plugin_or_alias,
should_float,
move_to_focused_tab,
should_open_in_place,
@@ -1019,15 +1026,22 @@ impl TryFrom<(&KdlNode, &Options)> for Action {
.and_then(|c_m| kdl_child_bool_value_for_entry(c_m, "skip_plugin_cache"))
.unwrap_or(false);
let current_dir = std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."));
- let location = RunPluginLocation::parse(&plugin_path, Some(current_dir))?;
let configuration = KdlLayoutParser::parse_plugin_user_configuration(&kdl_action)?;
- let run_plugin = RunPlugin {
- location,
- _allow_exec_host_cmd: false,
- configuration,
- };
+ let run_plugin_or_alias = RunPluginOrAlias::from_url(
+ &plugin_path,
+ &Some(configuration.inner().clone()),
+ None,
+ Some(current_dir),
+ )
+ .map_err(|e| {
+ ConfigError::new_kdl_error(
+ format!("Failed to parse plugin: {}", e),
+ kdl_action.span().offset(),
+ kdl_action.span().len(),
+ )
+ })?;
Ok(Action::LaunchPlugin(
- run_plugin,
+ run_plugin_or_alias,
should_float,
should_open_in_place,
skip_plugin_cache,
@@ -1810,9 +1824,9 @@ impl Config {
let config_themes = Themes::from_kdl(kdl_themes)?;
config.themes = config.themes.merge(config_themes);
}
- if let Some(kdl_plugin_config) = kdl_config.get("plugins") {
- let config_plugins = PluginsConfig::from_kdl(kdl_plugin_config)?;
- config.plugins = config.plugins.merge(config_plugins);
+ if let Some(kdl_plugin_aliases) = kdl_config.get("plugins") {
+ let config_plugins = PluginAliases::from_kdl(kdl_plugin_aliases)?;
+ config.plugins.merge(config_plugins);
}
if let Some(kdl_ui_config) = kdl_config.get("ui") {
let config_ui = UiConfig::from_kdl(&kdl_ui_config)?;
@@ -1826,38 +1840,27 @@ impl Config {
}
}
-impl PluginsConfig {
- pub fn from_kdl(kdl_plugin_config: &KdlNode) -> Result<Self, ConfigError> {
- let mut plugins: HashMap<PluginTag, PluginConfig> = HashMap::new();
- for plugin_config in
- kdl_children_nodes_or_error!(kdl_plugin_config, "no plugin config found")
- {
- let plugin_name = kdl_name!(plugin_config);
- let plugin_tag = PluginTag::new(plugin_name);
- let path = kdl_children_property_first_arg_as_string!(plugin_config, "path")
- .map(|path| PathBuf::from(path))
- .ok_or(ConfigError::new_kdl_error(
- "Plugin path not found or invalid".into(),
- plugin_config.span().offset(),
- plugin_config.span().len(),
- ))?;
- let allow_exec_host_cmd =
- kdl_children_property_first_arg_as_bool!(plugin_config, "_allow_exec_host_cmd")
- .unwrap_or(false);
- let plugin_config = PluginConfig {
- path,
- run: PluginType::Pane(None),
- location: RunPluginLocation::Zellij(plugin_tag.clone()),
- _allow_exec_host_cmd: allow_exec_host_cmd,
- userspace_configuration: PluginUserConfiguration::new(BTreeMap::new()), // TODO: consider removing the whole
- // "plugins" section in the config
- // because it's not used???
- };
- plugins.insert(plugin_tag, plugin_config);
+impl PluginAliases {
+ pub fn from_kdl(kdl_plugin_aliases: &KdlNode) -> Result<PluginAliases, ConfigError> {
+ let mut aliases: BTreeMap<String, RunPlugin> = BTreeMap::new();
+ if let Some(kdl_plugin_aliases) = kdl_children_nodes!(kdl_plugin_aliases) {
+ for alias_definition in kdl_plugin_aliases {
+ let alias_name = kdl_name!(alias_definition);
+ if let Some(string_url) =
+ kdl_get_string_property_or_child_value!(alias_definition, "location")
+ {
+ let configuration =
+ KdlLayoutParser::parse_plugin_user_configuration(&alias_definition)?;
+ let run_plugin = RunPlugin::from_url(string_url)?
+ .with_configuration(configuration.inner().clone());
+ aliases.insert(alias_name.to_owned(), run_plugin);
+ }
+ }
}
- Ok(PluginsConfig(plugins))
+ Ok(PluginAliases { aliases })
}
}
+
impl UiConfig {
pub fn from_kdl(kdl_ui_config: &KdlNode) -> Result<UiConfig, ConfigError> {
let mut ui_config = UiConfig::default();
diff --git a/zellij-utils/src/plugin_api/action.rs b/zellij-utils/src/plugin_api/action.rs
index ed657897..5673d1f9 100644
--- a/zellij-utils/src/plugin_api/action.rs
+++ b/zellij-utils/src/plugin_api/action.rs
@@ -18,9 +18,10 @@ use crate::errors::prelude::*;
use crate::input::actions::Action;
use crate::input::actions::{SearchDirection, SearchOption};
use crate::input::command::RunCommandAction;
-use crate::input::layout::{PluginUserConfiguration, RunPlugin, RunPluginLocation};
+use crate::input::layout::{
+ PluginUserConfiguration, RunPlugin, RunPluginLocation, RunPluginOrAlias,
+};
use crate::position::Position;
-use url::Url;
use std::collections::BTreeMap;
use std::convert::TryFrom;
@@ -403,24 +404,23 @@ impl TryFrom<ProtobufAction> for Action {
Some(ProtobufActionName::LaunchOrFocusPlugin) => {
match protobuf_action.optional_payload {
Some(OptionalPayload::LaunchOrFocusPluginPayload(payload)) => {
- let run_plugin_location =
- RunPluginLocation::parse(&payload.plugin_url, None)
- .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?;
let configuration: PluginUserConfiguration = payload
.plugin_configuration
.and_then(|p| PluginUserConfiguration::try_from(p).ok())
.unwrap_or_default();
- let run_plugin = RunPlugin {
- _allow_exec_host_cmd: false,
- location: run_plugin_location,
- configuration,
- };
+ let run_plugin_or_alias = RunPluginOrAlias::from_url(
+ &payload.plugin_url.as_str(),
+ &Some(configuration.inner().clone()),
+ None,
+ None,
+ )
+ .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?;
let should_float = payload.should_float;
let move_to_focused_tab = payload.move_to_focused_tab;
let should_open_in_place = payload.should_open_in_place;
let skip_plugin_cache = payload.skip_plugin_cache;
Ok(Action::LaunchOrFocusPlugin(
- run_plugin,
+ run_plugin_or_alias,
should_float,
move_to_focused_tab,
should_open_in_place,
@@ -432,25 +432,24 @@ impl TryFrom<ProtobufAction> for Action {
},
Some(ProtobufActionName::LaunchPlugin) => match protobuf_action.optional_payload {
Some(OptionalPayload::LaunchOrFocusPluginPayload(payload)) => {
- let run_plugin_location =
- RunPluginLocation::parse(&payload.plugin_url, None)
- .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?;
let configuration: PluginUserConfiguration = payload
.plugin_configuration
.and_then(|p| PluginUserConfiguration::try_from(p).ok())
.unwrap_or_default();
- let run_plugin = RunPlugin {
- _allow_exec_host_cmd: false,
- location: run_plugin_location,
- configuration,
- };
+ let run_plugin_or_alias = RunPluginOrAlias::from_url(
+ &payload.plugin_url.as_str(),
+ &Some(configuration.inner().clone()),
+ None,
+ None,
+ )
+ .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?;
let should_float = payload.should_float;
let _move_to_focused_tab = payload.move_to_focused_tab; // not actually used in
// this action
let should_open_in_place = payload.should_open_in_place;
let skip_plugin_cache = payload.skip_plugin_cache;
Ok(Action::LaunchPlugin(
- run_plugin,
+ run_plugin_or_alias,
should_float,
should_open_in_place,
skip_plugin_cache,
@@ -553,11 +552,11 @@ impl TryFrom<ProtobufAction> for Action {
let run_plugin_location =
RunPluginLocation::parse(&payload.plugin_url, None)
.map_err(|_| "Malformed NewTiledPluginPane payload")?;
- let run_plugin = RunPlugin {
+ let run_plugin = RunPluginOrAlias::RunPlugin(RunPlugin {
location: run_plugin_location,
_allow_exec_host_cmd: false,
configuration: PluginUserConfiguration::default(),
- };
+ });
let pane_name = payload.pane_name;
let skip_plugin_cache = payload.skip_plugin_cache;
Ok(Action::NewTiledPluginPane(
@@ -576,11 +575,11 @@ impl TryFrom<ProtobufAction> for Action {
let run_plugin_location =
RunPluginLocation::parse(&payload.plugin_url, None)
.map_err(|_| "Malformed NewTiledPluginPane payload")?;
- let run_plugin = RunPlugin {
+ let run_plugin = RunPluginOrAlias::RunPlugin(RunPlugin {
location: run_plugin_location,
_allow_exec_host_cmd: false,
configuration: PluginUserConfiguration::default(),
- };
+ });
let pane_name = payload.pane_name;
let skip_plugin_cache = payload.skip_plugin_cache;
Ok(Action::NewFloatingPluginPane(
@@ -597,14 +596,11 @@ impl TryFrom<ProtobufAction> for Action {
Some(ProtobufActionName::StartOrReloadPlugin) => {
match protobuf_action.optional_payload {
Some(OptionalPayload::StartOrReloadPluginPayload(payload)) => {
- let run_plugin_location = RunPluginLocation::parse(&payload, None)
- .map_err(|_| "Malformed StartOrReloadPluginPayload payload")?;
- let run_plugin = RunPlugin {
- _allow_exec_host_cmd: false,
- location: run_plugin_location,
- configuration: PluginUserConfiguration::default(),
- };
- Ok(Action::StartOrReloadPlugin(run_plugin))
+ let run_plugin_or_alias =
+ RunPluginOrAlias::from_url(&payload.as_str(), &None, None, None)
+ .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?;
+
+ Ok(Action::StartOrReloadPlugin(run_plugin_or_alias))
},
_ => Err("Wrong payload for Action::StartOrReloadPlugin"),
}
@@ -1044,44 +1040,44 @@ impl TryFrom<Action> for ProtobufAction {
})
},
Action::LaunchOrFocusPlugin(
- run_plugin,
+ run_plugin_or_alias,
should_float,
move_to_focused_tab,
should_open_in_place,
skip_plugin_cache,
) => {
- let url: Url = Url::from(&run_plugin.location);
+ let configuration = run_plugin_or_alias.get_configuration().unwrap_or_default();
Ok(ProtobufAction {
name: ProtobufActionName::LaunchOrFocusPlugin as i32,
optional_payload: Some(OptionalPayload::LaunchOrFocusPluginPayload(
LaunchOrFocusPluginPayload {
- plugin_url: url.into(),
+ plugin_url: run_plugin_or_alias.location_string(),
should_float,
move_to_focused_tab,
should_open_in_place,
- plugin_configuration: Some(run_plugin.configuration.try_into()?),
+ plugin_configuration: Some(configuration.try_into()?),
skip_plugin_cache,
},
)),
})
},
Action::LaunchPlugin(
- run_plugin,
+ run_plugin_or_alias,
should_float,
should_open_in_place,
skip_plugin_cache,
_cwd,
) => {
- let url: Url = Url::from(&run_plugin.location);
+ let configuration = run_plugin_or_alias.get_configuration().unwrap_or_default();
Ok(ProtobufAction {
name: ProtobufActionName::LaunchPlugin as i32,
optional_payload: Some(OptionalPayload::LaunchOrFocusPluginPayload(
LaunchOrFocusPluginPayload {
- plugin_url: url.into(),
+ plugin_url: run_plugin_or_alias.location_string(),
should_float,
move_to_focused_tab: false,
should_open_in_place,
- plugin_configuration: Some(run_plugin.configuration.try_into()?),
+ plugin_configuration: Some(configuration.try_into()?),
skip_plugin_cache,
},
)),
@@ -1166,12 +1162,11 @@ impl TryFrom<Action> for ProtobufAction {
optional_payload: None,
}),
Action::NewTiledPluginPane(run_plugin, pane_name, skip_plugin_cache, _cwd) => {
- let plugin_url: Url = Url::from(&run_plugin.location);
Ok(ProtobufAction {
name: ProtobufActionName::NewTiledPluginPane as i32,
optional_payload: Some(OptionalPayload::NewTiledPluginPanePayload(
NewPluginPanePayload {
- plugin_url: plugin_url.into(),
+ plugin_url: run_plugin.location_string(),
pane_name,
skip_plugin_cache,
},
@@ -1185,27 +1180,30 @@ impl TryFrom<Action> for ProtobufAction {
_cwd,
_coordinates,
) => {
- let plugin_url: Url = Url::from(&run_plugin.location);
+ // let plugin_url: Url = match run_plugin {
+ // RunPluginOrAlias::RunPlugin(run_plugin) => Url::from(&run_plugin.location),
+ // RunPluginOrAlias::Alias(plugin_alias) => {
+ // // TODO: support plugin alias
+ // unimplemented!()
+ // }
+ // };
Ok(ProtobufAction {
name: ProtobufActionName::NewFloatingPluginPane as i32,
optional_payload: Some(OptionalPayload::NewFloatingPluginPanePayload(
NewPluginPanePayload {
- plugin_url: plugin_url.into(),
+ plugin_url: run_plugin.location_string(),
pane_name,
skip_plugin_cache,
},
)),
})
},
- Action::StartOrReloadPlugin(run_plugin) => {
- let plugin_url: Url = Url::from(&run_plugin.location);
- Ok(ProtobufAction {
- name: ProtobufActionName::StartOrReloadPlugin as i32,
- optional_payload: Some(OptionalPayload::StartOrReloadPluginPayload(
- plugin_url.into(),
- )),
- })
- },
+ Action::StartOrReloadPlugin(run_plugin) => Ok(ProtobufAction {
+ name: ProtobufActionName::StartOrReloadPlugin as i32,
+ optional_payload: Some(OptionalPayload::StartOrReloadPluginPayload(
+ run_plugin.location_string(),
+ )),
+ }),
Action::CloseTerminalPane(terminal_pane_id) => Ok(ProtobufAction {
name: ProtobufActionName::CloseTerminalPane as i32,
optional_payload: Some(OptionalPayload::CloseTerminalPanePayload(terminal_pane_id)),
diff --git a/zellij-utils/src/session_serialization.rs b/zellij-utils/src/session_serialization.rs
index 0cd97328..d34aeb14 100644
--- a/zellij-utils/src/session_serialization.rs
+++ b/zellij-utils/src/session_serialization.rs
@@ -1,20 +1,11 @@
-//! # Persistence module
-//! !WIP! This module is holding the logic for all persistence sessions need
-//!
-//! # Examples
-//! ```rust,no_run
-//! fn main() {
-//! }
-//! ```
-//!
use std::collections::BTreeMap;
use std::path::PathBuf;
use crate::{
input::layout::PluginUserConfiguration,
input::layout::{
- FloatingPaneLayout, Layout, PercentOrFixed, Run, SplitDirection, SplitSize,
- SwapFloatingLayout, SwapTiledLayout, TiledPaneLayout,
+ FloatingPaneLayout, Layout, PercentOrFixed, Run, RunPluginOrAlias, SplitDirection,
+ SplitSize, SwapFloatingLayout, SwapTiledLayout, TiledPaneLayout,
},
pane_size::{Constraint, PaneGeom},
};
@@ -238,10 +229,20 @@ fn extract_plugin_and_config(
layout_run: &Option<Run>,
) -> (Option<String>, Option<PluginUserConfiguration>) {
match &layout_run {
- Some(Run::Plugin(run_plugin)) => (
- Some(run_plugin.location.display()),
- Some(run_plugin.configuration.clone()),
- ),
+ Some(Run::Plugin(run_plugin_or_alias)) => match run_plugin_or_alias {
+ RunPluginOrAlias::RunPlugin(run_plugin) => (
+ Some(run_plugin.location.display()),
+ Some(run_plugin.configuration.clone()),
+ ),
+ RunPluginOrAlias::Alias(plugin_alias) => {
+ let name = plugin_alias.name.clone();
+ let configuration = plugin_alias
+ .run_plugin
+ .as_ref()
+ .map(|run_plugin| run_plugin.configuration.clone());
+ (Some(name), configuration)
+ },
+ },
_ => (None, None),
}
}
diff --git a/zellij-utils/src/setup.rs b/zellij-utils/src/setup.rs
index bf34a894..d4146587 100644
--- a/zellij-utils/src/setup.rs
+++ b/zellij-utils/src/setup.rs
@@ -770,20 +770,6 @@ mod setup_test {
assert_snapshot!(format!("{:#?}", config));
}
#[test]
- fn layout_plugins_override_config_plugins() {
- let mut cli_args = CliArgs::default();
- cli_args.config = Some(PathBuf::from(format!(
- "{}/src/test-fixtures/config-with-plugins-config.kdl",
- env!("CARGO_MANIFEST_DIR")
- )));
- cli_args.layout = Some(PathBuf::from(format!(
- "{}/src/test-fixtures/layout-with-plugins-config.kdl",
- env!("CARGO_MANIFEST_DIR")
- )));
- let (config, _layout, _options, _, _) = Setup::from_cli_args(&cli_args).unwrap();
- assert_snapshot!(format!("{:#?}", config));
- }
- #[test]
fn layout_themes_override_config_themes() {
let mut cli_args = CliArgs::default();
cli_args.config = Some(PathBuf::from(format!(
diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-2.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-2.snap
index e98379dd..ade6b116 100644
--- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-2.snap
+++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-2.snap
@@ -1,6 +1,6 @@
---
source: zellij-utils/src/setup.rs
-assertion_line: 672
+assertion_line: 699
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@@ -23,17 +23,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ Alias(
+ PluginAlias {
+ name: "tab-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -73,17 +73,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ Alias(
+ PluginAlias {
+ name: "status-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -133,17 +133,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ Alias(
+ PluginAlias {
+ name: "tab-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -235,17 +235,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ Alias(
+ PluginAlias {
+ name: "status-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -288,17 +288,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ Alias(
+ PluginAlias {
+ name: "tab-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -455,17 +455,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ Alias(
+ PluginAlias {
+ name: "status-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -508,17 +508,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ Alias(
+ PluginAlias {
+ name: "tab-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -756,17 +756,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ Alias(
+ PluginAlias {
+ name: "status-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -816,17 +816,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ Alias(
+ PluginAlias {
+ name: "tab-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -899,17 +899,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ Alias(
+ PluginAlias {
+ name: "status-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -952,17 +952,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ Alias(
+ PluginAlias {
+ name: "tab-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -1119,17 +1119,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ Alias(
+ PluginAlias {
+ name: "status-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -1172,17 +1172,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ Alias(
+ PluginAlias {
+ name: "tab-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -1420,17 +1420,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ Alias(
+ PluginAlias {
+ name: "status-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -1480,17 +1480,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ Alias(
+ PluginAlias {
+ name: "tab-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
@@ -1582,17 +1582,17 @@ Layout {
),
run: Some(
Plugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ Alias(
+ PluginAlias {
+ name: "status-bar",
+ configuration: Some(
+ PluginUserConfiguration(
+ {},
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ run_plugin: None,
+ },
+ ),
),
),
borderless: true,
diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap
index f73b753e..18eaddce 100644
--- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap
+++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap
@@ -1,6 +1,6 @@
---
source: zellij-utils/src/setup.rs
-assertion_line: 671
+assertion_line: 698
expression: "format!(\"{:#?}\", config)"
---
Config {
@@ -2655,17 +2655,19 @@ Config {
'w',
): [
LaunchOrFocusPlugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "session-manager",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ ),
true,
true,
false,
@@ -3831,91 +3833,87 @@ Config {
serialization_interval: None,
},
themes: {},
- plugins: {
- PluginTag(
- "compact-bar",
- ): PluginConfig {
- path: "compact-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "compact-bar",
+ plugins: PluginAliases {
+ aliases: {
+ "compact-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "compact-bar",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "session-manager",
- ): PluginConfig {
- path: "session-manager",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "session-manager",
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "status-bar",
- ): PluginConfig {
- path: "status-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ },
+ "filepicker": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "strider",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "strider",
- ): PluginConfig {
- path: "strider",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "strider",
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "tab-bar",
- ): PluginConfig {
- path: "tab-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ },
+ "session-manager": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "status-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "status-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "strider": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "strider",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "tab-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "tab-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "welcome-screen": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {
+ "welcome_screen": "true",
+ },
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
+ },
},
},
ui: UiConfig {
diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap
index b5c185c8..89f544ff 100644
--- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap
+++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap
@@ -1,6 +1,6 @@
---
source: zellij-utils/src/setup.rs
-assertion_line: 729
+assertion_line: 756
expression: "format!(\"{:#?}\", config)"
---
Config {
@@ -2655,17 +2655,19 @@ Config {
'w',
): [
LaunchOrFocusPlugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "session-manager",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ ),
true,
true,
false,
@@ -3831,91 +3833,87 @@ Config {
serialization_interval: None,
},
themes: {},
- plugins: {
- PluginTag(
- "compact-bar",
- ): PluginConfig {
- path: "compact-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "compact-bar",
+ plugins: PluginAliases {
+ aliases: {
+ "compact-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "compact-bar",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "session-manager",
- ): PluginConfig {
- path: "session-manager",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "session-manager",
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "status-bar",
- ): PluginConfig {
- path: "status-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ },
+ "filepicker": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "strider",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "strider",
- ): PluginConfig {
- path: "strider",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "strider",
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "tab-bar",
- ): PluginConfig {
- path: "tab-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ },
+ "session-manager": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "status-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "status-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "strider": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "strider",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "tab-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "tab-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "welcome-screen": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {
+ "welcome_screen": "true",
+ },
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
+ },
},
},
ui: UiConfig {
diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap
index a6df2f5e..23fddc93 100644
--- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap
+++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap
@@ -1,6 +1,6 @@
---
source: zellij-utils/src/setup.rs
-assertion_line: 785
+assertion_line: 813
expression: "format!(\"{:#?}\", config)"
---
Config {
@@ -89,91 +89,87 @@ Config {
serialization_interval: None,
},
themes: {},
- plugins: {
- PluginTag(
- "compact-bar",
- ): PluginConfig {
- path: "compact-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "compact-bar",
+ plugins: PluginAliases {
+ aliases: {
+ "compact-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "compact-bar",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "session-manager",
- ): PluginConfig {
- path: "session-manager",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "session-manager",
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "status-bar",
- ): PluginConfig {
- path: "status-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ },
+ "filepicker": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "strider",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "strider",
- ): PluginConfig {
- path: "strider",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "strider",
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "tab-bar",
- ): PluginConfig {
- path: "tab-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ },
+ "session-manager": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "status-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "status-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "strider": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "strider",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "tab-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "tab-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "welcome-screen": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {
+ "welcome_screen": "true",
+ },
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
+ },
},
},
ui: UiConfig {
diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap
index e055135e..6e891732 100644
--- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap
+++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap
@@ -1,6 +1,6 @@
---
source: zellij-utils/src/setup.rs
-assertion_line: 757
+assertion_line: 784
expression: "format!(\"{:#?}\", config)"
---
Config {
@@ -2655,17 +2655,19 @@ Config {
'w',
): [
LaunchOrFocusPlugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "session-manager",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ ),
true,
true,
false,
diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap
index ba5df24d..1d682130 100644
--- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap
+++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap
@@ -1,6 +1,6 @@
---
source: zellij-utils/src/setup.rs
-assertion_line: 771
+assertion_line: 799
expression: "format!(\"{:#?}\", config)"
---
Config {
@@ -2655,17 +2655,19 @@ Config {
'w',
): [
LaunchOrFocusPlugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "session-manager",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ ),
true,
true,
false,
@@ -4135,91 +4137,87 @@ Config {
},
},
},
- plugins: {
- PluginTag(
- "compact-bar",
- ): PluginConfig {
- path: "compact-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "compact-bar",
+ plugins: PluginAliases {
+ aliases: {
+ "compact-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "compact-bar",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "session-manager",
- ): PluginConfig {
- path: "session-manager",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "session-manager",
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "status-bar",
- ): PluginConfig {
- path: "status-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ },
+ "filepicker": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "strider",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "strider",
- ): PluginConfig {
- path: "strider",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "strider",
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "tab-bar",
- ): PluginConfig {
- path: "tab-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ },
+ "session-manager": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "status-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "status-bar",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "strider": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "strider",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "tab-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "tab-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "welcome-screen": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {
+ "welcome_screen": "true",
+ },
+ ),
+ },
},
},
ui: UiConfig {
diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap
index a6e7350e..de44f0f1 100644
--- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap
+++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap
@@ -1,6 +1,6 @@
---
source: zellij-utils/src/setup.rs
-assertion_line: 743
+assertion_line: 770
expression: "format!(\"{:#?}\", config)"
---
Config {
@@ -2655,17 +2655,19 @@ Config {
'w',
): [
LaunchOrFocusPlugin(
- RunPlugin {
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "session-manager",
+ RunPlugin(
+ RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
),
- ),
- configuration: PluginUserConfiguration(
- {},
- ),
- },
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ ),
true,
true,
false,
@@ -3831,91 +3833,87 @@ Config {
serialization_interval: None,
},
themes: {},
- plugins: {
- PluginTag(
- "compact-bar",
- ): PluginConfig {
- path: "compact-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "compact-bar",
+ plugins: PluginAliases {
+ aliases: {
+ "compact-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "compact-bar",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "session-manager",
- ): PluginConfig {
- path: "session-manager",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "session-manager",
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "status-bar",
- ): PluginConfig {
- path: "status-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "status-bar",
+ },
+ "filepicker": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "strider",
+ ),
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "strider",
- ): PluginConfig {
- path: "strider",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "strider",
+ configuration: PluginUserConfiguration(
+ {},
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
- },
- PluginTag(
- "tab-bar",
- ): PluginConfig {
- path: "tab-bar",
- run: Pane(
- None,
- ),
- _allow_exec_host_cmd: false,
- location: Zellij(
- PluginTag(
- "tab-bar",
+ },
+ "session-manager": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "status-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "status-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "strider": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "strider",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "tab-bar": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "tab-bar",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {},
+ ),
+ },
+ "welcome-screen": RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: Zellij(
+ PluginTag(
+ "session-manager",
+ ),
+ ),
+ configuration: PluginUserConfiguration(
+ {
+ "welcome_screen": "true",
+ },
),
- ),
- userspace_configuration: PluginUserConfiguration(
- {},
- ),
+ },
},
},
ui: UiConfig {