root/misc/syntax/c.syntax

/* [previous][next][first][last][top][bottom][index][help]  */
# 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
    keyword whole asm _keyword
    keyword whole break _keyword
    keyword whole case _keyword
    keyword whole const _keyword
    keyword whole continue _keyword
    keyword whole do _keyword
    keyword whole else _keyword
    keyword whole enum _keyword
    keyword whole for _keyword
    keyword whole goto _keyword
    keyword whole if _keyword
    keyword whole inline _keyword
    keyword whole restrict _keyword
    keyword whole return _keyword
    keyword whole sizeof _keyword
    keyword whole struct _keyword
    keyword whole switch _keyword
    keyword whole typedef _keyword
    keyword whole union _keyword
    keyword whole volatile _keyword
    keyword whole while _keyword
 
    # C11/C23 extensions:
    keyword whole alignas _keyword
    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 whole auto _datatype_scope
    keyword whole extern _datatype_scope
    keyword whole register _datatype_scope
    keyword whole static _datatype_scope
 
    keyword whole void _datatype_void
    keyword whole int _datatype
    keyword whole char _datatype
    keyword whole float _datatype
    keyword whole double _datatype
    keyword whole wchar_t _datatype
    keyword whole short _datatype_mod
    keyword whole long _datatype_mod
    keyword whole signed _datatype_mod
    keyword whole unsigned _datatype_mod
    keyword whole wchar_t _datatype
    keyword whole ... _keyword
 
    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{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\}' _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
 
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
 
context linestart # \n _preproc
    keyword \\\n _preproc_nl_esc
    keyword /\**\*/ _comment
    keyword //*\n _comment
    keyword "+" _preproc_str
    keyword <+> _preproc_str
 
context " " _string
    spellcheck
    keyword \\" _string_escchar
    keyword %% _string_specsymb
    keyword %\[#0\s-\+,\]\[0123456789\*\]\[.\]\[0123456789\*\]\[L\]\{eEfgGoxX\} _string_specsymb
    keyword %\[0\s-\+,\]\[0123456789\*\]\[.\]\[0123456789\*\]\[hl\]\{diuxX\} _string_specsymb
    keyword %\[hl\]n _string_specsymb
    keyword %\[-\]\[0123456789\*\]\[.\]\[0123456789\*\]s _string_specsymb
    keyword %[*] _string_specsymb
    keyword %c _string_specsymb
    keyword %p _string_specsymb
    keyword \\\{0123\}\{01234567\}\{01234567\} _string_specsymb
    keyword \\\\ _string_escchar
    keyword \\' _string_escchar
    keyword \\\{abtnvfr\} _string_escchar

/* [previous][next][first][last][top][bottom][index][help]  */