Commit Graph

14209 Commits

Author SHA1 Message Date
Mitchell Hashimoto
853fee9496 terminal: when semantic cursor is prompt, assume newline is prompt
This works around Fish (at least v4.2) having a non-compliant OSC133 
implementation paired with not having the hooks to fix this via shell
integration. We have to instead resort to heuristics in the terminal
emulator. Womp, womp.

The issue is that Fish does not emit OSC133 secondary prompt (`k=s`)
markers at the beginning of continuation lines. And, since Fish doesn't
provide a PS2-equivalent, we can't do this via shell integration.

We fix this by assuming on newline (`\n`) that a cursor that is already
painting prompt cells is continuing a prior prompt line, and
pre-emptively mark it as a prompt line. But this has two further issues
we have to work around:

  1. Newline/index (`\n`) is one of the _hottest path_ functions in
     terminal emulation. It sucks to add any new conditional logic here.
     We do our best to gate this on unlikely conditions that the branch
     predictor can easily optimize away.

  2. Fish also emits these for auto-complete hints that may be deleted 
     later. So, we also have to handle the scenario where a prompt is 
     continued, then replaced by command output, and fix up the prompt 
     continuation flag to go back to output mode.

Point 2 is ALMOST automatically handled, because Fish does emit a `CSI J`
(erase display below) to erase the auto-complete hint. This resets all
our rows back to output rows. **Unfortunately**, Fish emits `\n` before
triggering the preexec hooks which set OSC133C. So we get the newline
logic FIRST (sets the prompt line), THEN sets the output cursor. If they
switched ordering here everything would just work (with the one
heuristic). But now, we need two!

To address this, I put some extra heuristic logic in the OSC133C
(output starting) handler: if our row is marked as a prompt AND our 
cursor is at x=0, we assume that the prompt continuation was deleted
and we unmark it. 

I put the heuristic logic dependent on OSC133C because that's way colder
of a path than putting something in `printCell` (which is the actual
hottest path in Ghostty).

We could get more rigorous here by also checking if every cell is empty
but that doesn't seem to be necessary at this time for any Fish version
I've tested. I hope thats correct.

