aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-kenji <aks.kenji@protonmail.com>2021-06-30 23:25:50 +0200
committera-kenji <aks.kenji@protonmail.com>2021-07-02 13:39:02 +0200
commit0bf78100ddbae4fa3f199b4c0f4a4b05ac83c5ee (patch)
treec9a3a2b23fb4ef07fccdd82620eadfb99b11fcd0
parentMerge pull request #593 from a-kenji/modularize-spawn-terminal (diff)
downloadsl0ppij-0bf78100ddbae4fa3f199b4c0f4a4b05ac83c5ee.tar.gz
sl0ppij-0bf78100ddbae4fa3f199b4c0f4a4b05ac83c5ee.tar.xz
sl0ppij-0bf78100ddbae4fa3f199b4c0f4a4b05ac83c5ee.zip
Add running commands to an action
Add the ability to bind running commands to an action. Eg: ``` - action: [Run: {command: "htop",},] key: [F: 6,] `` Optionally the direction and arguments can be specified: ``` - action: [Run: {command: "htop", args: ["-C",]},] key: [F: 7,] ``` The directional splits are analogous to the `[NewPane]` splits. ``` - action: [Run: {command: "htop", args: ["-C",], direction: "Up"},] key: [F: 8,] ```
-rw-r--r--zellij-server/src/route.rs13
-rw-r--r--zellij-utils/src/input/actions.rs3
-rw-r--r--zellij-utils/src/input/command.rs22
3 files changed, 37 insertions, 1 deletions
diff --git a/zellij-server/src/route.rs b/zellij-server/src/route.rs
index 285f333c..1a559d08 100644
--- a/zellij-server/src/route.rs
+++ b/zellij-server/src/route.rs
@@ -10,6 +10,7 @@ use zellij_utils::{
channels::SenderWithContext,
input::{
actions::{Action, Direction},
+ command::TerminalAction,
get_mode_info,
},
ipc::{ClientToServerMsg, ExitReason, ServerToClientMsg},
@@ -143,6 +144,18 @@ fn route_action(
};
session.senders.send_to_pty(pty_instr).unwrap();
}
+ Action::Run(command) => {
+ let run_cmd = Some(TerminalAction::RunCommand(command.clone().into()));
+ let pty_instr = match command.direction {
+ Some(Direction::Left) => PtyInstruction::SpawnTerminalVertically(run_cmd),
+ Some(Direction::Right) => PtyInstruction::SpawnTerminalVertically(run_cmd),
+ Some(Direction::Up) => PtyInstruction::SpawnTerminalHorizontally(run_cmd),
+ Some(Direction::Down) => PtyInstruction::SpawnTerminalHorizontally(run_cmd),
+ // No direction specified - try to put it in the biggest available spot
+ None => PtyInstruction::SpawnTerminal(run_cmd),
+ };
+ session.senders.send_to_pty(pty_instr).unwrap();
+ }
Action::CloseFocus => {
session
.senders
diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs
index 615df3c4..36fd93b1 100644
--- a/zellij-utils/src/input/actions.rs
+++ b/zellij-utils/src/input/actions.rs
@@ -1,5 +1,6 @@
//! Definition of the actions that can be bound to keys.
+use super::command::RunCommandAction;
use serde::{Deserialize, Serialize};
use zellij_tile::data::InputMode;
@@ -65,6 +66,8 @@ pub enum Action {
CloseTab,
GoToTab(u32),
TabNameInput(Vec<u8>),
+ /// Run speficied command in new pane.
+ Run(RunCommandAction),
/// Detach session and exit
Detach,
}
diff --git a/zellij-utils/src/input/command.rs b/zellij-utils/src/input/command.rs
index 79bbe5ab..ca505ea2 100644
--- a/zellij-utils/src/input/command.rs
+++ b/zellij-utils/src/input/command.rs
@@ -1,4 +1,5 @@
//! Trigger a command
+use super::actions::Direction;
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
@@ -8,9 +9,28 @@ pub enum TerminalAction {
RunCommand(RunCommand),
}
-#[derive(Clone, Debug, Deserialize, Default, Serialize, PartialEq)]
+#[derive(Clone, Debug, Deserialize, Default, Serialize, PartialEq, Eq)]
pub struct RunCommand {
pub command: PathBuf,
#[serde(default)]
pub args: Vec<String>,
}
+
+/// Intermediate representation
+#[derive(Clone, Debug, Deserialize, Default, Serialize, PartialEq, Eq)]
+pub struct RunCommandAction {
+ pub command: PathBuf,
+ #[serde(default)]
+ pub args: Vec<String>,
+ #[serde(default)]
+ pub direction: Option<Direction>,
+}
+
+impl From<RunCommandAction> for RunCommand {
+ fn from(action: RunCommandAction) -> Self {
+ RunCommand {
+ command: action.command,
+ args: action.args,
+ }
+ }
+}