aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-30 19:37:17 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-30 19:38:03 +0300
commitc71c6c108245b91f6478d95a3abf9a9a9e2e57a9 (patch)
tree5475b2c656295f1d987ad884e2a3b6b25fabbffc
parent2548acea155de392aac7ce4f638754e2972da69a (diff)
fix: resolve split current from caller pane
refs #902
-rw-r--r--docs/next/CHANGELOG.md1
-rw-r--r--docs/next/website/src/content/docs/cli-reference.mdx5
-rw-r--r--src/cli/pane.rs50
3 files changed, 44 insertions, 12 deletions
diff --git a/docs/next/CHANGELOG.md b/docs/next/CHANGELOG.md
index 1f61ded0..02d8cf5b 100644
--- a/docs/next/CHANGELOG.md
+++ b/docs/next/CHANGELOG.md
@@ -15,6 +15,7 @@
- Bumped the client/server protocol version to 15 for socket API placement mutation event and response compatibility.
### Fixed
+- `herdr pane split --current` now resolves to the calling Herdr pane instead of the UI-focused pane when run inside a pane. (#902)
- Native Windows clients running inside Alacritty now preserve mouse reports and `ctrl+j` input instead of leaking mouse escape sequences into panes. `shift+enter` remains dependent on whether the outer terminal reports it as a distinct modified Enter key. (#792)
- OMP integration state now recovers after resumed sessions such as `omp -c` and reports Ask/tool approval waits as blocked instead of leaving the pane working or stuck on the previous OMP session. (#879)
- Remote attach now discovers compatible Homebrew, mise, and Nix profile installs before offering to install a sidecar binary to `~/.local/bin/herdr`. (#840)
diff --git a/docs/next/website/src/content/docs/cli-reference.mdx b/docs/next/website/src/content/docs/cli-reference.mdx
index 4d2980fb..53fe9579 100644
--- a/docs/next/website/src/content/docs/cli-reference.mdx
+++ b/docs/next/website/src/content/docs/cli-reference.mdx
@@ -176,6 +176,11 @@ herdr pane move <pane_id> --new-workspace [--label TEXT] [--tab-label TEXT] [--f
herdr pane close <pane_id>
```
+For pane commands that accept `--current`, Herdr uses the calling pane's
+`HERDR_PANE_ID` when the command runs inside a Herdr pane. For `pane split`,
+an explicit pane id or `--pane ID` splits that pane, `--current` splits the
+calling pane, and an omitted target keeps using the UI-focused pane.
+
Read output:
```bash
diff --git a/src/cli/pane.rs b/src/cli/pane.rs
index c81e5835..b2579d42 100644
--- a/src/cli/pane.rs
+++ b/src/cli/pane.rs
@@ -529,7 +529,10 @@ fn pane_read(args: &[String]) -> std::io::Result<i32> {
}
fn pane_split(args: &[String]) -> std::io::Result<i32> {
- let params = match parse_pane_split_args(args) {
+ let env_pane_id = std::env::var("HERDR_PANE_ID")
+ .ok()
+ .filter(|value| !value.trim().is_empty());
+ let params = match parse_pane_split_args(args, env_pane_id.as_deref()) {
Ok(params) => params,
Err(message) => {
eprintln!("{message}");
@@ -543,7 +546,10 @@ fn pane_split(args: &[String]) -> std::io::Result<i32> {
})?)
}
-fn parse_pane_split_args(args: &[String]) -> Result<PaneSplitParams, String> {
+fn parse_pane_split_args(
+ args: &[String],
+ env_pane_id: Option<&str>,
+) -> Result<PaneSplitParams, String> {
let mut env = std::collections::HashMap::new();
let mut pane_id = None;
let mut direction = None;
@@ -569,7 +575,7 @@ fn parse_pane_split_args(args: &[String]) -> Result<PaneSplitParams, String> {
index += 2;
}
"--current" => {
- pane_id = None;
+ pane_id = env_pane_id.map(super::normalize_pane_id);
index += 1;
}
"--direction" => {
@@ -1470,13 +1476,10 @@ mod tests {
#[test]
fn parse_pane_split_args_accepts_ratio() {
- let params = parse_pane_split_args(&args(&[
- "issue-1",
- "--direction",
- "right",
- "--ratio",
- "0.333",
- ]))
+ let params = parse_pane_split_args(
+ &args(&["issue-1", "--direction", "right", "--ratio", "0.333"]),
+ None,
+ )
.unwrap();
assert_eq!(params.target_pane_id, Some("issue-1".into()));
@@ -1486,7 +1489,29 @@ mod tests {
#[test]
fn parse_pane_split_args_accepts_current_target() {
- let params = parse_pane_split_args(&args(&["--direction", "down", "--current"])).unwrap();
+ let params = parse_pane_split_args(
+ &args(&["--direction", "down", "--current"]),
+ Some("issue-1"),
+ )
+ .unwrap();
+
+ assert_eq!(params.target_pane_id, Some("issue-1".into()));
+ assert_eq!(params.direction, crate::api::schema::SplitDirection::Down);
+ }
+
+ #[test]
+ fn parse_pane_split_args_current_without_env_keeps_focused_fallback() {
+ let params =
+ parse_pane_split_args(&args(&["--direction", "down", "--current"]), None).unwrap();
+
+ assert_eq!(params.target_pane_id, None);
+ assert_eq!(params.direction, crate::api::schema::SplitDirection::Down);
+ }
+
+ #[test]
+ fn parse_pane_split_args_omitted_target_keeps_focused_fallback() {
+ let params =
+ parse_pane_split_args(&args(&["--direction", "down"]), Some("issue-1")).unwrap();
assert_eq!(params.target_pane_id, None);
assert_eq!(params.direction, crate::api::schema::SplitDirection::Down);
@@ -1495,7 +1520,8 @@ mod tests {
#[test]
fn parse_pane_split_args_accepts_pane_option() {
let params =
- parse_pane_split_args(&args(&["--pane", "issue-2", "--direction", "right"])).unwrap();
+ parse_pane_split_args(&args(&["--pane", "issue-2", "--direction", "right"]), None)
+ .unwrap();
assert_eq!(params.target_pane_id, Some("issue-2".into()));
assert_eq!(params.direction, crate::api::schema::SplitDirection::Right);