@@ -21,6 +21,8 @@ import classes from './CodeEditor.module.css'
2121// ask monaco-editor/react to use our own Monaco instance.
2222configureMonacoLoader ( )
2323
24+ const defaultTabSize = 4
25+
2426export 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
0 commit comments