I'd really love for Fish to improve their OSC133 implementation to
conform more closely to the terminal-wg spec, but we're going to need
these workarounds indefinitely to handle older Fish versions anyway.
2026-01-31 20:45:01 -08:00
Mitchell Hashimoto
92d6dde583 shell-integration/zsh: set proper input and secondary prompt marks 2026-01-31 19:34:02 -08:00
Mitchell Hashimoto
918c2934a3 terminal: add redraw=last for bash for OSC133 2026-01-31 15:26:14 -08:00
Mitchell Hashimoto
4bee8202a8 shell-integration/bash: mark each line in multiline prompts as secondary
Insert OSC 133 A k=s marks after each newline in PS1, so that all lines
following the first are marked as secondary prompts. This prevents ghostty
from erasing leading lines during terminal resize.
2026-01-31 14:46:18 -08:00
Mitchell Hashimoto
e7e3903151 inspector: show if we've seen semantic content in screen 2026-01-31 13:41:54 -08:00
Mitchell Hashimoto
f14a1306cd renderer: semantic prompt overlay 2026-01-31 13:31:40 -08:00
Mitchell Hashimoto
a4b7a766fe PR review 2026-01-31 11:03:21 -08:00
Mitchell Hashimoto
c3e15a5cb6 terminal: rename semantic prompt 2026-01-31 11:01:03 -08:00
Mitchell Hashimoto
5f77b0ed98 terminal: remove old semantic_prompt 2026-01-31 11:01:03 -08:00
Mitchell Hashimoto
1b2376d366 terminal: remove last semantic_prompt usage from Terminal 2026-01-31 11:01:03 -08:00
Mitchell Hashimoto
10bc88766b terminal: soft wrap preserves new semantic prompt state 2026-01-31 11:01:03 -08:00
Mitchell Hashimoto
917a42876e terminal: cursorIsAtPrompt uses new APIs 2026-01-31 11:01:03 -08:00
Mitchell Hashimoto
112db8211d terminal: remove clearPrompt and integrate it into resize 2026-01-31 11:01:03 -08:00
Mitchell Hashimoto
0f05c2b71a terminal: fix resize test to use new semantic prompt logic 2026-01-31 11:01:03 -08:00
Mitchell Hashimoto
3aaafa2dda terminal: Screen testWriteString should set prompt_continuation for soft 2026-01-31 11:01:03 -08:00
Mitchell Hashimoto
047914c7b5 terminal: promptPath uses new semantic_prompt logic 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
ed0979cb0c terminal: selectOutput uses new semantic prompt logic 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
142f8ca6db terminal: Screen.selectLine uses new semantic boundaries 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
b62ac468dc terminal: change Screen.resize to take an options struct 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
07dce38cc5 terminal: Screen tracks semantic content seen 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
fd016fdb2a terminal: move cursor semantic content functions into Screen 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
4dd5df6c05 terminal: PageList.highlightSemanticContent 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
f9aa759767 terminal: promptIterator needs to respect limits 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
c74889124a terminal: PageList uses new semantic_prompt2 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
123e4ea325 terminal: PageList delta_prompt scroll uses new promptIterator 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
3c0fe02238 terminal: PageList.promptIterator 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
a80b3f34c0 terminal: add semantic_prompt2 to Row to track prompt state 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
84cfb9de1c restore old marking behavior so everything keeps working 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
ae65998d5b terminal: OSC 133;I 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
4d555f878e terminal: OSC 133 N 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
af12241d88 terminal: OSC 133 P 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
acd7a448e1 terminal: OSC 133 B handling 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
3fa6320478 terminal: handle fresh_line_new_prompt 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
24bf642bdc terminal: start implementing proper semantic prompt behaviors 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
7a69e2bf86 terminal: printCell writes with the current pen's content type 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
487b84da0e terminal: add semantic_content enum to cell 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
8d1d17e00f Inspector Revamp (#10509)
I'm going to keep this PR description brief, because there's a lot more
work I want to do here. And when I do it I'll talk more about it. But
this basically rewrites the inspector. It has almost all the same
functionality (missing one from the old inspector -- cell picking). But
it is organized in a much cleaner way and the memory management is also
a lot more clean. We also expose a LOT more details about things like
PageList and screens.

There are plenty of bugs and polish issues here. But going to merge this
because the inspector isn't a hot path item for people and a review of
this is not really possible. Plus it paves the way to more debug
overlays.
2026-01-31 10:21:51 -08:00
Mitchell Hashimoto
fb8cb162ce macos: Ghostty.Inspector 2026-01-31 09:22:26 -08:00
Mitchell Hashimoto
513b55e0a4 inspector: always render the surface when the inspector is opened 2026-01-31 09:14:29 -08:00
Mitchell Hashimoto
dc2cca6490 inspector: renderer panel 2026-01-31 09:06:07 -08:00
Mitchell Hashimoto
400d17aa0d inspector: remove cell picker 2026-01-31 08:47:15 -08:00
Mitchell Hashimoto
3793188e38 inspector: termio revamp 2026-01-31 08:47:15 -08:00
Mitchell Hashimoto
75eac6e3ea terminal: stream handleManually => vtRaw 2026-01-31 08:47:15 -08:00
Mitchell Hashimoto
4fa2dab20d inspector: clean up termio layouts 2026-01-31 08:47:15 -08:00
Mitchell Hashimoto
32ac82c66f inspector: no longer holds surface pointer 2026-01-31 08:47:15 -08:00
Mitchell Hashimoto
3e825dd608 inspector: clean up Inspector 2026-01-31 08:47:15 -08:00
Mitchell Hashimoto
e9439533a7 inspector: prettify keyboard stream 2026-01-31 08:47:15 -08:00
Mitchell Hashimoto
caf301d548 inspector: move termio to dedicated widget 2026-01-31 08:47:14 -08:00
Mitchell Hashimoto
b2c8cdbc90 inspector: key events 2026-01-31 08:47:14 -08:00
Mitchell Hashimoto
9056fa7fd1 inspector: cell inspector 2026-01-31 08:47:14 -08:00