diff --git a/web/src/components/features/settings/SettingsModal.tsx b/web/src/components/features/settings/SettingsModal.tsx index 5c854afc..fa467667 100644 --- a/web/src/components/features/settings/SettingsModal.tsx +++ b/web/src/components/features/settings/SettingsModal.tsx @@ -49,7 +49,7 @@ const modalStyles = { const pivotStyles: Partial = { itemContainer: { // Set height to highest of pivots. See: #371 - minHeight: 490, + minHeight: 567, }, } @@ -223,6 +223,25 @@ class SettingsModal extends ThemeableComponent { /> } /> + { + const tabSize = Number(val) + if (!isNaN(tabSize)) { + this.touchMonacoProperty('tabSize', tabSize) + } + }} + /> + } + /> { ) }, 1000) + private configureEditorOverrides(editor: monaco.editor.IStandaloneCodeEditor) { + const { tabSize = defaultTabSize, fontSize } = this.props.options + const opts: Parameters[0] = { + detectIndentation: false, // required to override tab sizes + tabSize, + } + + // Font should be set only once during boot as when font size changes + // by zoom and editor config object is updated - this cause infinite + // font change calls with random values. + if (fontSize) { + opts.fontSize = fontSize + } + + editor.updateOptions(opts) + } + editorDidMount(editor: monaco.editor.IStandaloneCodeEditor, monacoInstance: Monaco) { + this.configureEditorOverrides(editor) this.syntaxChecker = new GoSyntaxChecker(this.props.dispatch) const [langWorker, workerDisposer] = spawnLanguageWorker() @@ -73,15 +93,6 @@ class CodeEditorView extends React.Component { this.vimAdapter = vimAdapter this.vimCommandAdapter = statusAdapter - // Font should be set only once during boot as when font size changes - // by zoom and editor config object is updated - this cause infinite - // font change calls with random values. - if (this.props.options.fontSize) { - editor.updateOptions({ - fontSize: this.props.options.fontSize, - }) - } - if (this.props.vimModeEnabled) { console.log('Vim mode enabled') this.vimAdapter.attach() @@ -133,7 +144,8 @@ class CodeEditorView extends React.Component { } componentDidUpdate(prevProps: Props) { - if (prevProps.projectId !== this.props.projectId) { + const projectChanged = prevProps.projectId !== this.props.projectId + if (projectChanged) { this.metadataCache.flush() } @@ -142,6 +154,15 @@ class CodeEditorView extends React.Component { this.updateModelMarkers() } + // HACK: tab size field in prevProps might be a new val instead of prev. + // Workaround by comparing a reference. + const configChanged = prevProps.options !== this.props.options + if (configChanged) { + this.editor?.updateOptions({ + tabSize: this.props.options.tabSize ?? defaultTabSize, + }) + } + this.applyVimModeChanges(prevProps) } diff --git a/web/src/services/config/monaco.ts b/web/src/services/config/monaco.ts index 73dca94b..0a0af49e 100644 --- a/web/src/services/config/monaco.ts +++ b/web/src/services/config/monaco.ts @@ -3,6 +3,7 @@ import { DEFAULT_FONT } from '../fonts' export interface MonacoSettings { fontFamily: string fontSize?: number + tabSize: number fontLigatures: boolean cursorBlinking: 'blink' | 'smooth' | 'phase' | 'expand' | 'solid' cursorStyle: 'line' | 'block' | 'underline' | 'line-thin' | 'block-outline' | 'underline-thin' @@ -24,4 +25,5 @@ export const defaultMonacoSettings: MonacoSettings = { contextMenu: true, smoothScrolling: true, mouseWheelZoom: true, + tabSize: 4, }