Ticket #4556: color definitions in the "c.syntax" highlight file.

Definitions are provided for:
- Various punctuation (divided into 9 groups);
- Preprocessor;
- Keywords;
- Data types;
- Data type qualifiers;
- Numbers (can be different for the integer, hexadecimal, octal and floatpoint representations);
- Strings and escaped characters;
- Comments (with keywords like "TODO:");
- Labels.
In total 32 "defines"...

Based on the original "c.syntax" file, this version includes most of the content from C89..C23.

Closes MidnightCommander/mc#203.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
Morthimer McMare 2024-06-26 23:40:27 +03:00 committed by Andrew Borodin
parent 45c28d9d11
commit cd8355bfa8
1 changed files with 260 additions and 121 deletions

View File

@ -1,133 +1,272 @@
# Syntax rules for the C and the C++ programming languages # Syntax rules for the C (and partially C++) programming languages.
#
# Rewritten and extended with defines by Morthimer McMare
# <mailto:morthimer_second@list.ru>
#
# Tab size: 4.
# Feel free to improve the highlighting file.
#
# Date:
# Initial 2024.04.24;
# Updated 2024.06.26 (first public release. Classic Midnight Commander C-syntax theme set by default, added keywords from the C23 standard).
#
# For the default (blue) background.
# The colors almost match the original "c.syntax" file, slightly extending it:
define _punctuation yellow
define _punct_operator brightcyan
define _punct_semicolon brightmagenta
define _punct_bracket brightcyan
define _punct_sqbracket brightcyan
define _punct_field yellow
define _punct_comma brightcyan
define _punct_ternary brightcyan
define _punct_bitwise brightmagenta
define _label cyan
define _preproc brightred
define _preproc_str red
define _preproc_nl_esc red
define _preproc_indent brightmagenta
define _keyword yellow
define _datatype yellow
define _datatype_void yellow
define _datatype_mod yellow
define _datatype_scope yellow
define _const lightgray
define _num_integer lightgray
define _num_hex lightgray
define _num_oct lightgray
define _num_float lightgray
define _string green
define _string_specsymb brightgreen
define _string_escchar brightgreen
define _char brightgreen
define _comment brown
define _comment_word black brown
define _comment_exmark black yellow
define _comment_qnmark black brown
# I think this highlighting is easier for the eyes for the black background themes. Can be also used with the blue background:
#define _punctuation yellow
#define _punct_operator brightmagenta
#define _punct_semicolon brightmagenta
#define _punct_bracket yellow
#define _punct_sqbracket brown
#define _punct_field yellow
#define _punct_comma yellow
#define _punct_ternary white
#define _punct_bitwise yellow
#define _label brightcyan
#define _preproc lightgray
#define _preproc_str white
#define _preproc_nl_esc white
#define _preproc_indent lightgray
#define _keyword brightcyan
#define _datatype brightcyan
#define _datatype_void brightcyan
#define _datatype_mod brightcyan
#define _datatype_scope brightblue
#define _const lightgray
#define _num_integer red
#define _num_hex red
#define _num_oct red
#define _num_float magenta
#define _string brightgreen
#define _string_specsymb brightcyan
#define _string_escchar brightcyan
#define _char brightgreen
#define _comment gray
#define _comment_word black gray
#define _comment_exmark black yellow
#define _comment_qnmark black brown
context default context default
keyword whole alignas yellow keyword whole asm _keyword
keyword whole alignof yellow keyword whole break _keyword
keyword whole asm yellow keyword whole case _keyword
keyword whole auto yellow keyword whole const _keyword
keyword whole break yellow keyword whole continue _keyword
keyword whole case yellow keyword whole do _keyword
keyword whole char yellow keyword whole else _keyword
keyword whole constexpr yellow keyword whole enum _keyword
keyword whole const yellow keyword whole for _keyword
keyword whole continue yellow keyword whole goto _keyword
keyword whole default yellow keyword whole if _keyword
keyword whole double yellow keyword whole inline _keyword
keyword whole do yellow keyword whole restrict _keyword
keyword whole else yellow keyword whole return _keyword
keyword whole enum yellow keyword whole sizeof _keyword
keyword whole extern yellow keyword whole struct _keyword
keyword whole false yellow keyword whole switch _keyword
keyword whole float yellow keyword whole typedef _keyword
keyword whole for yellow keyword whole union _keyword
keyword whole goto yellow keyword whole volatile _keyword
keyword whole if yellow keyword whole while _keyword
keyword whole inline yellow
keyword whole int yellow
keyword whole long yellow
keyword whole nullptr yellow
keyword whole register yellow
keyword whole restrict yellow
keyword whole return yellow
keyword whole short yellow
keyword whole signed yellow
keyword whole sizeof yellow
keyword whole static yellow
keyword whole static_assert yellow
keyword whole struct yellow
keyword whole switch yellow
keyword whole thread_local yellow
keyword whole true yellow
keyword whole typedef yellow
keyword whole typeof yellow
keyword whole typeof_unqual yellow
keyword whole union yellow
keyword whole unsigned yellow
keyword whole void yellow
keyword whole volatile yellow
keyword whole wchar_t yellow
keyword whole while yellow
keyword whole _Alignas yellow
keyword whole _Alignof yellow
keyword whole _Atomic yellow
keyword whole _Bool yellow
keyword whole _Complex yellow
keyword whole _Decimal32 yellow
keyword whole _Decimal64 yellow
keyword whole _Decimal128 yellow
keyword whole _Generic yellow
keyword whole _Imaginary yellow
keyword whole _Noreturn yellow
keyword whole _Static_assert yellow
keyword whole _Thread_local yellow
keyword whole ... yellow
keyword linestart \{\s\t\}\[\s\t\]#*\n brightmagenta
keyword whole \[\s\t\]default yellow
keyword whole linestart \[\s\t\]\{ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\}\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\]: cyan
keyword /\* brown # C11/C23 extensions:
keyword \*/ brown keyword whole alignas _keyword
keyword // brown keyword whole alignof _keyword
keyword whole constexpr _keyword
keyword whole typeof _keyword
keyword whole typeof_unqual _keyword
keyword whole static_assert _keyword
keyword whole thread_local _keyword
keyword whole _Alignas _keyword
keyword whole _Alignof _keyword
keyword whole _Atomic _keyword
keyword whole _Bool _keyword
keyword whole _Complex _keyword
keyword whole _Decimal32 _keyword
keyword whole _Decimal64 _keyword
keyword whole _Decimal128 _keyword
keyword whole _Generic _keyword
keyword whole _Imaginary _keyword
keyword whole _Noreturn _keyword
keyword whole _Static_assert _keyword
keyword whole _Thread_local _keyword
keyword '\\\{"abtnvfr\}' brightgreen keyword whole auto _datatype_scope
keyword '\\\{0123\}\{01234567\}\{01234567\}' brightgreen keyword whole extern _datatype_scope
keyword '\\'' brightgreen keyword whole register _datatype_scope
keyword '\\\\' brightgreen keyword whole static _datatype_scope
keyword '\\0' brightgreen
keyword '\{\s!"#$%&()\*\+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~嵗╯丰戍貝物洎悖停眾斯須號獄播噶擱藏霰匸<E99CB0>帊昅恘倳眑婭笫崷窙嗲睧颬睼麧緗鴇膹擨闀貘覷鏷禴矙𡜍𦶠<F0A19C8D>\}' brightgreen
# punctuation characters, sorted by ASCII code keyword whole void _datatype_void
keyword ! yellow keyword whole int _datatype
keyword % yellow keyword whole char _datatype
keyword && yellow keyword whole float _datatype
keyword & brightmagenta keyword whole double _datatype
keyword ( brightcyan keyword whole wchar_t _datatype
keyword ) brightcyan keyword whole short _datatype_mod
keyword \* yellow keyword whole long _datatype_mod
keyword \+ yellow keyword whole signed _datatype_mod
keyword , brightcyan keyword whole unsigned _datatype_mod
keyword - yellow keyword whole wchar_t _datatype
keyword / yellow keyword whole ... _keyword
keyword : brightcyan
keyword ; brightmagenta
keyword < yellow
keyword = yellow
keyword > yellow
keyword ? brightcyan
keyword [ brightcyan
keyword ] brightcyan
keyword ^ brightmagenta
keyword { brightcyan
keyword || yellow
keyword | brightmagenta
keyword } brightcyan
keyword ~ brightmagenta
context exclusive /\* \*/ brown keyword NULL _const
# Since C23:
keyword true _const
keyword false _const
keyword nullptr _const
keyword linestart \{\s\t\}\[\s\t\]#*\n _preproc_indent
keyword whole linestart \[\s\t\]\{ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\}\[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\]: _label
keyword whole \[\s\t\]default _keyword
# Comments:
keyword /\* _comment
keyword \*/ _comment
keyword // _comment
# Characters:
keyword '\\\{"abtnvfr\}' _char
keyword '\\\{0123\}\{01234567\}\{01234567\}' _char
keyword '\\'' _char
keyword '\\\\' _char
keyword '\\0' _char
keyword '\{\s!"#$%&()\*\+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~嵗╯丰戍貝物洎悖停眾斯須號獄播噶擱藏霰匸<E99CB0>帊昅恘倳眑婭笫崷窙嗲睧颬睼麧緗鴇膹擨闀貘覷鏷禴矙𡜍𦶠<F0A19C8D>\}' _char
# Punctuation characters, sorted by ASCII code:
keyword ! _punctuation
keyword % _punctuation
keyword && _punctuation
# Note: the '&' symbol uses both in the reference/address and in the bitwise operation.
keyword & _punct_bitwise
keyword ( _punct_bracket
keyword ) _punct_bracket
keyword \* _punctuation
keyword \+ _punctuation
keyword , _punct_comma
keyword . _punct_field
keyword -> _punct_field
keyword - _punctuation
keyword / _punctuation
keyword : _punct_ternary
keyword ; _punct_semicolon
keyword < _punctuation
keyword = _punctuation
keyword > _punctuation
keyword ? _punct_ternary
keyword [ _punct_sqbracket
keyword ] _punct_sqbracket
keyword ^ _punct_bitwise
keyword { _punct_operator
keyword || _punctuation
keyword | _punct_bitwise
keyword } _punct_operator
keyword ~ _punct_bitwise
# Numbers:
wholechars abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.
keyword whole 0x\{0123456789abcdefABCDEF_\}\[0123456789abcdefABCDEF_\] _num_hex
keyword whole 0\{01234567_\}\[01234567_\] _num_oct
keyword whole 0 _num_integer
keyword whole 0\{lu\} _num_integer
keyword whole \{123456789_\}\[0123456789_\] _num_integer
keyword whole \{123456789_\}\[0123456789_\]\{lu\} _num_integer
# Float-point values:
keyword whole \[0123456789_\]\.\{0123456789_\}\[0123456789_\] _num_float
keyword whole \{0123456789_\}\[0123456789_\]\.\[0123456789_\] _num_float
keyword whole \{0123456789_\}\[0123456789_\]\{eE\}\{0123456789_\}\[0123456789_\] _num_float
keyword whole \{0123456789_\}\[0123456789_\]\{eE\}\{\-\+\}\{0123456789_\}\[0123456789_\] _num_float
keyword whole \{0123456789_\}\[0123456789_\]\.\{0123456789_\}\[0123456789_\]\{eE\}\{0123456789_\}\[0123456789_\] _num_float
keyword whole \{0123456789_\}\[0123456789_\]\.\{0123456789_\}\[0123456789_\]\{eE\}\{\-\+\}\{0123456789_\}\[0123456789_\] _num_float
# Explicit float (not double):
keyword whole \[0123456789_\]\.\{0123456789_\}\[0123456789_\]f _num_float
keyword whole \{0123456789_\}\[0123456789_\]\.\[0123456789_\]f _num_float
keyword whole \{0123456789_\}\[0123456789_\]\{eE\}\{0123456789_\}\[0123456789_\]f _num_float
keyword whole \{0123456789_\}\[0123456789_\]\{eE\}\{\-\+\}\{0123456789_\}\[0123456789_\]f _num_float
keyword whole \{0123456789_\}\[0123456789_\]\.\{0123456789_\}\[0123456789_\]\{eE\}\{0123456789_\}\[0123456789_\]f _num_float
keyword whole \{0123456789_\}\[0123456789_\]\.\{0123456789_\}\[0123456789_\]\{eE\}\{\-\+\}\{0123456789_\}\[0123456789_\]f _num_float
context exclusive /\* \*/ _comment
keyword whole BUG _comment_word
keyword whole FixMe _comment_word
keyword whole FIXME _comment_word
keyword whole Note _comment_word
keyword whole NOTE _comment_word
keyword whole ToDo _comment_word
keyword whole TODO _comment_word
keyword !!\[!\] _comment_exmark
keyword ??\[?\] _comment_qnmark
spellcheck spellcheck
context exclusive // \n brown context exclusive // \n _comment
keyword whole BUG: _comment_word
keyword whole FixMe: _comment_word
keyword whole FIXME: _comment_word
keyword whole Note: _comment_word
keyword whole NOTE: _comment_word
keyword whole ToDo: _comment_word
keyword whole TODO: _comment_word
keyword !!\[!\] _comment_exmark
keyword ??\[?\] _comment_qnmark
spellcheck spellcheck
context linestart # \n brightred context linestart # \n _preproc
keyword \\\n yellow keyword \\\n _preproc_nl_esc
keyword /\**\*/ brown keyword /\**\*/ _comment
keyword //*\n brown keyword //*\n _comment
keyword "+" red keyword "+" _preproc_str
keyword <+> red keyword <+> _preproc_str
context " " green context " " _string
spellcheck spellcheck
keyword \\" brightgreen keyword \\" _string_escchar
keyword %% brightgreen keyword %% _string_specsymb
keyword %\[#0\s-\+,\]\[0123456789\*\]\[.\]\[0123456789\*\]\[L\]\{eEfgGoxX\} brightgreen keyword %\[#0\s-\+,\]\[0123456789\*\]\[.\]\[0123456789\*\]\[L\]\{eEfgGoxX\} _string_specsymb
keyword %\[0\s-\+,\]\[0123456789\*\]\[.\]\[0123456789\*\]\[hl\]\{diuxX\} brightgreen keyword %\[0\s-\+,\]\[0123456789\*\]\[.\]\[0123456789\*\]\[hl\]\{diuxX\} _string_specsymb
keyword %\[hl\]n brightgreen keyword %\[hl\]n _string_specsymb
keyword %\[-\]\[0123456789\*\]\[.\]\[0123456789\*\]s brightgreen keyword %\[-\]\[0123456789\*\]\[.\]\[0123456789\*\]s _string_specsymb
keyword %[*] brightgreen keyword %[*] _string_specsymb
keyword %c brightgreen keyword %c _string_specsymb
keyword %p brightgreen keyword %p _string_specsymb
keyword \\\{0123\}\{01234567\}\{01234567\} brightgreen keyword \\\{0123\}\{01234567\}\{01234567\} _string_specsymb
keyword \\\\ brightgreen keyword \\\\ _string_escchar
keyword \\' brightgreen keyword \\' _string_escchar
keyword \\\{abtnvfr\} brightgreen keyword \\\{abtnvfr\} _string_escchar