From 430da6131458609ba28da7b952349169ec84c873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Wed, 20 Sep 2023 20:25:09 +0200 Subject: [PATCH 01/10] highlighter: Remove EmptyDef since it's superseeded by a nil check of SyntaxDef --- internal/buffer/buffer.go | 2 -- pkg/highlight/highlighter.go | 3 --- 2 files changed, 5 deletions(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 6865fe12..772ee00a 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -908,8 +908,6 @@ func (b *Buffer) UpdateRules() { if b.SyntaxDef != nil { b.Settings["filetype"] = b.SyntaxDef.FileType } - } else { - b.SyntaxDef = &highlight.EmptyDef } if b.SyntaxDef != nil { diff --git a/pkg/highlight/highlighter.go b/pkg/highlight/highlighter.go index 10a78d5c..ebcd2aaa 100644 --- a/pkg/highlight/highlighter.go +++ b/pkg/highlight/highlighter.go @@ -67,9 +67,6 @@ func combineLineMatch(src, dst LineMatch) LineMatch { // A State represents the region at the end of a line type State *region -// EmptyDef is an empty definition. -var EmptyDef = Def{nil, &rules{}} - // LineStates is an interface for a buffer-like object which can also store the states and matches for every line type LineStates interface { LineBytes(n int) []byte From 390794213eaf78c77612e2868a56cf604d840825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Mon, 18 Sep 2023 23:43:25 +0200 Subject: [PATCH 02/10] syntax: Provide default.yaml as fallback definition --- internal/buffer/buffer.go | 24 ++++++++++++++++++++++++ runtime/syntax/default.yaml | 16 ++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 runtime/syntax/default.yaml diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 772ee00a..19b28f0c 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -907,6 +907,30 @@ func (b *Buffer) UpdateRules() { if b.Highlighter == nil || syntaxFile != "" { if b.SyntaxDef != nil { b.Settings["filetype"] = b.SyntaxDef.FileType + } else { + for _, f := range config.ListRuntimeFiles(config.RTSyntax) { + if f.Name() == "default" { + data, err := f.Data() + if err != nil { + screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error()) + continue + } + + file, err := highlight.ParseFile(data) + if err != nil { + screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) + continue + } + + syndef, err := highlight.ParseDef(file, header) + if err != nil { + screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) + continue + } + b.SyntaxDef = syndef + break + } + } } } diff --git a/runtime/syntax/default.yaml b/runtime/syntax/default.yaml new file mode 100644 index 00000000..88397670 --- /dev/null +++ b/runtime/syntax/default.yaml @@ -0,0 +1,16 @@ +filetype: unknown + +detect: + filename: "" + +rules: + # Mails + - special: "[[:alnum:].%_+-]+@[[:alnum:].-]+\\.[[:alpha:]]{2,}" + # URLs + - identifier: "(https?|ftp|ssh)://\\S+\\.\\S+[^])>\\s,.]" + + - comment: + start: "(^|\\s)#" + end: "$" + rules: + - todo: "(TODO|XXX|FIXME):?" From f265179def6f8e4faa360f705a69748807fb4f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Thu, 21 Sep 2023 21:02:01 +0200 Subject: [PATCH 03/10] buffer: Correct error message in case of failed read --- internal/buffer/buffer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 19b28f0c..f3d28e56 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -876,7 +876,7 @@ func (b *Buffer) UpdateRules() { for _, f := range config.ListRuntimeFiles(config.RTSyntax) { data, err := f.Data() if err != nil { - screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) + screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error()) continue } header, err := highlight.MakeHeaderYaml(data) From 2c53d1fcab6a05fa6533f2aabb9af9026542fd7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Fri, 22 Sep 2023 19:28:10 +0200 Subject: [PATCH 04/10] test: Perform DoEvent() as long as normal or draw events are present This is necessary since DoEvent() isn't called in a loop like in the main application, but as one-shot only and a async draw event can lead to ignore the explicit injected events. Additional checks have been added to check the presence of the expected buffers. --- cmd/micro/micro_test.go | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/cmd/micro/micro_test.go b/cmd/micro/micro_test.go index 4c5ca684..cd3dda22 100644 --- a/cmd/micro/micro_test.go +++ b/cmd/micro/micro_test.go @@ -109,7 +109,10 @@ func handleEvent() { if e != nil { screen.Events <- e } - DoEvent() + + for len(screen.DrawChan()) > 0 || len(screen.Events) > 0 { + DoEvent() + } } func injectKey(key tcell.Key, r rune, mod tcell.ModMask) { @@ -151,6 +154,16 @@ func openFile(file string) { injectKey(tcell.KeyEnter, rune(tcell.KeyEnter), tcell.ModNone) } +func findBuffer(file string) *buffer.Buffer { + var buf *buffer.Buffer + for _, b := range buffer.OpenBuffers { + if b.Path == file { + buf = b + } + } + return buf +} + func createTestFile(name string, content string) (string, error) { testf, err := ioutil.TempFile("", name) if err != nil { @@ -190,14 +203,7 @@ func TestSimpleEdit(t *testing.T) { openFile(file) - var buf *buffer.Buffer - for _, b := range buffer.OpenBuffers { - if b.Path == file { - buf = b - } - } - - if buf == nil { + if findBuffer(file) == nil { t.Errorf("Could not find buffer %s", file) return } @@ -236,6 +242,11 @@ func TestMouse(t *testing.T) { openFile(file) + if findBuffer(file) == nil { + t.Errorf("Could not find buffer %s", file) + return + } + // buffer: // base content // the selections need to happen at different locations to avoid a double click @@ -299,6 +310,11 @@ func TestSearchAndReplace(t *testing.T) { openFile(file) + if findBuffer(file) == nil { + t.Errorf("Could not find buffer %s", file) + return + } + injectKey(tcell.KeyCtrlE, rune(tcell.KeyCtrlE), tcell.ModCtrl) injectString(fmt.Sprintf("replaceall %s %s", "foo", "test_string")) injectKey(tcell.KeyEnter, rune(tcell.KeyEnter), tcell.ModNone) From 6ffabd626fe156e8c112f88babf5e6466b8b908c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Sun, 17 Mar 2024 19:40:33 +0100 Subject: [PATCH 05/10] buffer: Let the user override the default.yaml --- internal/buffer/buffer.go | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index f3d28e56..60490dd1 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -908,7 +908,8 @@ func (b *Buffer) UpdateRules() { if b.SyntaxDef != nil { b.Settings["filetype"] = b.SyntaxDef.FileType } else { - for _, f := range config.ListRuntimeFiles(config.RTSyntax) { + // search for the default file in the user's custom syntax files + for _, f := range config.ListRealRuntimeFiles(config.RTSyntax) { if f.Name() == "default" { data, err := f.Data() if err != nil { @@ -916,6 +917,12 @@ func (b *Buffer) UpdateRules() { continue } + header, err = highlight.MakeHeaderYaml(data) + if err != nil { + screen.TermMessage("Error parsing header for syntax file " + f.Name() + ": " + err.Error()) + continue + } + file, err := highlight.ParseFile(data) if err != nil { screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) @@ -931,6 +938,33 @@ func (b *Buffer) UpdateRules() { break } } + + if b.SyntaxDef == nil { + // search for the default file in the runtime files + for _, f := range config.ListRuntimeFiles(config.RTSyntax) { + if f.Name() == "default" { + data, err := f.Data() + if err != nil { + screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error()) + continue + } + + file, err := highlight.ParseFile(data) + if err != nil { + screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) + continue + } + + syndef, err := highlight.ParseDef(file, header) + if err != nil { + screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) + continue + } + b.SyntaxDef = syndef + break + } + } + } } } From 87ee41ab27f0d302f07463cea5da5fb30653233a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Wed, 17 Apr 2024 18:11:33 +0200 Subject: [PATCH 06/10] buffer: Don't process the default syntax in the user's custom file lookup It needs to be processed earliest in the moment no match could be determined. --- internal/buffer/buffer.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 60490dd1..566548fe 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -710,6 +710,10 @@ func (b *Buffer) UpdateRules() { var header *highlight.Header // search for the syntax file in the user's custom syntax files for _, f := range config.ListRealRuntimeFiles(config.RTSyntax) { + if f.Name() == "default" { + continue + } + data, err := f.Data() if err != nil { screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error()) From 4cafa601b5dba96beea59aad21d9e1574fc74c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Sun, 17 Mar 2024 19:43:35 +0100 Subject: [PATCH 07/10] syntax: Optimize the patterns and remove the comment region --- runtime/syntax/default.yaml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/runtime/syntax/default.yaml b/runtime/syntax/default.yaml index 88397670..f619ca67 100644 --- a/runtime/syntax/default.yaml +++ b/runtime/syntax/default.yaml @@ -5,12 +5,6 @@ detect: rules: # Mails - - special: "[[:alnum:].%_+-]+@[[:alnum:].-]+\\.[[:alpha:]]{2,}" + - special: "[[:alnum:].%_+-]+@[[:alnum:].-]+" # URLs - - identifier: "(https?|ftp|ssh)://\\S+\\.\\S+[^])>\\s,.]" - - - comment: - start: "(^|\\s)#" - end: "$" - rules: - - todo: "(TODO|XXX|FIXME):?" + - identifier: "(https?|ftp|ssh)://\\S*[^])>\\s,.]" From ed993a4021f2a6c61691b778535b1e32657cb24d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:20:28 +0100 Subject: [PATCH 08/10] buffer: Precise comment about searching in the internal runtime files --- internal/buffer/buffer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 566548fe..2c674733 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -770,7 +770,7 @@ func (b *Buffer) UpdateRules() { } if !foundDef { - // search in the default syntax files + // search for the syntax file in the runtime files for _, f := range config.ListRuntimeFiles(config.RTSyntaxHeader) { data, err := f.Data() if err != nil { @@ -883,6 +883,7 @@ func (b *Buffer) UpdateRules() { 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()) From 089160a7e40e0934bf5faf49174702d966d0fae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Sun, 14 Apr 2024 18:01:12 +0200 Subject: [PATCH 09/10] buffer: Refactor `UpdateRules()` by creating `parseDefFromFile()` This will reduce the length of this function and thus improves the readability. --- internal/buffer/buffer.go | 84 +++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 48 deletions(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 2c674733..8d8500be 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -682,6 +682,36 @@ func calcHash(b *Buffer, out *[md5.Size]byte) error { return nil } +func parseDefFromFile(f config.RuntimeFile, header *highlight.Header) *highlight.Def { + data, err := f.Data() + if err != nil { + screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error()) + return nil + } + + if header == nil { + header, err = highlight.MakeHeaderYaml(data) + if err != nil { + screen.TermMessage("Error parsing header for syntax file " + f.Name() + ": " + err.Error()) + return nil + } + } + + file, err := highlight.ParseFile(data) + if err != nil { + screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) + return nil + } + + syndef, err := highlight.ParseDef(file, header) + if err != nil { + screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) + return nil + } + + return syndef +} + // UpdateRules updates the syntax rules and filetype for this buffer // This is called when the colorscheme changes func (b *Buffer) UpdateRules() { @@ -850,23 +880,11 @@ func (b *Buffer) UpdateRules() { // we found a syntax file using a syntax header file for _, f := range config.ListRuntimeFiles(config.RTSyntax) { if f.Name() == syntaxFile { - data, err := f.Data() - if err != nil { - screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error()) + syndef := parseDefFromFile(f, header) + if syndef == nil { continue } - file, err := highlight.ParseFile(data) - if err != nil { - screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) - continue - } - - syndef, err := highlight.ParseDef(file, header) - if err != nil { - screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) - continue - } b.SyntaxDef = syndef break } @@ -916,29 +934,11 @@ func (b *Buffer) UpdateRules() { // search for the default file in the user's custom syntax files for _, f := range config.ListRealRuntimeFiles(config.RTSyntax) { if f.Name() == "default" { - data, err := f.Data() - if err != nil { - screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error()) + syndef := parseDefFromFile(f, nil) + if syndef == nil { continue } - header, err = highlight.MakeHeaderYaml(data) - if err != nil { - screen.TermMessage("Error parsing header for syntax file " + f.Name() + ": " + err.Error()) - continue - } - - file, err := highlight.ParseFile(data) - if err != nil { - screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) - continue - } - - syndef, err := highlight.ParseDef(file, header) - if err != nil { - screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) - continue - } b.SyntaxDef = syndef break } @@ -948,23 +948,11 @@ func (b *Buffer) UpdateRules() { // search for the default file in the runtime files for _, f := range config.ListRuntimeFiles(config.RTSyntax) { if f.Name() == "default" { - data, err := f.Data() - if err != nil { - screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error()) + syndef := parseDefFromFile(f, nil) + if syndef == nil { continue } - file, err := highlight.ParseFile(data) - if err != nil { - screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) - continue - } - - syndef, err := highlight.ParseDef(file, header) - if err != nil { - screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error()) - continue - } b.SyntaxDef = syndef break } From 6cd39efddcece5dd0aa7aa993618fbfd71c3b14e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Sun, 14 Apr 2024 18:13:24 +0200 Subject: [PATCH 10/10] buffer: Refactor `UpdateRules()` by creating further helper functions - `findRealRuntimeSyntaxDef()` - `findRuntimeSyntaxDef()` This will reduce the length of this function again and thus improves the readability. --- internal/buffer/buffer.go | 65 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 8d8500be..0892df45 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -712,6 +712,34 @@ func parseDefFromFile(f config.RuntimeFile, header *highlight.Header) *highlight return syndef } +// findRealRuntimeSyntaxDef finds a specific syntax definition +// in the user's custom syntax files +func findRealRuntimeSyntaxDef(name string, header *highlight.Header) *highlight.Def { + for _, f := range config.ListRealRuntimeFiles(config.RTSyntax) { + if f.Name() == name { + syndef := parseDefFromFile(f, header) + if syndef != nil { + return syndef + } + } + } + return nil +} + +// findRuntimeSyntaxDef finds a specific syntax definition +// in the runtime files +func findRuntimeSyntaxDef(name string, header *highlight.Header) *highlight.Def { + for _, f := range config.ListRuntimeFiles(config.RTSyntax) { + if f.Name() == name { + syndef := parseDefFromFile(f, header) + if syndef != nil { + return syndef + } + } + } + return nil +} + // UpdateRules updates the syntax rules and filetype for this buffer // This is called when the colorscheme changes func (b *Buffer) UpdateRules() { @@ -878,17 +906,7 @@ func (b *Buffer) UpdateRules() { if syntaxFile != "" && !foundDef { // we found a syntax file using a syntax header file - for _, f := range config.ListRuntimeFiles(config.RTSyntax) { - if f.Name() == syntaxFile { - syndef := parseDefFromFile(f, header) - if syndef == nil { - continue - } - - b.SyntaxDef = syndef - break - } - } + b.SyntaxDef = findRuntimeSyntaxDef(syntaxFile, header) } if b.SyntaxDef != nil && highlight.HasIncludes(b.SyntaxDef) { @@ -932,31 +950,10 @@ func (b *Buffer) UpdateRules() { b.Settings["filetype"] = b.SyntaxDef.FileType } else { // search for the default file in the user's custom syntax files - for _, f := range config.ListRealRuntimeFiles(config.RTSyntax) { - if f.Name() == "default" { - syndef := parseDefFromFile(f, nil) - if syndef == nil { - continue - } - - b.SyntaxDef = syndef - break - } - } - + b.SyntaxDef = findRealRuntimeSyntaxDef("default", nil) if b.SyntaxDef == nil { // search for the default file in the runtime files - for _, f := range config.ListRuntimeFiles(config.RTSyntax) { - if f.Name() == "default" { - syndef := parseDefFromFile(f, nil) - if syndef == nil { - continue - } - - b.SyntaxDef = syndef - break - } - } + b.SyntaxDef = findRuntimeSyntaxDef("default", nil) } } }