diff --git a/highlighter.go b/highlighter.go index 160d125..33a3f7d 100644 --- a/highlighter.go +++ b/highlighter.go @@ -27,7 +27,7 @@ type LineStates interface { } type Highlighter struct { - endRegions []*Region + lastRegion *Region def *Def } @@ -74,7 +74,7 @@ func (h *Highlighter) highlightRegion(start int, canMatchEnd bool, lineNum int, if len(line) == 0 { if canMatchEnd { - h.endRegions[lineNum] = region + h.lastRegion = region } return highlights @@ -115,7 +115,7 @@ func (h *Highlighter) highlightRegion(start int, canMatchEnd bool, lineNum int, } if canMatchEnd { - h.endRegions[lineNum] = region + h.lastRegion = region } return highlights @@ -125,7 +125,7 @@ func (h *Highlighter) highlightEmptyRegion(start int, canMatchEnd bool, lineNum highlights := make(LineMatch) if len(line) == 0 { if canMatchEnd { - h.endRegions[lineNum] = nil + h.lastRegion = nil } return highlights } @@ -151,7 +151,7 @@ func (h *Highlighter) highlightEmptyRegion(start int, canMatchEnd bool, lineNum } if canMatchEnd { - h.endRegions[lineNum] = nil + h.lastRegion = nil } return highlights @@ -161,15 +161,13 @@ func (h *Highlighter) Highlight(input string) []LineMatch { lines := strings.Split(input, "\n") var lineMatches []LineMatch - h.endRegions = make([]*Region, len(lines)) - for i := 0; i < len(lines); i++ { line := []byte(lines[i]) - if i == 0 || h.endRegions[i-1] == nil { + if i == 0 || h.lastRegion == nil { lineMatches = append(lineMatches, h.highlightEmptyRegion(0, true, i, line)) } else { - lineMatches = append(lineMatches, h.highlightRegion(0, true, i, line, h.endRegions[i-1])) + lineMatches = append(lineMatches, h.highlightRegion(0, true, i, line, h.lastRegion)) } } @@ -180,18 +178,16 @@ func (h *Highlighter) ReHighlight(input LineStates, startline int) []LineMatch { lines := input.Lines() var lineMatches []LineMatch - h.endRegions = make([]*Region, len(lines)) - for i := startline; i < len(lines); i++ { line := []byte(lines[i]) - if i == 0 || h.endRegions[i-1] == nil { + if i == 0 || h.lastRegion == nil { lineMatches = append(lineMatches, h.highlightEmptyRegion(0, true, i, line)) } else { - lineMatches = append(lineMatches, h.highlightRegion(0, true, i, line, h.endRegions[i-1])) + lineMatches = append(lineMatches, h.highlightRegion(0, true, i, line, h.lastRegion)) } - curState := h.endRegions[i] + curState := h.lastRegion lastState := input.State(i) if curState == lastState { diff --git a/syntax_files/cpp.yaml b/syntax_files/cpp.yaml new file mode 100644 index 0000000..610cd4a --- /dev/null +++ b/syntax_files/cpp.yaml @@ -0,0 +1,51 @@ +filetype: c++ + +detect: + filename: "(\\.c(c|pp|xx)$|\\.h(h|pp|xx)$|\\.ii?$|\\.(def)$)" + +rules: + + - identifier: "\\b[A-Z_][0-9A-Z_]+\\b" + - type: "\\b(auto|float|double|bool|char|int|short|long|sizeof|enum|void|static|const|constexpr|struct|union|typedef|extern|(un)?signed|inline)\\b" + - type: "\\b((s?size)|((u_?)?int(8|16|32|64|ptr)))_t\\b" + - statement: "\\b(class|namespace|template|public|protected|private|typename|this|friend|virtual|using|mutable|volatile|register|explicit)\\b" + - statement: "\\b(for|if|while|do|else|case|default|switch)\\b" + - statement: "\\b(try|throw|catch|operator|new|delete)\\b" + - statement: "\\b(goto|continue|break|return)\\b" + - preproc: "^[[:space:]]*#[[:space:]]*(define|pragma|include|(un|ifn?)def|endif|el(if|se)|if|warning|error)" + - constant: "('([^'\\\\]|(\\\\[\"'abfnrtv\\\\]))'|'\\\\(([0-3]?[0-7]{1,2}))'|'\\\\x[0-9A-Fa-f]{1,2}')" + + ## + ## GCC builtins + - statement: "(__attribute__[[:space:]]*\\(\\([^)]*\\)\\)|__(aligned|asm|builtin|hidden|inline|packed|restrict|section|typeof|weak)__)" + + #Operator Color + - statement: "([.:;,+*|=!\\%]|<|>|/|-|&)" + + - constant.number: "(\\b[0-9]+\\b|\\b0x[0-9A-Fa-f]+\\b)" + - constant.number: "(\\b(true|false)\\b|NULL)" + + - constant.string: + start: "\"" + end: "\"" + rules: + - constant.specialChar: "\\\\." + + - constant.string: + start: "'" + end: "'" + rules: + - preproc: "..+" + - constant.specialChar: "\\\\." + + - comment: + start: "//" + end: "$" + rules: + - todo: "(TODO|XXX|FIXME):?" + + - comment: + start: "/\\*" + end: "\\*/" + rules: + - todo: "(TODO|XXX|FIXME):?" diff --git a/syntax_files/d.yaml b/syntax_files/d.yaml index 6d1d763..6f1b0f6 100644 --- a/syntax_files/d.yaml +++ b/syntax_files/d.yaml @@ -6,7 +6,7 @@ detect: rules: # Operators and punctuation - statement: "(\\*|/|%|\\+|-|>>|<<|>>>|&|\\^(\\^)?|\\||~)?=" - - statement: "\\.\\.(\\.)?|!|\\*|&|~|\\(|\\)|\\[|\\]|\\\|/|\\+|-|%|<|>|\\?|:|;" + - statement: "\\.\\.(\\.)?|!|\\*|&|~|\\(|\\)|\\[|\\]|\\\\|/|\\+|-|%|<|>|\\?|:|;" # Octal integer literals are deprecated - error: "(0[0-7_]*)(L[uU]?|[uU]L?)?" # Decimal integer literals diff --git a/syntax_files/fish.yaml b/syntax_files/fish.yaml index 9b11f38..690f795 100644 --- a/syntax_files/fish.yaml +++ b/syntax_files/fish.yaml @@ -25,7 +25,7 @@ rules: - statement: "--[a-z-]+" - statement: "\\ -[a-z]+" - - identifier: "(?i\$\{?[0-9A-Z_!@#$*?-]+\}?)" + - identifier: "(?i)\\$\\{?[0-9A-Z_!@#$*?-]+\\}?" - constant.string: start: "\"" diff --git a/syntax_files/git-commit.yaml b/syntax_files/git-commit.yaml index 88b44f6..40b46ac 100644 --- a/syntax_files/git-commit.yaml +++ b/syntax_files/git-commit.yaml @@ -18,7 +18,7 @@ rules: - keyword: "#[[:space:]]new file:" - keyword: "#[[:space:]]renamed:" # Untracked filenames - - error: "^# [^/?*:;{}\\\\]+\.[^/?*:;{}\\\\]+$" + - error: "^# [^/?*:;{}\\\\]+\\.[^/?*:;{}\\\\]+$" - keyword: "^#[[:space:]]Changes.*[:]" - keyword: "^#[[:space:]]Your branch and '[^']+" - keyword: "^#[[:space:]]Your branch and '" diff --git a/syntax_files/glsl.yaml b/syntax_files/glsl.yaml index 9b171ce..faf30d5 100644 --- a/syntax_files/glsl.yaml +++ b/syntax_files/glsl.yaml @@ -17,10 +17,10 @@ rules: start: "//" end: "$" rules: - todo: "TODO:?" + - todo: "TODO:?" - comment: start: "/\\*" end: "\\*/" rules: - todo: "TODO:?" + - todo: "TODO:?" diff --git a/syntax_files/json.yaml b/syntax_files/json.yaml index ff90fd9..e10f7f5 100644 --- a/syntax_files/json.yaml +++ b/syntax_files/json.yaml @@ -6,7 +6,7 @@ detect: rules: - constant.number: "\\b[-+]?([1-9][0-9]*|0[0-7]*|0x[0-9a-fA-F]+)([uU][lL]?|[lL][uU]?)?\\b" - - constant.number: "\\b[-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([EePp][+-]?[0-9]+)?[fFlL]?" + - constant.number: "\\b[-+]?([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+)([EePp][+-]?[0-9]+)?[fFlL]?" - constant.number: "\\b[-+]?([0-9]+[EePp][+-]?[0-9]+)[fFlL]?" - constant: "\\b(null)\\b" - constant: "\\b(true|false)\\b" diff --git a/syntax_files/lilypond.yaml b/syntax_files/lilypond.yaml index 5805659..eda0b9a 100644 --- a/syntax_files/lilypond.yaml +++ b/syntax_files/lilypond.yaml @@ -5,7 +5,7 @@ detect: rules: - constant.number: "\\d+" - - identifier: "\\b(staff|spacing|signature|routine|notes|handler|corrected|beams|arpeggios|Volta_engraver|Voice|Vertical_align_engraver|Vaticana_ligature_engraver|VaticanaVoice|VaticanaStaff|Tweak_engraver|Tuplet_engraver|Trill_spanner_engraver|Timing_translator|Time_signature_performer|Time_signature_engraver|Tie_performer|Tie_engraver|Text_spanner_engraver|Text_engraver|Tempo_performer|Tab_tie_follow_engraver|Tab_staff_symbol_engraver|Tab_note_heads_engraver|TabVoice|TabStaff|System_start_delimiter_engraver|Stem_engraver|Stanza_number_engraver|Stanza_number_align_engraver|Staff_symbol_engraver|Staff_performer|Staff_collecting_engraver|StaffGroup|Staff|Spanner_break_forbid_engraver|Span_bar_stub_engraver|Span_bar_engraver|Span_arpeggio_engraver|Spacing_engraver|Slur_performer|Slur_engraver|Slash_repeat_engraver|Separating_line_group_engraver|Script_row_engraver|Script_engraver|Script_column_engraver|Score|Rhythmic_column_engraver|RhythmicStaff|Rest_engraver|Rest_collision_engraver|Repeat_tie_engraver|Repeat_acknowledge_engraver|Pure_from_neighbor_engraver|Pitched_trill_engraver|Pitch_squash_engraver|Piano_pedal_performer|Piano_pedal_engraver|Piano_pedal_align_engraver|PianoStaff|Phrasing_slur_engraver|PetrucciVoice|PetrucciStaff|Percent_repeat_engraver|Part_combine_engraver|Parenthesis_engraver|Paper_column_engraver|Output_property_engraver|Ottava_spanner_engraver|OneStaff|NullVoice|Note_spacing_engraver|Note_performer|Note_name_engraver|Note_heads_engraver|Note_head_line_engraver|NoteName\|NoteHead|New_fingering_engraver|Multi_measure_rest_engraver|Midi_control_function_performer|Metronome_mark_engraver|Mensural_ligature_engraver|MensuralVoice|MensuralStaff|Mark_engraver|Lyrics|Lyric_performer|Lyric_engraver|Ligature_bracket_engraver|Ledger_line_engraver|Laissez_vibrer_engraver|Kievan_ligature_engraver|KievanVoice|KievanStaff|Key_performer|Key_engraver|Keep_alive_together_engraver|Instrument_switch_engraver|Instrument_name_engraver|Hyphen_engraver|Grob_pq_engraver|GregorianTranscriptionVoice|GregorianTranscriptionStaff|GrandStaff|Grace_spacing_engraver|Grace_engraver|Grace_beam_engraver|Grace_auto_beam_engraver|Global|Glissando_engraver|Fretboard_engraver|FretBoards|Forbid_line_break_engraver|Footnote_engraver|Font_size_engraver|Fingering_engraver|Fingering_column_engraver|Figured_bass_position_engraver|Figured_bass_engraver|FiguredBass|Extender_engraver|Episema_engraver|Dynamics|Dynamic_performer|Dynamic_engraver|Dynamic_align_engraver|Drum_notes_engraver|Drum_note_performer|DrumVoice|DrumStaff|Double_percent_repeat_engraver|Dots_engraver|Dot_column_engraver|Devnull|Default_bar_line_engraver|Custos_engraver|Cue_clef_engraver|CueVoice|Control_track_performer|Concurrent_hairpin_engraver|Collision_engraver|Cluster_spanner_engraver|Clef_engraver|Chord_tremolo_engraver|Chord_name_engraver|ChordNames|ChoirStaff|Breathing_sign_engraver|Break_align_engraver|Bend_engraver|Beam_performer|Beam_engraver|Beam_collision_engraver|Bar_number_engraver|Bar_engraver|Axis_group_engraver|Auto_beam_engraver|Arpeggio_engraver|Accidental_engraver|Score)\\b" + - identifier: "\\b(staff|spacing|signature|routine|notes|handler|corrected|beams|arpeggios|Volta_engraver|Voice|Vertical_align_engraver|Vaticana_ligature_engraver|VaticanaVoice|VaticanaStaff|Tweak_engraver|Tuplet_engraver|Trill_spanner_engraver|Timing_translator|Time_signature_performer|Time_signature_engraver|Tie_performer|Tie_engraver|Text_spanner_engraver|Text_engraver|Tempo_performer|Tab_tie_follow_engraver|Tab_staff_symbol_engraver|Tab_note_heads_engraver|TabVoice|TabStaff|System_start_delimiter_engraver|Stem_engraver|Stanza_number_engraver|Stanza_number_align_engraver|Staff_symbol_engraver|Staff_performer|Staff_collecting_engraver|StaffGroup|Staff|Spanner_break_forbid_engraver|Span_bar_stub_engraver|Span_bar_engraver|Span_arpeggio_engraver|Spacing_engraver|Slur_performer|Slur_engraver|Slash_repeat_engraver|Separating_line_group_engraver|Script_row_engraver|Script_engraver|Script_column_engraver|Score|Rhythmic_column_engraver|RhythmicStaff|Rest_engraver|Rest_collision_engraver|Repeat_tie_engraver|Repeat_acknowledge_engraver|Pure_from_neighbor_engraver|Pitched_trill_engraver|Pitch_squash_engraver|Piano_pedal_performer|Piano_pedal_engraver|Piano_pedal_align_engraver|PianoStaff|Phrasing_slur_engraver|PetrucciVoice|PetrucciStaff|Percent_repeat_engraver|Part_combine_engraver|Parenthesis_engraver|Paper_column_engraver|Output_property_engraver|Ottava_spanner_engraver|OneStaff|NullVoice|Note_spacing_engraver|Note_performer|Note_name_engraver|Note_heads_engraver|Note_head_line_engraver|NoteName\\|NoteHead|New_fingering_engraver|Multi_measure_rest_engraver|Midi_control_function_performer|Metronome_mark_engraver|Mensural_ligature_engraver|MensuralVoice|MensuralStaff|Mark_engraver|Lyrics|Lyric_performer|Lyric_engraver|Ligature_bracket_engraver|Ledger_line_engraver|Laissez_vibrer_engraver|Kievan_ligature_engraver|KievanVoice|KievanStaff|Key_performer|Key_engraver|Keep_alive_together_engraver|Instrument_switch_engraver|Instrument_name_engraver|Hyphen_engraver|Grob_pq_engraver|GregorianTranscriptionVoice|GregorianTranscriptionStaff|GrandStaff|Grace_spacing_engraver|Grace_engraver|Grace_beam_engraver|Grace_auto_beam_engraver|Global|Glissando_engraver|Fretboard_engraver|FretBoards|Forbid_line_break_engraver|Footnote_engraver|Font_size_engraver|Fingering_engraver|Fingering_column_engraver|Figured_bass_position_engraver|Figured_bass_engraver|FiguredBass|Extender_engraver|Episema_engraver|Dynamics|Dynamic_performer|Dynamic_engraver|Dynamic_align_engraver|Drum_notes_engraver|Drum_note_performer|DrumVoice|DrumStaff|Double_percent_repeat_engraver|Dots_engraver|Dot_column_engraver|Devnull|Default_bar_line_engraver|Custos_engraver|Cue_clef_engraver|CueVoice|Control_track_performer|Concurrent_hairpin_engraver|Collision_engraver|Cluster_spanner_engraver|Clef_engraver|Chord_tremolo_engraver|Chord_name_engraver|ChordNames|ChoirStaff|Breathing_sign_engraver|Break_align_engraver|Bend_engraver|Beam_performer|Beam_engraver|Beam_collision_engraver|Bar_number_engraver|Bar_engraver|Axis_group_engraver|Auto_beam_engraver|Arpeggio_engraver|Accidental_engraver|Score)\\b" - statement: "[-_^]?\\\\[-A-Za-z_]+" - preproc: "\\b(((gisis|gis|geses|ges|g|fisis|fis|feses|fes|f|eisis|eis|eeses|ees|e|disis|dis|deses|des|d|cisis|cis|ceses|ces|c|bisis|bis|beses|bes|b|aisis|ais|aeses|aes|a)[,']*[?!]?)|s|r|R|q)(128|64|32|16|8|4|2|1|\\\\breve|\\\\longa|\\\\maxima)?([^\\\\\\w]|_|\\b)" - special: "[(){}<>]|\\[|\\]" diff --git a/syntax_files/lua.yaml b/syntax_files/lua.yaml index e9a620a..0b485d5 100644 --- a/syntax_files/lua.yaml +++ b/syntax_files/lua.yaml @@ -37,8 +37,8 @@ rules: - constant.specialChar: "\\\\." - constant.string: - start: "\[\[" - end: "\]\]" + start: "\\[\\[" + end: "\\]\\]" rules: - constant.specialChar: "\\\\." diff --git a/syntax_files/objc.yaml b/syntax_files/objc.yaml index 9392134..6ad708d 100644 --- a/syntax_files/objc.yaml +++ b/syntax_files/objc.yaml @@ -10,7 +10,7 @@ rules: - type: "\\b[A-Za-z0-9_]*_t\\b" - type: "\\bdispatch_[a-zA-Z0-9_]*_t\\b" - - statement: "__attribute__[[:space:]]*\\(\\([^)]*\\)\\)" "__(aligned|asm|builtin|hidden|inline|packed|restrict|section|typeof|weak)__" "__unused" "_Nonnull" "_Nullable" "__block" "__builtin.*" + - statement: "(__attribute__[[:space:]]*\\(\\([^)]*\\)\\)|__(aligned|asm|builtin|hidden|inline|packed|restrict|section|typeof|weak)__|__unused|_Nonnull|_Nullable|__block|__builtin.*)" - statement: "\\b(class|namespace|template|public|protected|private|typename|this|friend|virtual|using|mutable|volatile|register|explicit)\\b" - statement: "\\b(for|if|while|do|else|case|default|switch)\\b" - statement: "\\b(try|throw|catch|operator|new|delete)\\b" @@ -21,12 +21,12 @@ rules: - preproc: "^[[:space:]]*#[[:space:]]*(define|include|import|(un|ifn?)def|endif|el(if|se)|if|warning|error|pragma).*$" - preproc: "__[A-Z0-9_]*__" - - special: "^[[:space:]]*[#|@][[:space:]]*(import|include)[[:space:]]*[\"|<].*\/?[>|\"][[:space:]]*$" + - special: "^[[:space:]]*[#|@][[:space:]]*(import|include)[[:space:]]*[\"|<].*\\/?[>|\"][[:space:]]*$" - - statement: "[.:;,+*|=!\\%\\[\\]]" "<" ">" "/" "-" "&" + - statement: "([.:;,+*|=!\\%\\[\\]]|<|>|/|-|&)" - - constant.number: "\\b(-?)?[0-9]+\\b" "\\b\\[0-9]+\\.[0-9]+\\b" "\\b0x[0-9A-F]+\\b" - - constant: "@\\[(\\\\.|[^\\]])*\\]" "@\\{(\\\\.|[^\\}])*\\}" "@\\((\\\\.|[^\\)])*\\)" + - constant.number: "(\\b(-?)?[0-9]+\\b|\\b\\[0-9]+\\.[0-9]+\\b|\\b0x[0-9A-F]+\\b)" + - constant: "(@\\[(\\\\.|[^\\]])*\\]|@\\{(\\\\.|[^\\}])*\\}|@\\((\\\\.|[^\\)])*\\))" - constant: "\\b<(\\\\.[^\\>])*\\>\\b" - constant: "\\b(nil|NULL|YES|NO|TRUE|true|FALSE|false|self)\\b" - constant: "\\bk[[:alnum]]*\\b" diff --git a/syntax_files/python2.yaml b/syntax_files/python2.yaml index bb0b00c..bddf66d 100644 --- a/syntax_files/python2.yaml +++ b/syntax_files/python2.yaml @@ -23,9 +23,9 @@ rules: # decorators - brightgreen: "@.*[(]" # operators - - statement: "[.:;,+*|=!\\%@]" "<" ">" "/" "-" "&" + - statement: "([.:;,+*|=!\\%@]|<|>|/|-|&)" # parentheses - - statement: "[(){}]" "\\[" "\\]" + - statement: "([(){}]|\\[|\\])" # numbers - constant.number: "\\b[0-9]+\\b" diff --git a/syntax_files/python3.yaml b/syntax_files/python3.yaml index 54080e6..864089a 100644 --- a/syntax_files/python3.yaml +++ b/syntax_files/python3.yaml @@ -22,9 +22,9 @@ rules: # decorators - brightgreen: "@.*[(]" # operators - - statement: "[.:;,+*|=!\\%@]" "<" ">" "/" "-" "&" + - statement: "([.:;,+*|=!\\%@]|<|>|/|-|&)" # parentheses - - statement: "[(){}]" "\\[" "\\]" + - statement: "([(){}]|\\[|\\])" # numbers - constant.number: "\\b[0-9]+\\b" diff --git a/syntax_files/swift.yaml b/syntax_files/swift.yaml index 307aaf6..2a13a07 100644 --- a/syntax_files/swift.yaml +++ b/syntax_files/swift.yaml @@ -5,7 +5,7 @@ detect: rules: # Operators - - statement: "[.:;,+*|=!?\\%]" "<" ">" "/" "-" "&" + - statement: "([.:;,+*|=!?\\%]|<|>|/|-|&)" # Statements - statement: "(class|import|let|var|struct|enum|func|if|else|switch|case|default|for|in|internal|external|unowned|private|public|throws)\\ " diff --git a/syntax_files/tex.yaml b/syntax_files/tex.yaml index 05ffcb6..929fdbc 100644 --- a/syntax_files/tex.yaml +++ b/syntax_files/tex.yaml @@ -28,3 +28,4 @@ rules: - comment: start: "\\\\begin\\{comment\\}" end: "\\\\end\\{comment\\}" + rules: [] diff --git a/syntax_files/toml.yaml b/syntax_files/toml.yaml index e4e2218..639be32 100644 --- a/syntax_files/toml.yaml +++ b/syntax_files/toml.yaml @@ -23,8 +23,8 @@ rules: - constant.string: start: "'" end: "'" - rules: - - constant.specialChar: "\\\\." + rules: + - constant.specialChar: "\\\\." - constant.string: start: "`"