T34: prompts and commands carry OSC 133 marks: the tap reads every OSC body and hands 133's marks to the session, which keeps its last command's status; zsh, bash, fish and PowerShell mark what the shell leaves unmarked, and the user's prompt still sees the status
CI / platforms (ubuntu-24.04) (push) Successful in 1m2s
CI / platforms (windows-latest) (push) Successful in 1m45s
CI / macos (push) Successful in 12m10s

This commit is contained in:
ZacharyZhang-NY committed 2026-10-16 22:16:50 -04:00
1 parent cccfb2c82b
commit c53b540f42
18 files changed
+359 -88

No files matched your search

+4 -47
View File
@@ -7,7 +7,7 @@ use ely_gpui_component::{
typography::Caption,
};
use gpui::{
Action, App, AppContext, Context, Entity, EntityId, FocusHandle, Focusable, InteractiveElement,
Action, App, AppContext, Context, Entity, FocusHandle, Focusable, InteractiveElement,
IntoElement, KeyBinding, ParentElement, Render, SharedString, StatefulInteractiveElement,
StyleRefinement, Styled, Subscription, Window, actions, div, prelude::FluentBuilder,
};
@@ -20,12 +20,13 @@ use crate::{
sessions::{self, Session},
settings::{PanelTab, Settings, SettingsStore, StartIn, window::OpenSettings},
term::{
Events, Launch, Pty, TerminalEvent, TerminalView, config,
Events, Launch, Pty, TerminalView, config,
shell::{ShellIntegration, launch},
spawn,
},
};
mod events;
mod widths;
use widths::{Dragged, Side};
@@ -153,6 +154,7 @@ impl Workspace {
folder: launch.cwd,
reports: launch.reports,
bell: false,
status: None,
_events: events,
});
}
@@ -242,51 +244,6 @@ impl Workspace {
}
}
fn session_event(
&mut self,
id: EntityId,
event: &TerminalEvent,
window: &mut Window,
cx: &mut Context<Self>,
) {
let Some(index) = self
.sessions
.iter()
.position(|session| session.terminal.entity_id() == id)
else {
return;
};
let session = &mut self.sessions[index];
match event {
TerminalEvent::Title(title) => session.title.clone_from(title),
TerminalEvent::Folder(folder) => {
session.folder.clone_from(folder);
session.reports = true;
if index == self.active {
self.files.update(cx, |files, cx| files.show(folder, cx));
self.git.update(cx, |git, cx| git.show(folder, cx));
}
}
TerminalEvent::Bell if index != self.active => {
if !session.bell {
log::debug!("app: a bell in hidden session {}", index + 1);
}
session.bell = true;
}
TerminalEvent::Bell => {}
TerminalEvent::Exited(status) => {
let pid = session.terminal.read(cx).pid();
log::info!("app: session {pid}'s program ended, {status}");
self.close(index, window, cx);
return;
}
}
if index == self.active {
self.retitle(window);
}
cx.notify();
}
/// Shows or hides a side column, as the settings keep it.
fn toggle(&mut self, flip: fn(&mut Settings), cx: &mut Context<Self>) {
match SettingsStore::update(cx, flip) {