From 1cf4baa7439c31ff301779bebe56c4e194bc8a42 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sun, 14 Jan 2018 11:23:30 -0800 Subject: [PATCH 1/7] Don't use indentchar style if disabled Fixes #990 --- cmd/micro/cellview.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/micro/cellview.go b/cmd/micro/cellview.go index b0f80502..e8813a79 100644 --- a/cmd/micro/cellview.go +++ b/cmd/micro/cellview.go @@ -161,7 +161,8 @@ func (c *CellView) Draw(buf *Buffer, top, height, left, width int) { c.lines[viewLine][viewCol].width = charWidth indentStyle := curStyle - if group, ok := colorscheme["indent-char"]; ok { + ch := buf.Settings["indentchar"].(string) + if group, ok := colorscheme["indent-char"]; ok && !IsStrWhitespace(ch) && ch != "" { indentStyle = group } From d7ba2f600ed57196cdcffbf79e6637252528da34 Mon Sep 17 00:00:00 2001 From: Joshua Li Date: Tue, 16 Jan 2018 17:27:15 -0500 Subject: [PATCH 2/7] implemented select line as an Action --- cmd/micro/actions.go | 14 ++++++++++++++ cmd/micro/bindings.go | 1 + runtime/help/keybindings.md | 1 + 3 files changed, 16 insertions(+) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index 85ce1bb8..b05abdfb 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -458,6 +458,20 @@ func (v *View) EndOfLine(usePlugin bool) bool { return true } +// SelectLine selects the entire current line +func (v *View) SelectLine(usePlugin bool) bool { + if usePlugin && !PreActionCall("SelectLine", v) { + return false + } + + v.Cursor.SelectLine() + + if usePlugin { + return PostActionCall("SelectLine", v) + } + return true +} + // SelectToStartOfLine selects to the start of the current line func (v *View) SelectToStartOfLine(usePlugin bool) bool { if usePlugin && !PreActionCall("SelectToStartOfLine", v) { diff --git a/cmd/micro/bindings.go b/cmd/micro/bindings.go index c14ce724..f70e5823 100644 --- a/cmd/micro/bindings.go +++ b/cmd/micro/bindings.go @@ -43,6 +43,7 @@ var bindingActions = map[string]func(*View, bool) bool{ "SelectWordLeft": (*View).SelectWordLeft, "DeleteWordRight": (*View).DeleteWordRight, "DeleteWordLeft": (*View).DeleteWordLeft, + "SelectLine": (*View).SelectLine, "SelectToStartOfLine": (*View).SelectToStartOfLine, "SelectToEndOfLine": (*View).SelectToEndOfLine, "ParagraphPrevious": (*View).ParagraphPrevious, diff --git a/runtime/help/keybindings.md b/runtime/help/keybindings.md index 0a76a8a4..dfee40b6 100644 --- a/runtime/help/keybindings.md +++ b/runtime/help/keybindings.md @@ -156,6 +156,7 @@ MoveLinesUp MoveLinesDown DeleteWordRight DeleteWordLeft +SelectLine SelectToStartOfLine SelectToEndOfLine InsertNewline From e26417fd1475af444f92e9e8451e6682e7419c1f Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Wed, 17 Jan 2018 17:19:03 -0500 Subject: [PATCH 3/7] Fix shebang js highlighting and js division Closes #901 Closes #994 --- cmd/micro/runtime.go | 2 +- runtime/syntax/javascript.yaml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/micro/runtime.go b/cmd/micro/runtime.go index e686b132..a59628c0 100644 --- a/cmd/micro/runtime.go +++ b/cmd/micro/runtime.go @@ -2108,7 +2108,7 @@ func runtimeSyntaxJavaYaml() (*asset, error) { return a, nil } -var _runtimeSyntaxJavascriptYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x54\x5d\x73\xe3\x34\x14\x7d\xcf\xaf\xf0\x66\x0b\xb5\x9d\x71\x52\x1e\x60\x69\x06\xf0\x14\x68\x9f\xa0\x30\x30\xbc\x20\xa9\xbb\xd7\xf6\x75\xa2\x56\x96\x3d\xd2\x75\xd2\xc0\x85\xdf\xce\xc8\x49\x69\x71\xbb\xa5\x0f\x30\xeb\x07\xc9\xbe\x73\x74\xce\x91\xef\x47\xad\x0d\xd2\xae\xc3\x65\x74\x0d\x1b\xf0\xa5\xd3\x1d\x4d\x26\x15\x12\x96\xb4\x9c\x44\x51\x14\x05\x84\x85\x06\x97\xd1\x34\x96\x72\x7e\xed\x8f\x58\xca\x39\x7a\xf1\xe9\x67\x6f\x3e\x57\xf9\x51\x32\x1d\x60\x6b\x84\x0a\xdd\x32\x9a\x5e\xbd\x7e\x35\x4f\x17\x31\xda\x4d\x34\x4b\x72\xdb\x56\x18\x47\x1c\x50\x13\xd7\x1b\xf4\x7b\xd2\x2c\x2a\x5b\xeb\x09\x2c\xcd\x6d\xdf\x14\xc3\x41\x29\x0b\x91\xcd\x54\x1e\x8b\x4f\xb2\x53\x25\x4e\xb2\x53\x95\xf2\x89\x38\xc9\xde\x84\xfd\x36\x04\x20\xab\xcf\xb2\x0b\x35\x4b\x62\xd1\xff\xa2\x84\xf9\x4e\xe5\x1c\xd6\xf0\x95\x27\xb9\x94\xc5\xf4\x05\xf4\x81\x79\x26\xe5\xfc\x20\xb1\xdf\xee\xbe\x03\xf7\x39\xfe\xd8\x29\x31\xcb\x54\x7e\x08\xe5\xa2\xbe\x08\x62\x2f\x66\x7f\x4c\x31\x62\xd0\x15\x5a\xd2\xb5\x1e\x0e\x8b\xb3\xec\x57\xc8\x7e\x7b\xab\x0e\x2f\x27\xd9\xe9\x5b\x95\x0a\xb1\xf4\x1d\x94\xb8\x54\x2a\x15\xb1\xba\x3b\xe9\x77\x4d\xd1\x9a\x79\xe1\xa0\xbc\x41\xf2\xfb\xb4\xfc\xce\x52\xfe\x91\x3c\x0b\x89\x59\xca\xe4\x79\x88\x60\x29\xd5\xf3\x90\xff\x51\xa8\xed\xd0\x01\xb5\xc3\x0f\xc9\x66\x8b\xf4\xcb\x2f\xbe\x7a\xf5\xe7\x47\xf9\xf2\x63\xbe\xbf\x3b\x01\x61\x83\x96\xf6\x7f\x3c\x06\xbf\xb3\x25\xc3\x16\x34\x71\xe1\x10\x6e\xb8\x04\x8f\x5c\x02\x95\x6b\x1e\x92\x14\x56\xd2\xb6\x47\xae\xb0\xe8\x57\x2b\x74\x5c\x61\x0d\xbd\x21\xae\xd0\x20\x21\x57\x2d\xa3\xf1\xc8\x78\xdb\xb5\x8e\xb8\xd6\x16\x8c\xd9\x25\x0f\x6a\x69\xac\x5a\xb7\x8e\xeb\xde\x96\xa4\x5b\xcb\xa5\x01\xef\x19\x6f\x09\x6d\xe5\x79\x85\xc4\xba\x66\xdd\x0c\x5c\xda\xb2\x1e\x0a\xa5\xc4\xb6\x66\x83\xc4\x16\xb7\xec\x90\x7a\x67\xd9\x23\x3d\x27\xe2\xfb\x0e\x1d\xfb\xad\x0e\x57\xa1\xb5\xf6\x4c\x6b\xd7\x6e\x99\xdc\x8e\x43\xc3\xb6\x35\x6f\xc0\xf1\xa6\xd5\x15\x6f\xd7\xda\x20\x6f\x35\xad\x79\xa7\xd1\x54\xf7\xbc\xaf\x23\x87\x1e\xdd\x06\xab\xa8\xe8\x29\xea\x2d\x78\xaf\x57\x16\xab\x83\x2a\x3a\xd7\x1e\xca\x37\x46\xdb\x37\xc1\xb9\x19\x6c\x78\xd6\x96\xd0\xd5\x50\x22\x77\x50\xde\xc0\x0a\xb9\x73\x7a\x03\x14\xf6\x36\xcc\x07\xac\xb8\xeb\x0b\xa3\xcb\x64\xdc\x17\x07\x46\xdb\x1b\xc3\xbd\xad\xb0\xd6\x16\x2b\xbe\x84\xcb\xe4\x89\x16\x3d\x80\xc9\xf5\xc8\x35\x18\x8f\x0f\x41\xfb\xd9\x34\x00\xce\x9c\x83\x1d\x7f\xdd\xb6\x06\xc1\xf2\xb7\xc1\xc8\xb9\xed\x9b\x7d\xd1\xf0\x79\xb8\x09\x5f\xdc\xa5\xe5\x7b\xa0\xf5\x7b\x78\x2e\x87\x9e\xe5\x1f\x8a\x6b\x2c\x89\x7f\xc2\xd5\xf9\x6d\xc7\x3f\x93\xd3\x76\xf5\x1e\x7b\x0b\x71\x95\xaa\x58\x5c\x2d\x14\xc7\x52\x4a\xb9\x48\x92\x54\x5c\x85\x37\xb5\x10\x2b\xdd\xa8\xf4\xc9\x3b\x49\x39\x0c\xaf\x61\xc9\xf7\x2b\x87\xe8\x3f\x46\xd9\x10\x11\x45\x6d\x1d\x1d\xcb\xa9\x94\xf9\x40\x3b\x9d\x8c\x27\x8d\x1f\x0c\xee\xa7\x67\x78\x3c\x81\x1b\x64\xa6\xd3\xbf\x63\x68\xab\x51\xc4\xdf\xe8\xee\xe0\x65\x7e\x1f\x7d\x30\x88\xef\x9e\x87\x4a\x1d\x96\x1a\xcc\x37\x6b\x70\xf7\x47\x5f\x6a\xe7\x78\xec\xe6\xf8\x03\x9a\x79\x37\x36\xf3\xee\xbf\x91\x6d\x86\x3e\x7d\x24\xb7\x58\x8c\xf5\x8e\xc6\x7a\x91\x50\xff\x4e\x23\x65\xfa\x28\xa7\x32\x5d\x3c\xc9\xf5\x57\x00\x00\x00\xff\xff\x68\x73\x36\x23\xc0\x07\x00\x00") +var _runtimeSyntaxJavascriptYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x54\x51\x73\xe3\x34\x10\x7e\xef\xaf\xf0\xe5\x0a\xb5\x9d\x71\x5c\x1e\xe0\x68\x06\xf0\x14\x68\x9f\xa0\x30\x30\xbc\x20\xa9\x77\xb2\xbd\x4e\xd4\xca\xb2\x47\x5a\x27\x0d\x2c\xfc\x76\x46\xb6\x4b\x72\x6e\x2f\xf4\x01\x06\x3f\xc8\xf6\xce\xa7\xef\xfb\x56\xbb\xda\x4a\x69\xc0\x5d\x0b\xcb\xe0\x4e\x6e\xa4\x2b\xac\x6a\xf1\xe4\xa4\x04\x84\x02\x97\x27\x41\x10\x04\x1e\x61\x64\x0d\xcb\x60\x16\x72\xbe\xb8\x73\xa7\xc4\xf9\x02\x1c\xfb\xf4\xb3\x37\x9f\x8b\xec\x34\x9a\xf5\xb0\x35\xc8\x12\xec\x32\x98\xdd\xbe\x7e\xb5\x88\xd3\x10\xcc\x26\x98\x47\x99\x69\x4a\x08\x03\xf2\xa8\x13\xdb\x69\x70\x03\x69\x12\x14\x8d\x71\x28\x0d\x2e\x4c\x57\xe7\xfd\x46\xce\x73\x96\xcc\x45\x16\xb2\x4f\x92\x0b\xc1\xce\x93\x0b\x11\xd3\x39\x3b\x4f\xde\xf8\xf7\x83\x0f\xc8\xa4\xba\x4c\xae\xc5\x3c\x0a\x59\xf7\x8b\x60\xfa\x3b\x91\x91\x5f\xfd\x5f\x16\x65\x9c\xe7\xb3\x17\xd0\x7b\xe6\x39\xe7\x8b\x51\x62\x78\x3d\xfe\x7b\xee\x2b\xf8\xb1\x15\x6c\x9e\x88\x6c\x0c\x65\xac\xba\xf6\x62\x2f\x66\x7f\x4a\x31\x61\x50\x25\x18\x54\x95\xea\x37\xb3\xcb\xe4\x57\x99\xfc\xf6\x56\x8c\x1f\xe7\xc9\xc5\x5b\x11\x33\xb6\x74\xad\x2c\x60\x29\x44\xcc\x42\xf1\xb8\xd3\xed\xea\xbc\xd1\x8b\xdc\xca\xe2\x1e\xd0\x0d\x65\xf9\x9d\x38\xff\x23\x3a\x0a\x09\x89\xf3\xe8\x38\x84\x11\xe7\xe2\x38\xe4\x3f\x14\x6a\x5a\xb0\x12\x9b\xfe\x40\x92\x79\x1a\x7f\xf9\xc5\x57\xaf\xfe\xfc\x28\x5b\x7e\x4c\xfb\xdc\x51\x22\xd4\x60\x70\x38\xf1\x50\xba\x9d\x29\x48\x6e\xa5\x42\xca\x2d\xc8\x7b\x2a\xa4\x03\x2a\x24\x16\x6b\xea\x8b\xe4\x57\x54\xa6\x03\x2a\x21\xef\x56\x2b\xb0\x54\x42\x25\x3b\x8d\x54\x82\x06\x04\x2a\x1b\x02\xed\x80\xe0\xa1\x6d\x2c\x52\xa5\x8c\xd4\x7a\x17\x1d\xf4\xd2\x54\xb5\x6a\x2c\x55\x9d\x29\x50\x35\x86\x0a\x2d\x9d\x23\x78\x40\x30\xa5\xa3\x15\x20\xa9\x8a\x54\xdd\x73\x29\x43\xaa\x6f\x94\x02\x9a\x8a\x34\x20\x19\xd8\x92\x05\xec\xac\x21\x07\x78\x4c\xc4\x75\x2d\x58\x72\x5b\xe5\x53\xc1\xb5\x72\x84\x6b\xdb\x6c\x09\xed\x8e\xfc\x85\x6d\x2a\xda\x48\x4b\x9b\x46\x95\xb4\x5d\x2b\x0d\xb4\x55\xb8\xa6\x9d\x02\x5d\xee\x79\x5f\x07\x16\x1c\xd8\x0d\x94\x41\xde\x61\xd0\x19\xe9\x9c\x5a\x19\x28\x47\x55\xb0\xb6\x19\xdb\x37\x04\xd3\xd5\xde\xb9\xee\x6d\x38\x52\x06\xc1\x56\xb2\x00\x6a\x65\x71\x2f\x57\x40\xad\x55\x1b\x89\xfe\xdd\xf8\xf9\x00\x25\xb5\x5d\xae\x55\x11\x4d\xef\xc5\xc8\x68\x3a\xad\xa9\x33\x25\x54\xca\x40\x49\x37\xf2\x26\x7a\xe6\x8a\x8e\x60\xb4\x1d\x50\x25\xb5\x83\x43\xd0\x30\x9b\x7a\xc0\xa5\xb5\x72\x47\x5f\x37\x8d\x06\x69\xe8\x5b\x6f\xe4\xca\x74\xf5\xd0\x34\x74\xe5\x33\xa1\xeb\xc7\xb2\x7c\x2f\x71\xfd\x01\x9e\x9b\xfe\xce\xd2\x0f\xf9\x1d\x14\x48\x3f\xc1\xea\xea\xa1\xa5\x9f\xd1\x2a\xb3\x3a\x3c\xb8\xf7\x0c\xa6\xec\x36\x16\x21\xbb\x4d\x05\x85\x9c\x73\x9e\x46\x51\xcc\x6e\xfd\x97\x48\xd9\x4a\xd5\x22\x7e\x36\x2b\xce\xfb\xf1\xd5\x2f\xd9\xb0\x92\x8f\xbe\x37\xcc\xfa\x08\xcb\x2b\x63\xf1\x8c\xcf\x38\xcf\x7a\xda\x3d\x5f\x3d\x76\xc5\x87\x07\xeb\x74\x2a\xb9\x3e\x99\x61\xd2\xfa\xc7\xa1\xb4\xbd\xa1\xd9\xec\xef\x18\x98\x72\x12\x71\xf7\xaa\x1d\x5d\x2f\xf6\xd1\x83\xa1\xfd\xf8\x1c\x2a\xb5\x50\x28\xa9\xbf\x59\x4b\xbb\xdf\xfa\x52\x3b\x67\x53\x37\x67\xff\xa3\x99\x77\x53\x33\xef\xfe\x1d\xd9\xa1\x7a\x4f\xe4\xd2\x74\xaa\x77\x3a\xd5\x0b\x98\xf8\x67\x1a\xce\xe3\x27\x35\xe5\x71\xfa\x2c\xd7\x5f\x01\x00\x00\xff\xff\x05\x1c\xab\x64\xec\x07\x00\x00") func runtimeSyntaxJavascriptYamlBytes() ([]byte, error) { return bindataRead( diff --git a/runtime/syntax/javascript.yaml b/runtime/syntax/javascript.yaml index 01553321..84f9d275 100644 --- a/runtime/syntax/javascript.yaml +++ b/runtime/syntax/javascript.yaml @@ -25,8 +25,10 @@ rules: - constant: "\\b(true|false)\\b" - type: "\\b(Array|Boolean|Date|Enumerator|Error|Function|Math)\\b" - type: "\\b(Number|Object|RegExp|String)\\b" - - constant: "/[^*]([^/]|(\\\\/))*[^\\\\]/[gim]*" + # - constant: "/[^*]([^/]|(\\\\/))*[^\\\\]/[gim]*" - constant: "\\\\[0-7][0-7]?[0-7]?|\\\\x[0-9a-fA-F]+|\\\\[bfnrt'\"\\?\\\\]" + - comment: "^#!.*/(env +)?node( |$)" + - constant.string: start: "\"" From 3924e363d134bda6f618b4d14bd522ebe3a0e029 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Wed, 17 Jan 2018 17:37:17 -0500 Subject: [PATCH 4/7] Fix minor autoindent issue Fixes #985 --- cmd/micro/actions.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index b05abdfb..3a8b89dc 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -695,10 +695,14 @@ func (v *View) InsertNewline(usePlugin bool) bool { } ws := GetLeadingWhitespace(v.Buf.Line(v.Cursor.Y)) + cx := v.Cursor.X v.Buf.Insert(v.Cursor.Loc, "\n") // v.Cursor.Right() if v.Buf.Settings["autoindent"].(bool) { + if cx < len(ws) { + ws = ws[0:cx] + } v.Buf.Insert(v.Cursor.Loc, ws) // for i := 0; i < len(ws); i++ { // v.Cursor.Right() From 16e9068cb97f7dc1027e3277e97600ead90fb50b Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Wed, 17 Jan 2018 19:09:50 -0500 Subject: [PATCH 5/7] Support line:col in JumpLine Closes #1000 --- cmd/micro/actions.go | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index 3a8b89dc..a9a34aa0 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -1623,21 +1623,38 @@ func (v *View) JumpLine(usePlugin bool) bool { } // Prompt for line number - message := fmt.Sprintf("Jump to line (1 - %v) # ", v.Buf.NumLines) - linestring, canceled := messenger.Prompt(message, "", "LineNumber", NoCompletion) + message := fmt.Sprintf("Jump to line:col (1 - %v) # ", v.Buf.NumLines) + input, canceled := messenger.Prompt(message, "", "LineNumber", NoCompletion) if canceled { return false } - lineint, err := strconv.Atoi(linestring) - lineint = lineint - 1 // fix offset - if err != nil { - messenger.Error(err) // return errors - return false + var lineInt int + var colInt int + var err error + if strings.Contains(input, ":") { + split := strings.Split(input, ":") + lineInt, err = strconv.Atoi(split[0]) + if err != nil { + messenger.Message("Invalid line number") + return false + } + colInt, err = strconv.Atoi(split[1]) + if err != nil { + messenger.Message("Invalid column number") + return false + } + } else { + lineInt, err = strconv.Atoi(input) + if err != nil { + messenger.Message("Invalid line number") + return false + } } + lineInt-- // Move cursor and view if possible. - if lineint < v.Buf.NumLines && lineint >= 0 { - v.Cursor.X = 0 - v.Cursor.Y = lineint + if lineInt < v.Buf.NumLines && lineInt >= 0 { + v.Cursor.X = colInt + v.Cursor.Y = lineInt if usePlugin { return PostActionCall("JumpLine", v) From 808e3a7c9fd68e90760df1f21b08ae283ceeb9b0 Mon Sep 17 00:00:00 2001 From: sum01 Date: Tue, 16 Jan 2018 21:54:13 -0500 Subject: [PATCH 6/7] Prompt to create parent folders (if none) when saving Fixes #995 --- cmd/micro/buffer.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/cmd/micro/buffer.go b/cmd/micro/buffer.go index fe2f9886..a2d95dda 100644 --- a/cmd/micro/buffer.go +++ b/cmd/micro/buffer.go @@ -4,6 +4,7 @@ import ( "bytes" "crypto/md5" "encoding/gob" + "errors" "io" "io/ioutil" "os" @@ -428,7 +429,28 @@ func (b *Buffer) SaveAs(filename string) error { b.ModTime, _ = GetModTime(filename) }() - f, err := os.OpenFile(ReplaceHome(filename), os.O_WRONLY|os.O_CREATE, 0644) + // Removes any tilde and replaces with the absolute path to home + var absFilename string = ReplaceHome(filename) + + // Get the leading path to the file | "." is returned if there's no leading path provided + if dirname := filepath.Dir(absFilename); dirname != "." { + // Check if the parent dirs don't exist + if _, statErr := os.Stat(dirname); os.IsNotExist(statErr) { + // Prompt to make sure they want to create the dirs that are missing + if yes, canceled := messenger.YesNoPrompt("Parent folders \"" + dirname + "\" do not exist. Create them? (y,n)"); yes && !canceled { + // Create all leading dir(s) since they don't exist + if mkdirallErr := os.MkdirAll(dirname, os.ModePerm); mkdirallErr != nil { + // If there was an error creating the dirs + return mkdirallErr + } + } else { + // If they canceled the creation of leading dirs + return errors.New("Save aborted") + } + } + } + + f, err := os.OpenFile(absFilename, os.O_WRONLY|os.O_CREATE, 0644) if err != nil { return err } From cf06d06fb3c2441d3d07c1f1dca881f22b54b13d Mon Sep 17 00:00:00 2001 From: sum01 Date: Wed, 17 Jan 2018 23:44:53 -0500 Subject: [PATCH 7/7] Fix Makefile = highlighting I think they weren't being highlighted at all, leading to a weird looking default white box around them. --- runtime/syntax/makefile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/syntax/makefile.yaml b/runtime/syntax/makefile.yaml index 72502a87..7e90cdeb 100644 --- a/runtime/syntax/makefile.yaml +++ b/runtime/syntax/makefile.yaml @@ -7,8 +7,8 @@ detect: rules: - preproc: "\\<(ifeq|ifdef|ifneq|ifndef|else|endif)\\>" - statement: "^(export|include|override)\\>" - - operator: "^[^:= ]+:" - - operator: "([=,%]|\\+=|\\?=|:=|&&|\\|\\|)" + - symbol.operator: "^[^:= ]+:" + - symbol.operator: "([=,%]|\\+=|\\?=|:=|&&|\\|\\|)" - statement: "\\$\\((abspath|addprefix|addsuffix|and|basename|call|dir)[[:space:]]" - statement: "\\$\\((error|eval|filter|filter-out|findstring|firstword)[[:space:]]" - statement: "\\$\\((flavor|foreach|if|info|join|lastword|notdir|or)[[:space:]]"