diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 0892df4513..e76793b4c7 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 { @@ -740,6 +740,45 @@ func findRuntimeSyntaxDef(name string, header *highlight.Header) *highlight.Def return nil } +func resolveIncludes(syndef *highlight.Def) { + includes := highlight.GetIncludes(syndef) + if len(includes) == 0 { + return + } + + 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() { @@ -753,6 +792,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 { @@ -828,7 +869,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 { @@ -909,53 +950,19 @@ func (b *Buffer) UpdateRules() { b.SyntaxDef = findRuntimeSyntaxDef(syntaxFile, header) } - 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 - } + 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 built-in syntax files + b.SyntaxDef = findRuntimeSyntaxDef("default", nil) } - - 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 { + resolveIncludes(b.SyntaxDef) } if b.SyntaxDef != nil { diff --git a/runtime/help/colors.md b/runtime/help/colors.md index d4f6c58652..9a9de716b9 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.