From 5610d01e08675e290af4f5c9bcf6fd090beb50c8 Mon Sep 17 00:00:00 2001 From: Dmytro Maluka Date: Thu, 18 Apr 2024 22:39:16 +0200 Subject: [PATCH 1/6] UpdateRules: fix `set filetype unknown` Fix `set filetype unknown` not working as expected in the following scenario: 1. open foo.txt (no filetype detected) -> ft is `unknown`, highlighted with default.yaml, as expected 2. `set filetype go` -> ft is `go`, highlighted with go.yaml as expected 3. `set filetype unknown` -> ft is still `go`, still highlighted with go.yaml (whereas expected behavior is: ft is `unknown`, highlighted with default.yaml) Fix that by always updating b.SyntaxDef value, not reusing the old one. This also makes the code simpler and easier to understand. --- internal/buffer/buffer.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 0892df45..e46905c3 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -753,6 +753,8 @@ func (b *Buffer) UpdateRules() { return } + b.SyntaxDef = nil + // syntaxFileInfo is an internal helper structure // to store properties of one single syntax file type syntaxFileInfo struct { @@ -945,16 +947,14 @@ func (b *Buffer) UpdateRules() { highlight.ResolveIncludes(b.SyntaxDef, files) } - if b.Highlighter == nil || syntaxFile != "" { - if b.SyntaxDef != nil { - b.Settings["filetype"] = b.SyntaxDef.FileType - } else { - // search for the default file in the user's custom syntax files - b.SyntaxDef = findRealRuntimeSyntaxDef("default", nil) - if b.SyntaxDef == nil { - // search for the default file in the runtime files - b.SyntaxDef = findRuntimeSyntaxDef("default", nil) - } + if b.SyntaxDef != nil { + b.Settings["filetype"] = b.SyntaxDef.FileType + } else { + // search for the default file in the user's custom syntax files + b.SyntaxDef = findRealRuntimeSyntaxDef("default", nil) + if b.SyntaxDef == nil { + // search for the default file in the runtime files + b.SyntaxDef = findRuntimeSyntaxDef("default", nil) } } From a436dae5874cec5e7dddb502445049783ffab049 Mon Sep 17 00:00:00 2001 From: Dmytro Maluka Date: Thu, 18 Apr 2024 23:29:33 +0200 Subject: [PATCH 2/6] UpdateRules: allow includes in default.yaml --- internal/buffer/buffer.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index e46905c3..a68a64bb 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -911,6 +911,17 @@ func (b *Buffer) UpdateRules() { b.SyntaxDef = findRuntimeSyntaxDef(syntaxFile, header) } + if b.SyntaxDef != nil { + b.Settings["filetype"] = b.SyntaxDef.FileType + } else { + // search for the default file in the user's custom syntax files + b.SyntaxDef = findRealRuntimeSyntaxDef("default", nil) + if b.SyntaxDef == nil { + // search for the default file in the runtime files + b.SyntaxDef = findRuntimeSyntaxDef("default", nil) + } + } + if b.SyntaxDef != nil && highlight.HasIncludes(b.SyntaxDef) { includes := highlight.GetIncludes(b.SyntaxDef) @@ -947,17 +958,6 @@ func (b *Buffer) UpdateRules() { highlight.ResolveIncludes(b.SyntaxDef, files) } - if b.SyntaxDef != nil { - b.Settings["filetype"] = b.SyntaxDef.FileType - } else { - // search for the default file in the user's custom syntax files - b.SyntaxDef = findRealRuntimeSyntaxDef("default", nil) - if b.SyntaxDef == nil { - // search for the default file in the runtime files - b.SyntaxDef = findRuntimeSyntaxDef("default", nil) - } - } - if b.SyntaxDef != nil { b.Highlighter = highlight.NewHighlighter(b.SyntaxDef) if b.Settings["syntax"].(bool) { From 3aed20fde98819fe782eecfe54b7f34940382c58 Mon Sep 17 00:00:00 2001 From: Dmytro Maluka Date: Fri, 19 Apr 2024 00:10:58 +0200 Subject: [PATCH 3/6] UpdateRules: correct the comments The "runtime" term is ambiguous: it refers to both built-in and user's custom ("real runtime") files. --- internal/buffer/buffer.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index a68a64bb..488b6dd7 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -727,7 +727,7 @@ func findRealRuntimeSyntaxDef(name string, header *highlight.Header) *highlight. } // findRuntimeSyntaxDef finds a specific syntax definition -// in the runtime files +// in the built-in syntax files func findRuntimeSyntaxDef(name string, header *highlight.Header) *highlight.Def { for _, f := range config.ListRuntimeFiles(config.RTSyntax) { if f.Name() == name { @@ -830,7 +830,7 @@ func (b *Buffer) UpdateRules() { } if !foundDef { - // search for the syntax file in the runtime files + // search for the syntax file in the built-in syntax files for _, f := range config.ListRuntimeFiles(config.RTSyntaxHeader) { data, err := f.Data() if err != nil { @@ -917,7 +917,7 @@ func (b *Buffer) UpdateRules() { // search for the default file in the user's custom syntax files b.SyntaxDef = findRealRuntimeSyntaxDef("default", nil) if b.SyntaxDef == nil { - // search for the default file in the runtime files + // search for the default file in the built-in syntax files b.SyntaxDef = findRuntimeSyntaxDef("default", nil) } } From 1bddc8d03e492c1457c9b9706cee64ba7d50bdcb Mon Sep 17 00:00:00 2001 From: Dmytro Maluka Date: Sun, 21 Apr 2024 15:13:03 +0200 Subject: [PATCH 4/6] UpdateRules: move include logic to a helper function --- internal/buffer/buffer.go | 75 +++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 488b6dd7..25fcab86 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -740,6 +740,45 @@ func findRuntimeSyntaxDef(name string, header *highlight.Header) *highlight.Def return nil } +func resolveIncludes(syndef *highlight.Def) { + if !highlight.HasIncludes(syndef) { + return + } + includes := highlight.GetIncludes(syndef) + + var files []*highlight.File + for _, f := range config.ListRuntimeFiles(config.RTSyntax) { + data, err := f.Data() + if err != nil { + screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error()) + continue + } + + header, err := highlight.MakeHeaderYaml(data) + if err != nil { + screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) + continue + } + + for _, i := range includes { + if header.FileType == i { + file, err := highlight.ParseFile(data) + if err != nil { + screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) + continue + } + files = append(files, file) + break + } + } + if len(files) >= len(includes) { + break + } + } + + highlight.ResolveIncludes(syndef, files) +} + // UpdateRules updates the syntax rules and filetype for this buffer // This is called when the colorscheme changes func (b *Buffer) UpdateRules() { @@ -922,40 +961,8 @@ func (b *Buffer) UpdateRules() { } } - if b.SyntaxDef != nil && highlight.HasIncludes(b.SyntaxDef) { - includes := highlight.GetIncludes(b.SyntaxDef) - - var files []*highlight.File - for _, f := range config.ListRuntimeFiles(config.RTSyntax) { - data, err := f.Data() - if err != nil { - screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error()) - continue - } - - header, err := highlight.MakeHeaderYaml(data) - if err != nil { - screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) - continue - } - - for _, i := range includes { - if header.FileType == i { - file, err := highlight.ParseFile(data) - if err != nil { - screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) - continue - } - files = append(files, file) - break - } - } - if len(files) >= len(includes) { - break - } - } - - highlight.ResolveIncludes(b.SyntaxDef, files) + if b.SyntaxDef != nil { + resolveIncludes(b.SyntaxDef) } if b.SyntaxDef != nil { From 08c516c730078f8a850b239a0b3ae215f07afdfa Mon Sep 17 00:00:00 2001 From: Dmytro Maluka Date: Sun, 21 Apr 2024 15:14:21 +0200 Subject: [PATCH 5/6] UpdateRules: optimize out HasIncludes() usage --- internal/buffer/buffer.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 25fcab86..e76793b4 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -741,10 +741,10 @@ func findRuntimeSyntaxDef(name string, header *highlight.Header) *highlight.Def } func resolveIncludes(syndef *highlight.Def) { - if !highlight.HasIncludes(syndef) { + includes := highlight.GetIncludes(syndef) + if len(includes) == 0 { return } - includes := highlight.GetIncludes(syndef) var files []*highlight.File for _, f := range config.ListRuntimeFiles(config.RTSyntax) { From b929c612282a968cfec091e3eb88614449062eed Mon Sep 17 00:00:00 2001 From: Dmytro Maluka Date: Sun, 21 Apr 2024 15:41:49 +0200 Subject: [PATCH 6/6] help/colors: syntax: document that nested includes are not supported --- runtime/help/colors.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/runtime/help/colors.md b/runtime/help/colors.md index d4f6c586..9a9de716 100644 --- a/runtime/help/colors.md +++ b/runtime/help/colors.md @@ -392,3 +392,6 @@ example, the following is possible for html: rules: - include: "css" ``` + +Note that nested include (i.e. including syntax files that include other syntax +files) is not supported yet.