[FEATURE] distinguishing user prompts from assistant responses in long threads
Preflight Checklist
- [x] I have searched existing requests and this feature hasn't been requested yet
- [x] This is a single feature request (not multiple features)
Problem Statement
In long threads, scrolling back to find a specific earlier question requires reading line by line. There's no visual anchor to quickly locate user turns vs assistant turns.
Proposed Solution
Distinct color for user input lines — even a subtle background or foreground difference on the "You:" block would help scanning significantly. The custom theme system exposes briefLabelYou and briefLabelClaude tokens but these only affect the small label, not the full message block.
Keyboard navigation between user turns — a keybinding (e.g. Alt+Up / Alt+Down) to jump directly between user messages in the conversation history, similar to how some terminals let you jump between shell prompts.
Visual separator — a horizontal rule or indentation difference between user and assistant blocks would help even without color changes, and would work across all themes including ANSI/accessible ones.
Configurable color support for user vs assistant message blocks — extend the custom theme system in settings.json to allow users to set distinct foreground/background colors for the entire user message block and assistant message block, not just the label. For example:
{
"theme": {
"userMessageColor": "#a8d8a8",
"assistantMessageColor": "#d8d8d8"
}
}
This would make long threads scannable at a glance without relying on labels alone.
Alternative Solutions
_No response_
Priority
Medium - Would be very helpful
Feature Category
Configuration and settings
Use Case Example
_No response_
Additional Context
_No response_
3 Comments
Seconded.
Adding some concrete findings from tracing the TUI render in v2.1.217, in case it helps scope this. The themeable surface for user turns is even thinner than it looks:
userMessageBackground(plus its hover variant). Everything else is shared.userMessageexists as a theme key but is referenced zero times in the render code, so setting it does nothing. It looks like a dead token.>chevron) is drawn with the sharedsubtletoken, and the body text with the sharedtexttoken, so neither can be recolored for user turns without recoloring dimmed text / all text across the whole UI.briefLabelYou/briefLabelClaudeonly render in the "brief" layout, and I could not find any user setting or keybinding to switch into that layout, so in the normal full layout those labels never appear.userMessageBackgroundis an opaque fill. On a semi-transparent terminal it paints a solid block that breaks the transparency, so it is not a clean way to mark turns for that setup.marginTop(outside the background, so it is never painted), and the message box has noborderBottom, so a rule or underline cannot be themed in.A minimal set that would fully address this without new UI:
userMessage(or auserMessageColor/assistantMessageColorpair) to actually color the message body text.subtle.borderBottom/ divider token), which would also help ANSI/accessible themes that avoid background fills.Happy to point to exact function locations if that is useful.
Most of this exists today:
userMessageBackgroundtoken that colors the whole background of your messages (not just the label), plusbriefLabelYou. Run/theme→ "New custom theme…" or edit the JSON in~/.claude/themes/. Docs: https://code.claude.com/docs/en/terminal-config#create-a-custom-theme/tui), open the transcript viewer (Ctrl+O) and press{/}to jump to the previous/next user prompt. Docs: https://code.claude.com/docs/en/interactive-modeHope that helps make long threads scannable.
🤖 Generated with Claude Code