diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-30 19:37:17 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-30 19:38:03 +0300 |
| commit | c71c6c108245b91f6478d95a3abf9a9a9e2e57a9 (patch) | |
| tree | 5475b2c656295f1d987ad884e2a3b6b25fabbffc | |
| parent | 2548acea155de392aac7ce4f638754e2972da69a (diff) | |
fix: resolve split current from caller pane
refs #902
| -rw-r--r-- | docs/next/CHANGELOG.md | 1 | ||||
| -rw-r--r-- | docs/next/website/src/content/docs/cli-reference.mdx | 5 | ||||
| -rw-r--r-- | src/cli/pane.rs | 50 |
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); |
