Skip to content

Commit c937479

Browse files
authored
Merge pull request micro-editor#3662 from JoeKar/fix/reload-settings
buffer: Fix `ReloadSettings(true)` for volatile `filetype`
2 parents 5a62a8e + ddc6051 commit c937479

4 files changed

Lines changed: 59 additions & 47 deletions

File tree

internal/action/actions.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1794,24 +1794,24 @@ func (h *BufPane) HalfPageDown() bool {
17941794

17951795
// ToggleDiffGutter turns the diff gutter off and on
17961796
func (h *BufPane) ToggleDiffGutter() bool {
1797-
if !h.Buf.Settings["diffgutter"].(bool) {
1798-
h.Buf.Settings["diffgutter"] = true
1797+
diffgutter := !h.Buf.Settings["diffgutter"].(bool)
1798+
h.Buf.SetOptionNative("diffgutter", diffgutter)
1799+
if diffgutter {
17991800
h.Buf.UpdateDiff()
18001801
InfoBar.Message("Enabled diff gutter")
18011802
} else {
1802-
h.Buf.Settings["diffgutter"] = false
18031803
InfoBar.Message("Disabled diff gutter")
18041804
}
18051805
return true
18061806
}
18071807

18081808
// ToggleRuler turns line numbers off and on
18091809
func (h *BufPane) ToggleRuler() bool {
1810-
if !h.Buf.Settings["ruler"].(bool) {
1811-
h.Buf.Settings["ruler"] = true
1810+
ruler := !h.Buf.Settings["ruler"].(bool)
1811+
h.Buf.SetOptionNative("ruler", ruler)
1812+
if ruler {
18121813
InfoBar.Message("Enabled ruler")
18131814
} else {
1814-
h.Buf.Settings["ruler"] = false
18151815
InfoBar.Message("Disabled ruler")
18161816
}
18171817
return true

internal/buffer/buffer.go

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -325,28 +325,17 @@ func NewBuffer(r io.Reader, size int64, path string, startcursor Loc, btype BufT
325325
b.AbsPath = absPath
326326
b.Path = path
327327

328-
// this is a little messy since we need to know some settings to read
329-
// the file properly, but some settings depend on the filetype, which
330-
// we don't know until reading the file. We first read the settings
331-
// into a local variable and then use that to determine the encoding,
332-
// readonly, and fileformat necessary for reading the file and
333-
// assigning the filetype.
334-
settings := config.DefaultCommonSettings()
335328
b.Settings = config.DefaultCommonSettings()
336329
b.LocalSettings = make(map[string]bool)
337330
for k, v := range config.GlobalSettings {
338331
if _, ok := config.DefaultGlobalOnlySettings[k]; !ok {
339332
// make sure setting is not global-only
340-
settings[k] = v
341333
b.Settings[k] = v
342334
}
343335
}
344-
config.InitLocalSettings(settings, absPath)
345-
b.Settings["readonly"] = settings["readonly"]
346-
b.Settings["filetype"] = settings["filetype"]
347-
b.Settings["syntax"] = settings["syntax"]
336+
config.UpdatePathGlobLocals(b.Settings, absPath)
348337

349-
enc, err := htmlindex.Get(settings["encoding"].(string))
338+
enc, err := htmlindex.Get(b.Settings["encoding"].(string))
350339
if err != nil {
351340
enc = unicode.UTF8
352341
b.Settings["encoding"] = "utf-8"
@@ -366,7 +355,7 @@ func NewBuffer(r io.Reader, size int64, path string, startcursor Loc, btype BufT
366355
if size == 0 {
367356
// for empty files, use the fileformat setting instead of
368357
// autodetection
369-
switch settings["fileformat"] {
358+
switch b.Settings["fileformat"] {
370359
case "unix":
371360
ff = FFUnix
372361
case "dos":
@@ -397,8 +386,8 @@ func NewBuffer(r io.Reader, size int64, path string, startcursor Loc, btype BufT
397386
}
398387

399388
b.UpdateRules()
400-
// init local settings again now that we know the filetype
401-
config.InitLocalSettings(b.Settings, b.Path)
389+
// we know the filetype now, so update per-filetype settings
390+
config.UpdateFileTypeLocals(b.Settings, b.Settings["filetype"].(string))
402391

403392
if _, err := os.Stat(filepath.Join(config.ConfigDir, "buffers")); os.IsNotExist(err) {
404393
os.Mkdir(filepath.Join(config.ConfigDir, "buffers"), os.ModePerm)

internal/buffer/settings.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,13 @@ import (
1212

1313
func (b *Buffer) ReloadSettings(reloadFiletype bool) {
1414
settings := config.ParsedSettings()
15+
config.UpdatePathGlobLocals(settings, b.AbsPath)
1516

16-
if _, ok := b.LocalSettings["filetype"]; !ok && reloadFiletype {
17+
oldFiletype := b.Settings["filetype"].(string)
18+
19+
_, local := b.LocalSettings["filetype"]
20+
_, volatile := config.VolatileSettings["filetype"]
21+
if reloadFiletype && !local && !volatile {
1722
// need to update filetype before updating other settings based on it
1823
b.Settings["filetype"] = "unknown"
1924
if v, ok := settings["filetype"]; ok {
@@ -23,9 +28,14 @@ func (b *Buffer) ReloadSettings(reloadFiletype bool) {
2328

2429
// update syntax rules, which will also update filetype if needed
2530
b.UpdateRules()
26-
settings["filetype"] = b.Settings["filetype"]
2731

28-
config.InitLocalSettings(settings, b.Path)
32+
curFiletype := b.Settings["filetype"].(string)
33+
if oldFiletype != curFiletype {
34+
b.doCallbacks("filetype", oldFiletype, curFiletype)
35+
}
36+
37+
config.UpdateFileTypeLocals(settings, curFiletype)
38+
2939
for k, v := range config.DefaultCommonSettings() {
3040
if k == "filetype" {
3141
// prevent recursion
@@ -117,15 +127,7 @@ func (b *Buffer) DoSetOptionNative(option string, nativeValue interface{}) {
117127
}
118128
}
119129

120-
if b.OptionCallback != nil {
121-
b.OptionCallback(option, nativeValue)
122-
}
123-
124-
if err := config.RunPluginFn("onBufferOptionChanged",
125-
luar.New(ulua.L, b), luar.New(ulua.L, option),
126-
luar.New(ulua.L, oldValue), luar.New(ulua.L, nativeValue)); err != nil {
127-
screen.TermMessage(err)
128-
}
130+
b.doCallbacks(option, oldValue, nativeValue)
129131
}
130132

131133
func (b *Buffer) SetOptionNative(option string, nativeValue interface{}) error {
@@ -152,3 +154,15 @@ func (b *Buffer) SetOption(option, value string) error {
152154

153155
return b.SetOptionNative(option, nativeValue)
154156
}
157+
158+
func (b *Buffer) doCallbacks(option string, oldValue interface{}, newValue interface{}) {
159+
if b.OptionCallback != nil {
160+
b.OptionCallback(option, newValue)
161+
}
162+
163+
if err := config.RunPluginFn("onBufferOptionChanged",
164+
luar.New(ulua.L, b), luar.New(ulua.L, option),
165+
luar.New(ulua.L, oldValue), luar.New(ulua.L, newValue)); err != nil {
166+
screen.TermMessage(err)
167+
}
168+
}

internal/config/settings.go

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -288,22 +288,31 @@ func InitGlobalSettings() error {
288288
return err
289289
}
290290

291-
// InitLocalSettings scans the json in settings.json and sets the options locally based
292-
// on whether the filetype or path matches ft or glob local settings
291+
// UpdatePathGlobLocals scans the already parsed settings and sets the options locally
292+
// based on whether the path matches a glob
293293
// Must be called after ReadSettings
294-
func InitLocalSettings(settings map[string]interface{}, path string) {
294+
func UpdatePathGlobLocals(settings map[string]interface{}, path string) {
295295
for k, v := range parsedSettings {
296-
if strings.HasPrefix(reflect.TypeOf(v).String(), "map") {
297-
if strings.HasPrefix(k, "ft:") {
298-
if settings["filetype"].(string) == k[3:] {
299-
for k1, v1 := range v.(map[string]interface{}) {
300-
settings[k1] = v1
301-
}
296+
if strings.HasPrefix(reflect.TypeOf(v).String(), "map") && !strings.HasPrefix(k, "ft:") {
297+
g, _ := glob.Compile(k)
298+
if g.MatchString(path) {
299+
for k1, v1 := range v.(map[string]interface{}) {
300+
settings[k1] = v1
302301
}
303-
} else {
304-
g, _ := glob.Compile(k)
305-
if g.MatchString(path) {
306-
for k1, v1 := range v.(map[string]interface{}) {
302+
}
303+
}
304+
}
305+
}
306+
307+
// UpdateFileTypeLocals scans the already parsed settings and sets the options locally
308+
// based on whether the filetype matches to "ft:"
309+
// Must be called after ReadSettings
310+
func UpdateFileTypeLocals(settings map[string]interface{}, filetype string) {
311+
for k, v := range parsedSettings {
312+
if strings.HasPrefix(reflect.TypeOf(v).String(), "map") && strings.HasPrefix(k, "ft:") {
313+
if filetype == k[3:] {
314+
for k1, v1 := range v.(map[string]interface{}) {
315+
if k1 != "filetype" {
307316
settings[k1] = v1
308317
}
309318
}

0 commit comments

Comments
 (0)