Change:
Follow up for cmd+up/down on macOS should show some indication of the line that was scrolled to. This will need some upstream changes.
testing if i have a few empty lines such as this: ! pressing appears to do nothing, so having some indication of where I am would be great.
yeah I would have liked to get this in but was a bit randomized this iteration.
Blocked on
Brought this to UX sync with a focus border outline that fades to 0 opacity over 2 seconds. But after it occurred to me that navigating the a symbol in the editor is the exact idea we're trying to get across which flashes a focus border briefly without animating. So going with that to align, we can change both if we want to tweak it: !
Using 350ms:
!

Discussion:
.terminal-command-decoration.default { pointer-events: none; } <ins> .terminal-scroll-highlight { left: 0; right: 0; border: 1px solid #ffffff; } </ins>

import { Disposable } from 'vs/base/common/lifecycle'; import { ICommandTracker } from 'vs/workbench/contrib/terminal/browser/terminal'; import { ICommandDetectionCapability, IPartialCommandDetectionCapability, ITerminalCapabilityStore, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities'; <del> import type { Terminal, IMarker, ITerminalAddon } from 'xterm'; </del> <ins> import type { Terminal, IMarker, ITerminalAddon, IDecoration } from 'xterm'; import { timeout } from 'vs/base/common/async'; import { IColorTheme, ICssStyleCollector, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { focusBorder } from 'vs/platform/theme/common/colorRegistry'; </ins> enum Boundary { Top,

private _selectionStart: IMarker | Boundary | null = null; private _isDisposable: boolean = false; protected _terminal: Terminal | undefined; <ins> private _navigationDecoration: IDecoration | undefined; </ins> private _commandDetection?: ICommandDetectionCapability | IPartialCommandDetectionCapability;

const line = this._getTargetScrollLine(this._terminal, marker, position); this._terminal.scrollToLine(line); } <ins> this._navigationDecoration?.dispose(); const decoration = this._terminal.registerDecoration({ marker, width: this._terminal.cols }); this._navigationDecoration = decoration; if (decoration) { let isRendered = false; decoration.onRender(element => { if (!isRendered) { // TODO: Remove when https://github.com/xtermjs/xterm.js/issues/3686 is fixed if (!element.classList.contains('xterm-decoration-overview-ruler')) { element.classList.add('terminal-scroll-highlight'); } } }); decoration.onDispose(() => { if (decoration === this._navigationDecoration) { this._navigationDecoration = undefined; } }); // Number picked to align with symbol highlight in the editor timeout(350).then(() => { decoration.dispose(); }); } </ins> } private _getTargetScrollLine(terminal: Terminal, marker: IMarker, position: ScrollPosition) {

return this._getCommandMarkers().length; } } <ins> registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { const focusBorderColor = theme.getColor(focusBorder); if (focusBorderColor) { collector.addRule(`.terminal-scroll-highlight { border-color: ${focusBorderColor.toString()}; } `); } }); </ins>