Skip to content

Commit 94acd2c

Browse files
authored
Change the default of editor.renderFinalNewline to dimmed on Linux (#168220)
Fixes #141169: Change the default of `editor.renderFinalNewline` to `dimmed` on Linux
1 parent 2b642e1 commit 94acd2c

File tree

5 files changed

+45
-31
lines changed

5 files changed

+45
-31
lines changed

src/vs/editor/browser/config/migrateOptions.ts

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ registerSimpleEditorSettingMigration('hover', [[true, { enabled: true }], [false
8989
registerSimpleEditorSettingMigration('parameterHints', [[true, { enabled: true }], [false, { enabled: false }]]);
9090
registerSimpleEditorSettingMigration('autoIndent', [[false, 'advanced'], [true, 'full']]);
9191
registerSimpleEditorSettingMigration('matchBrackets', [[true, 'always'], [false, 'never']]);
92+
registerSimpleEditorSettingMigration('renderFinalNewline', [[true, 'on'], [false, 'off']]);
9293

9394
registerEditorSettingMigration('autoClosingBrackets', (value, read, write) => {
9495
if (value === false) {

src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts

+34-24
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import { Position } from 'vs/editor/common/core/position';
1111
import { RenderingContext } from 'vs/editor/browser/view/renderingContext';
1212
import { ViewContext } from 'vs/editor/common/viewModel/viewContext';
1313
import * as viewEvents from 'vs/editor/common/viewEvents';
14+
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
15+
import { editorDimmedLineNumber, editorLineNumbers } from 'vs/editor/common/core/editorColorRegistry';
1416

1517
export class LineNumbersOverlay extends DynamicViewOverlay {
1618

@@ -21,7 +23,7 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
2123
private _lineHeight!: number;
2224
private _renderLineNumbers!: RenderLineNumbersType;
2325
private _renderCustomLineNumbers!: ((lineNumber: number) => string) | null;
24-
private _renderFinalNewline!: boolean;
26+
private _renderFinalNewline!: 'off' | 'on' | 'dimmed';
2527
private _lineNumbersLeft!: number;
2628
private _lineNumbersWidth!: number;
2729
private _lastCursorModelPosition: Position;
@@ -140,40 +142,38 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
140142
const lineHeightClassName = (platform.isLinux ? (this._lineHeight % 2 === 0 ? ' lh-even' : ' lh-odd') : '');
141143
const visibleStartLineNumber = ctx.visibleRange.startLineNumber;
142144
const visibleEndLineNumber = ctx.visibleRange.endLineNumber;
143-
const common = '<div class="' + LineNumbersOverlay.CLASS_NAME + lineHeightClassName + '" style="left:' + this._lineNumbersLeft + 'px;width:' + this._lineNumbersWidth + 'px;">';
144145

145146
const lineCount = this._context.viewModel.getLineCount();
146147
const output: string[] = [];
147148
for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {
148149
const lineIndex = lineNumber - visibleStartLineNumber;
149150

150-
if (!this._renderFinalNewline) {
151-
if (lineNumber === lineCount && this._context.viewModel.getLineLength(lineNumber) === 0) {
152-
// Do not render last (empty) line
153-
output[lineIndex] = '';
154-
continue;
155-
}
151+
const renderLineNumber = this._getLineRenderLineNumber(lineNumber);
152+
153+
if (!renderLineNumber) {
154+
output[lineIndex] = '';
155+
continue;
156156
}
157157

158-
const renderLineNumber = this._getLineRenderLineNumber(lineNumber);
158+
let extraClassName = '';
159159

160-
if (renderLineNumber) {
161-
if (lineNumber === this._activeLineNumber) {
162-
output[lineIndex] = (
163-
'<div class="active-line-number ' + LineNumbersOverlay.CLASS_NAME + lineHeightClassName + '" style="left:' + this._lineNumbersLeft + 'px;width:' + this._lineNumbersWidth + 'px;">'
164-
+ renderLineNumber
165-
+ '</div>'
166-
);
167-
} else {
168-
output[lineIndex] = (
169-
common
170-
+ renderLineNumber
171-
+ '</div>'
172-
);
160+
if (lineNumber === lineCount && this._context.viewModel.getLineLength(lineNumber) === 0) {
161+
// this is the last line
162+
if (this._renderFinalNewline === 'off') {
163+
output[lineIndex] = '';
164+
continue;
173165
}
174-
} else {
175-
output[lineIndex] = '';
166+
if (this._renderFinalNewline === 'dimmed') {
167+
extraClassName = ' dimmed-line-number';
168+
}
169+
}
170+
if (lineNumber === this._activeLineNumber) {
171+
extraClassName = ' active-line-number';
176172
}
173+
174+
output[lineIndex] = (
175+
`<div class="${LineNumbersOverlay.CLASS_NAME}${lineHeightClassName}${extraClassName}" style="left:${this._lineNumbersLeft}px;width:${this._lineNumbersWidth}px;">${renderLineNumber}</div>`
176+
);
177177
}
178178

179179
this._renderResult = output;
@@ -190,3 +190,13 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
190190
return this._renderResult[lineIndex];
191191
}
192192
}
193+
194+
registerThemingParticipant((theme, collector) => {
195+
const editorLineNumbersColor = theme.getColor(editorLineNumbers);
196+
const editorDimmedLineNumberColor = theme.getColor(editorDimmedLineNumber);
197+
if (editorDimmedLineNumberColor) {
198+
collector.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${editorDimmedLineNumberColor}; }`);
199+
} else if (editorLineNumbersColor) {
200+
collector.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${editorLineNumbersColor.transparent(0.4)}; }`);
201+
}
202+
});

src/vs/editor/common/config/editorOptions.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@ export interface IEditorOptions {
9797
cursorSurroundingLinesStyle?: 'default' | 'all';
9898
/**
9999
* Render last line number when the file ends with a newline.
100-
* Defaults to true.
100+
* Defaults to 'on' for Windows and macOS and 'dimmed' for Linux.
101101
*/
102-
renderFinalNewline?: boolean;
102+
renderFinalNewline?: 'on' | 'off' | 'dimmed';
103103
/**
104104
* Remove unusual line terminators like LINE SEPARATOR (LS), PARAGRAPH SEPARATOR (PS).
105105
* Defaults to 'prompt'.
@@ -5262,8 +5262,10 @@ export const EditorOptions = {
52625262
EditorOption.renderControlCharacters, 'renderControlCharacters', true,
52635263
{ description: nls.localize('renderControlCharacters', "Controls whether the editor should render control characters."), restricted: true }
52645264
)),
5265-
renderFinalNewline: register(new EditorBooleanOption(
5266-
EditorOption.renderFinalNewline, 'renderFinalNewline', true,
5265+
renderFinalNewline: register(new EditorStringEnumOption(
5266+
EditorOption.renderFinalNewline, 'renderFinalNewline',
5267+
(platform.isLinux ? 'dimmed' : 'on') as 'off' | 'on' | 'dimmed',
5268+
['off', 'on', 'dimmed'] as const,
52675269
{ description: nls.localize('renderFinalNewline', "Render last line number when the file ends with a newline.") }
52685270
)),
52695271
renderLineHighlight: register(new EditorStringEnumOption(

src/vs/editor/common/core/editorColorRegistry.ts

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const editorLineNumbers = registerColor('editorLineNumber.foreground', {
2727

2828
const deprecatedEditorActiveLineNumber = registerColor('editorActiveLineNumber.foreground', { dark: '#c6c6c6', light: '#0B216F', hcDark: activeContrastBorder, hcLight: activeContrastBorder }, nls.localize('editorActiveLineNumber', 'Color of editor active line number'), false, nls.localize('deprecatedEditorActiveLineNumber', 'Id is deprecated. Use \'editorLineNumber.activeForeground\' instead.'));
2929
export const editorActiveLineNumber = registerColor('editorLineNumber.activeForeground', { dark: deprecatedEditorActiveLineNumber, light: deprecatedEditorActiveLineNumber, hcDark: deprecatedEditorActiveLineNumber, hcLight: deprecatedEditorActiveLineNumber }, nls.localize('editorActiveLineNumber', 'Color of editor active line number'));
30+
export const editorDimmedLineNumber = registerColor('editorLineNumber.dimmedForeground', { dark: null, light: null, hcDark: null, hcLight: null }, nls.localize('editorDimmedLineNumber', 'Color of the final editor line when editor.renderFinalNewline is set to dimmed.'));
3031

3132
export const editorRuler = registerColor('editorRuler.foreground', { dark: '#5A5A5A', light: Color.lightgrey, hcDark: Color.white, hcLight: '#292929' }, nls.localize('editorRuler', 'Color of the editor rulers.'));
3233

src/vs/monaco.d.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3058,9 +3058,9 @@ declare namespace monaco.editor {
30583058
cursorSurroundingLinesStyle?: 'default' | 'all';
30593059
/**
30603060
* Render last line number when the file ends with a newline.
3061-
* Defaults to true.
3061+
* Defaults to 'on' for Windows and macOS and 'dimmed' for Linux.
30623062
*/
3063-
renderFinalNewline?: boolean;
3063+
renderFinalNewline?: 'on' | 'off' | 'dimmed';
30643064
/**
30653065
* Remove unusual line terminators like LINE SEPARATOR (LS), PARAGRAPH SEPARATOR (PS).
30663066
* Defaults to 'prompt'.
@@ -4787,7 +4787,7 @@ declare namespace monaco.editor {
47874787
readOnly: IEditorOption<EditorOption.readOnly, boolean>;
47884788
renameOnType: IEditorOption<EditorOption.renameOnType, boolean>;
47894789
renderControlCharacters: IEditorOption<EditorOption.renderControlCharacters, boolean>;
4790-
renderFinalNewline: IEditorOption<EditorOption.renderFinalNewline, boolean>;
4790+
renderFinalNewline: IEditorOption<EditorOption.renderFinalNewline, 'on' | 'off' | 'dimmed'>;
47914791
renderLineHighlight: IEditorOption<EditorOption.renderLineHighlight, 'all' | 'line' | 'none' | 'gutter'>;
47924792
renderLineHighlightOnlyWhenFocus: IEditorOption<EditorOption.renderLineHighlightOnlyWhenFocus, boolean>;
47934793
renderValidationDecorations: IEditorOption<EditorOption.renderValidationDecorations, 'on' | 'off' | 'editable'>;

0 commit comments

Comments
 (0)