Skip to content

Commit 0b2c2eb

Browse files
authored
feat: make tab size configurable (#442)
* feat: make tab size configurable * fix: ensure default tab size present
1 parent 084751f commit 0b2c2eb

File tree

3 files changed

+53
-11
lines changed

3 files changed

+53
-11
lines changed

web/src/components/features/settings/SettingsModal.tsx

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ const modalStyles = {
4949
const pivotStyles: Partial<IPivotStyles> = {
5050
itemContainer: {
5151
// Set height to highest of pivots. See: #371
52-
minHeight: 490,
52+
minHeight: 567,
5353
},
5454
}
5555

@@ -223,6 +223,25 @@ class SettingsModal extends ThemeableComponent<Props, SettingsModalState> {
223223
/>
224224
}
225225
/>
226+
<SettingsProperty
227+
key="tabSize"
228+
title="Tab Size"
229+
description="The number of spaces a tab is equal to."
230+
control={
231+
<TextField
232+
type="number"
233+
min={1}
234+
max={12}
235+
defaultValue={`${this.props.monaco?.tabSize ?? 4}`}
236+
onChange={(_, val) => {
237+
const tabSize = Number(val)
238+
if (!isNaN(tabSize)) {
239+
this.touchMonacoProperty('tabSize', tabSize)
240+
}
241+
}}
242+
/>
243+
}
244+
/>
226245
<SettingsProperty
227246
key="smoothScroll"
228247
title="Smooth Scrolling"

web/src/components/features/workspace/CodeEditor/CodeEditor.tsx

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import classes from './CodeEditor.module.css'
2121
// ask monaco-editor/react to use our own Monaco instance.
2222
configureMonacoLoader()
2323

24+
const defaultTabSize = 4
25+
2426
export interface CodeEditorState {
2527
code?: string
2628
loading?: boolean
@@ -59,7 +61,25 @@ class CodeEditorView extends React.Component<Props> {
5961
)
6062
}, 1000)
6163

64+
private configureEditorOverrides(editor: monaco.editor.IStandaloneCodeEditor) {
65+
const { tabSize = defaultTabSize, fontSize } = this.props.options
66+
const opts: Parameters<monaco.editor.IStandaloneCodeEditor['updateOptions']>[0] = {
67+
detectIndentation: false, // required to override tab sizes
68+
tabSize,
69+
}
70+
71+
// Font should be set only once during boot as when font size changes
72+
// by zoom and editor config object is updated - this cause infinite
73+
// font change calls with random values.
74+
if (fontSize) {
75+
opts.fontSize = fontSize
76+
}
77+
78+
editor.updateOptions(opts)
79+
}
80+
6281
editorDidMount(editor: monaco.editor.IStandaloneCodeEditor, monacoInstance: Monaco) {
82+
this.configureEditorOverrides(editor)
6383
this.syntaxChecker = new GoSyntaxChecker(this.props.dispatch)
6484
const [langWorker, workerDisposer] = spawnLanguageWorker()
6585

@@ -73,15 +93,6 @@ class CodeEditorView extends React.Component<Props> {
7393
this.vimAdapter = vimAdapter
7494
this.vimCommandAdapter = statusAdapter
7595

76-
// Font should be set only once during boot as when font size changes
77-
// by zoom and editor config object is updated - this cause infinite
78-
// font change calls with random values.
79-
if (this.props.options.fontSize) {
80-
editor.updateOptions({
81-
fontSize: this.props.options.fontSize,
82-
})
83-
}
84-
8596
if (this.props.vimModeEnabled) {
8697
console.log('Vim mode enabled')
8798
this.vimAdapter.attach()
@@ -133,7 +144,8 @@ class CodeEditorView extends React.Component<Props> {
133144
}
134145

135146
componentDidUpdate(prevProps: Props) {
136-
if (prevProps.projectId !== this.props.projectId) {
147+
const projectChanged = prevProps.projectId !== this.props.projectId
148+
if (projectChanged) {
137149
this.metadataCache.flush()
138150
}
139151

@@ -142,6 +154,15 @@ class CodeEditorView extends React.Component<Props> {
142154
this.updateModelMarkers()
143155
}
144156

157+
// HACK: tab size field in prevProps might be a new val instead of prev.
158+
// Workaround by comparing a reference.
159+
const configChanged = prevProps.options !== this.props.options
160+
if (configChanged) {
161+
this.editor?.updateOptions({
162+
tabSize: this.props.options.tabSize ?? defaultTabSize,
163+
})
164+
}
165+
145166
this.applyVimModeChanges(prevProps)
146167
}
147168

web/src/services/config/monaco.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { DEFAULT_FONT } from '../fonts'
33
export interface MonacoSettings {
44
fontFamily: string
55
fontSize?: number
6+
tabSize: number
67
fontLigatures: boolean
78
cursorBlinking: 'blink' | 'smooth' | 'phase' | 'expand' | 'solid'
89
cursorStyle: 'line' | 'block' | 'underline' | 'line-thin' | 'block-outline' | 'underline-thin'
@@ -24,4 +25,5 @@ export const defaultMonacoSettings: MonacoSettings = {
2425
contextMenu: true,
2526
smoothScrolling: true,
2627
mouseWheelZoom: true,
28+
tabSize: 4,
2729
}

0 commit comments

Comments
 (0)