在开发一个比较大的工程项目时,有时候我们会写一些比较长的代码块。如果没有良好的插件做辅助,单单凭借肉眼很难看清整个代码的层次关系。这时候,一款得心应手的代码块高亮工具就显得十分可贵。

像上面这个 c++ 代码,我们可以非常清晰的看到:

  • 左侧边栏的 () 是否补全
  • 在代码内部的逻辑层次

以上的实现是通过在 Sublime 安装插件 BracketHighlighter 来完成的。

项目地址:BracketHighlighter Documentation

安装

打开 Sublime,使用 Shift+Ctrl+P 开始搜索软件名 BracketHighlighter,然后安装就可以了。

配置

以下是我的配置方案

{
    // Debug logging
    "debug_enable": false,

    // When only either the left or right bracket can be found
    // this defines if the unmatched bracket should be shown.
    "show_unmatched": true,

    // Do the opposite of `show_unmatched` for the languages listed below
    "show_unmatched_exceptions": [],

    // Enable high visibility by default when sublime starts up
    // If sublime is already running and this gets changed,
    // you will not see any changes (restart required to see change)
    "high_visibility_enabled_by_default": false,

    // Experimental: Creates a visible bar at the beginning of all lines between
    // multiline bracket spans.
    // "content_highlight_bar": false,
    "content_highlight_bar": true,
    // Show hover popup
    // This will show a hover popup when mousing over
    // the visible bracket if the other
    // highlighted matching bracket is off screen.
    // It will show line text of the off screen bracket -/+ 128 chars
    // from the bracket start and end points.
    // A link will be available allowing the user to click and jump to
    // the other bracket.
    "show_offscreen_bracket_popup": true,

    // If enabled with `show_offscreen_bracket_popup`,the popup will be shown
    // even if brackets are onscreen.
    // "show_bracket_popup_always": false,
    "show_bracket_popup_always": true,

    // Adjust char per line context of bracket popup.
    "popup_char_context": 120,

    // Adjust number of lines of additional context
    // that are shown when brackets are vertically off screen.
    // Specified line count is split to context before and after the target line.
    // So a value of 4 would give you two lines of context before and two lines after.
    "popup_line_context": 2,

    // Experimental: Use `popup_bracket_emphasis` to customize the popup's bracket emphasis color
    "use_custom_popup_bracket_emphasis": false,

    // Experimental: Specify the scope (to get color) to emphasize the off screen bracket
    // in popups.  Alternatively you can use a hex value in the form `#rgb` or `#rrggbb`.
    "popup_bracket_emphasis": "keyword",

    // Experimental: Align the content highlight bar at the bracket indent level
    // "align_content_highlight_bar": false,
    "align_content_highlight_bar": true,

    // Experimental: Allow bracket highlighter to search in widgets.
    // Most widgets use Plain Text which BH should ignore,
    // But regex find views views are usually regular expression
    // Which should be the only views to trigger BH.
    "search_in_widgets": false,

    // Show brackets in the minimap.
    // Depending on your highlight style, regions may not be visible in minimap.
    // "underline" won't show up due to it being a style consisting of
    // multiple zero width selections to create a fat underline.
    // But the following styles should show up fine as they are normal regions styles:
    //     - thin_underline
    //     - solid
    //     - outline
    //     - squiggly
    //     - stippled
    // "show_in_minimap": false,
    "show_in_minimap": true,

    // High visibility style and color for high visibility mode
    // (`solid`|`outline`|`underline`)
    // ST3 has additional options of (`thin_underline`|`squiggly`|`stippled`)
    "high_visibility_style": "outline",

    // (scope|__default__|__bracket__)
    "high_visibility_color": "__bracket__",

    // Match brackets only when the cursor is touching the inside of the bracket
    "match_only_adjacent": false,

    // Outside adjacent bracket matching
    "bracket_outside_adjacent": true,

    // Experimental: Special matching mode for block cursor.
    // Essentially, this provides a matching mode that makes a little more
    // sense to some in regards to the visual representation of block cursors.
    // This will ignore `bracket_outside_adjacent`.
    "block_cursor_mode": false,

    // When `bracket_outside_adjacent` is set, and a plugin command explicitly sets
    // `no_outside_adj` to `None` instead of `true` or the default `false`,
    // this value will be used.
    "ignore_outside_adjacent_in_plugin": true,

    // When `block_cursor_mode` is set, and a plugin command explicitly sets
    // "no_block_mode" to `None` instead of `true` or the default `false`,
    // this value will be used.
    "ignore_block_mode_in_plugin": true,

    // Character threshold to search
    "search_threshold": 5000,

    // Ignore threshold
    "ignore_threshold": false,

    // Set mode for string escapes to ignore (`regex`|`string`)
    "bracket_string_escape_mode": "string",

    // Set max number of multi-select brackets that will be searched automatically
    "auto_selection_threshold" : 10,

    // Enable this to completely kill highlighting if "auto_selection_threshold"
    // is exceeded.  Default is to highlight up to the "auto_selection_threshold".
    "kill_highlight_on_threshold": true,

    // Disable gutter icons when doing multi-select
    "no_multi_select_icons": false,

    // Rules that define the finding and matching of brackets
    // that are contained in a common scope.
    // Useful for bracket pairs that are the same but
    // share a common scope.  Brackets are found by
    // Finding the extent of the scope and using regex
    // to look at the beginning and end to identify bracket.
    // Use only if they cannot be targeted with traditional bracket
    // rules.
    "scope_brackets": [
        // Quotes
        {
            "name": "py_single_quote",
            "open": "(?:u|b|f)?r?((?:'')?')",
            "close": "((?:'')?')",
            "style": "single_quote",
            "scopes": ["string", "meta.string"],
            "language_filter": "whitelist",
            "language_list": [
                "Python",
                "PythonImproved",
                "MagicPython"
            ],
            "sub_bracket_search": "true",
            "plugin_library": "bh_modules.pyquotes",
            "enabled": true
        },
        {
            "name": "py_double_quote",
            "open": "(?:u|b|f)?r?((?:\"\")?\")",
            "close": "((?:\"\")?\")",
            "style": "double_quote",
            "scopes": ["string", "meta.string"],
            "language_filter": "whitelist",
            "language_list": [
                "Python",
                "PythonImproved",
                "MagicPython"
            ],
            "sub_bracket_search": "true",
            "plugin_library": "bh_modules.pyquotes",
            "enabled": true
        },
        {
            "name": "csharp_double_quote",
            "open": "\\$?@?(\")",
            "close": "(\")",
            "style": "double_quote",
            "scopes": ["string.quoted.double", "meta.string.interpolated"],
            "language_filter": "whitelist",
            "language_list": ["C#"],
            "sub_bracket_search": "true",
            "enabled": true
        },
        {
            "name": "single_quote",
            "open": "(')",
            "close": "(')",
            "style": "single_quote",
            "scopes": [
                "meta.attribute-with-value.style.html -entity.other.attribute-name.style.html -punctuation.separator.key-value.html",
                "source.ruby string.quoted, source.ruby meta.interpolation",
                "string",
                "string.quoted"
            ],
            "language_filter": "blacklist",
            "language_list": ["Plain text", "Hex"],
            "sub_bracket_search": "true",
            "enabled": true
        },
        {
            "name": "double_quote",
            "open": "(\")",
            "close": "(\")",
            "style": "double_quote",
            "scopes": [
                "meta.attribute-with-value.style.html -entity.other.attribute-name.style.html -punctuation.separator.key-value.html",
                "source.ruby string.quoted, source.ruby meta.interpolation",
                "string",
                "string.quoted"
            ],
            "language_filter": "blacklist",
            "language_list": ["Plain text", "Hex"],
            "sub_bracket_search": "true",
            "enabled": true
        },
        {
            "name": "backtick_quote",
            "open": "(`)",
            "close": "(`)",
            "style": "single_quote",
            "scopes": [
                "string.interpolated.ruby",
                "string.interpolated.backtick.shell",
                "string.template-string.js",
                "string.template.js, meta.template.expression.js"
            ],
            "language_filter": "whitelist",
            "language_list": ["Ruby", "Shell-Unix-Generic", "Bash", "JavaScript", "JavaScriptNext"],
            "sub_bracket_search": "true",
            "enabled": true
        },
        // Regex for different Languages
        {
            "name": "jsregex",
            "open": " *(/)",
            "close": "(/)[igm]*",
            "style": "regex",
            "scopes": ["string"],
            "language_filter": "whitelist",
            "language_list": ["JavaScript"],
            "sub_bracket_search": "true",
            "enabled": true
        },
        {
            "name": "perlregex",
            "open": "(?:m|s|tr)(.|\n)",
            "close": "(.|\n)(?:[igmos]*)",
            "style": "regex",
            "scopes": ["string.regexp"],
            "language_filter": "whitelist",
            "language_list": ["Perl"],
            "sub_bracket_search": "true",
            "enabled": true
        },
        {
            "name": "rubyregex",
            "open": " *(/)",
            "close": "(/)[imxo]*",
            "style": "regex",
            "scopes": ["string"],
            "language_filter": "whitelist",
            "language_list": ["Ruby", "RSpec", "Better RSpec"],
            "sub_bracket_search": "true",
            "enabled": true
        },
        // Markdown
        {
            "name": "mditalic",
            "open": "(\\*|_)",
            "close": "(\\*|_)",
            "style": "default",
            "scopes": ["markup.italic"],
            "language_filter": "whitelist",
            "language_list": ["Markdown", "Multimarkdown", "GithubFlavoredMarkdown", "Markdown Extended"],
            "sub_bracket_search": "true",
            "enabled": true
        },
        {
            "name": "mdbold",
            "open": "(\\*\\*|__)",
            "close": "(\\*\\*|__)",
            "style": "default",
            "scopes": ["markup.bold"],
            "language_filter": "whitelist",
            "language_list": ["Markdown", "Multimarkdown", "GithubFlavoredMarkdown", "Markdown Extended"],
            "sub_bracket_search": "true",
            "enabled": true
        },
        {
            "name": "mdcodeinline",
            "open": "(`+)",
            "close": "(`+)",
            "style": "default",
            "scopes": ["markup.raw.inline.markdown"],
            "language_filter": "whitelist",
            "language_list": ["Markdown", "Multimarkdown", "GithubFlavoredMarkdown", "Markdown Extended"],
            "sub_bracket_search": "true",
            "plugin_library": "bh_modules.mdcode",
            "enabled": true
        },
        {
            "name": "mdcodeblock",
            "open": "\\s*(`{3,}|~{3,})",
            "close": "(`{3,}|~{3,})\\n?",
            "style": "default",
            "scopes": ["markup.raw.block.fenced.markdown, markup.raw.block.markdown.fenced"],
            "language_filter": "whitelist",
            "language_list": ["Markdown", "Multimarkdown", "GithubFlavoredMarkdown", "Markdown Extended"],
            "plugin_library": "bh_modules.mdcode",
            "sub_bracket_search": "true",
            "enabled": true
        },
        // LaTeX
        {
            "name": "latexmath_inline",
            "open": "(\\$)",
            "close": "(\\$)",
            "style": "default",
            "scopes": ["string.other.math.tex", "meta.environment.math.inline.dollar.latex"],
            "language_filter": "whitelist",
            "language_list": ["LaTeX", "LaTeX (TikZ)", "knitr (Rnw)"],
            "sub_bracket_search": "true",
            "enabled": true
        }
    ],

    // Rule definitions for finding and matching brackets.
    // Brackets are found by using regex and can use scope
    // qualifiers exclude certain matches.
    // Once all matches are found, the closest pair surrounding
    // the cursor are selected.
    "brackets": [
        // OCaml
        {
            "name": "ocaml_comment",
            "open": "(\\(\\*)",
            "close": "(\\*\\))",
            "style": "default",
            "scope_exclude": ["-comment"],
            "language_filter": "whitelist",
            "language_list": ["OCaml"],
            "sub_bracket_search": "false",
            "enabled": true
        },
        // Basic brackets
        {
            "name": "curly",
            "open": "(\\{)",
            "close": "(\\})",
            "style": "curly",
            "scope_exclude": [
                "string",
                "comment",
                "source.regexp constant.character.escape",
                "source.yaml-tmlanguage constant.character.escape"
            ],
            "scope_exclude_exceptions": ["text.tex string.other.math"],
            "language_filter": "blacklist",
            "language_list": ["Plain text", "Hex"],
            "find_in_sub_search": "true",
            "ignore_string_escape": true,
            "enabled": true
        },
        {
            "name": "round",
            "open": "(\\()",
            "close": "(\\))",
            "style": "round",
            "scope_exclude_exceptions": [
                "text.tex string.other.math",
                "punctuation.definition.string.begin.shell",
                "punctuation.definition.string.end.shell"
            ],
            "scope_exclude": [
                "string",
                "comment",
                "source.regexp constant.character.escape",
                "keyword.control.conditional.patterns.end.shell",
                "source.yaml-tmlanguage constant.character.escape"
            ],
            "language_filter": "blacklist",
            "language_list": ["Plain text", "Hex", "RTF"],
            "find_in_sub_search": "true",
            "ignore_string_escape": true,
            "enabled": true
        },
        //XML
        {
            "name":"xml_cdata",
            "open":"(<!\\[CDATA\\[)",
            "close":"(\\]\\]>)",
            "style":"default",
            "language_filter": "whitelist",
            "language_list": ["XML"],
            "scope_exclude": [
                "comment"
            ],
            "enabled":true
        },
        {
            "name": "square",
            "open": "(\\[)",
            "close": "(\\])",
            "style": "square",
            "scope_exclude": [
                "string",
                "source.regexp constant.character.escape",
                "comment"
            ],
            "scope_exclude_exceptions": ["text.tex string.other.math", "source.yaml-tmlanguage meta.value -constant.character.escape"],
            "language_filter": "blacklist",
            "language_list": ["Plain text", "Hex", "RTF"],
            "find_in_sub_search": "true",
            "ignore_string_escape": true,
            "enabled": true
        },
        // PHP Angle
        {
            "name": "php_angle",
            "open": "(<\\?)(?:php)?",
            "close": "(\\?>)",
            "style": "angle",
            "scope_exclude": ["string", "comment", "keyword.operator"],
            "language_filter": "whitelist",
            "language_list": ["HTML", "HTML 5"],
            "enabled": true
        },
        // Angle
        {
            "name": "angle",
            "open": "(<)(?=[^?%]|$)",
            "close": "(?:(?<=[^?%])|(?<=^))(>)",
            "style": "angle",
            "scope_exclude": [
                "string",
                "comment",
                "keyword.operator",
                "source.ruby.rails.embedded.html",
                "source.ruby.embedded.html",
                "storage.type.function.arrow.js",
                "punctuation.accessor.php",
                "punctuation.accessor.arrow.php",
                "source.php meta.embedded.html punctuation.section.embedded.begin.php",
                "source.php meta.embedded.js punctuation.section.embedded.begin.php",
                "source.php meta.embedded.css punctuation.section.embedded.begin.php"
            ],
            "language_filter": "whitelist",
            "language_list": [
                "HTML",
                "HTML 5",
                "XML",
                "PHP",
                "HTML (Rails)",
                "HTML (Jinja Templates)",
                "HTML (Jinja2)",
                "HTML (Twig)",
                "HTML (Django)",
                "HTML+CFML",
                "ColdFusion",
                "ColdFusionCFC",
                "laravel-blade",
                "blade",
                "Handlebars",
                "AngularJS",
                "Java Server Pages (JSP)"
            ],
            "plugin_library": "bh_modules.tags",
            "enabled": true
        },
        // CSSedit groups
        {
            "name": "cssedit_groups",
            "open": "(/\\* *@group .*\\*/)",
            "close": "(/\\* *@end *\\*/)",
            "style": "default",
            "scope_exclude": [],
            "language_filter": "whitelist",
            "language_list": ["CSS"],
            "enabled": true
        },
        // Ruby embedded HTML
        // !!! May conflict with `php_keywords` if enabled in same file !!!
        {
            "name": "ruby_embedded_html",
            "open": "((?:(?<=<%)|(?<=^)|(?<==)|(?<=<<))\\s*\\b(?:if|begin|case)\\b(?!:)|(?:(?<=<%)|(?<=^))\\s*(?:(?:private|public|protected)\\s*)?def\\b[\\p{Ll}\\p{Lu}]*\\b(?!:)|(?:(?<=<%)|(?<=^))\\s*\\b(?:for|until|unless|while|class|module)\\b(?!:)|(?<!:)\\bdo\\b(?!:)|(?<=return)\\s*\\b(?:begin|case|for|until|while|class|module)\\b(?!:))",
            "close": "(?<=[\\s;])(end)\\b(?!:)",
            "style": "default",
            "scope_exclude": ["text.html", "source", "comment", "string"],
            "scope_exclude_exceptions": [
                "source.ruby.rails.embedded.html -comment -string",
                "source.ruby.embedded.html -comment -string"
            ],
            "plugin_library": "bh_modules.rubykeywords",
            "language_filter": "whitelist",
            "language_list": ["HTML", "HTML 5", "HTML (Rails)"],
            "enabled": true
        },
        // Ruby conditional statements
        {
            "name": "ruby",
            "open": "((?:(?<=^)|(?<==)|(?<=<<))\\s*\\b(?:if|begin|case)\\b(?!:)|^\\s*(?:(?:private|public|protected)\\s*)?def\\b[\\p{Ll}\\p{Lu}]*\\b(?!:)|^\\s*\\b(?:for|until|unless|while|class|module)\\b(?!:)|(?<!:)\\bdo\\b(?!:)|(?<=return)\\s*\\b(?:begin|case|for|until|while|class|module)\\b(?!:))",
            "close": "(?<=[\\s;])(end)\\b(?!:)",
            "style": "default",
            "scope_exclude": ["string", "comment"],
            "plugin_library": "bh_modules.rubykeywords",
            "language_filter": "whitelist",
            "language_list": ["Ruby", "RSpec", "Better RSpec", "Ruby on Rails"],
            "enabled": true
        },
        // C/C++ compile switches
        {
            "name": "c_compile_switch",
            "open": "\\#[ \\t]*(if|ifdef|ifndef)\\b",
            "close": "\\#[ \\t]*(endif)\\b",
            "style": "c_define",
            "scope_exclude": ["string", "comment"],
            "language_filter": "whitelist",
            "language_list": ["C++", "C", "Objective-C++", "Objective-C", "CCpp", "C Improved"],
            "enabled": true
        },
        // PHP conditional keywords
        // !!! May conflict with `ruby_embedded_html` if enabled in same file !!!
        {
            "name": "php_keywords",
            "open": "(?:(?<=^)|(?<=<\\?php)|(?<=<\\?))\\s*(if|foreach|for|while|switch)\\b(?=.*?\\)\\s*:\\s*(?://.*?|/\\*.*?\\*/\\s*?)?(?:\\?>|$))",
            "close": "(?:(?<=^)|(?<=<\\?php)|(?<=<\\?))\\s*(endif|endfor|endforeach|endwhile|endswitch)\\b(?=\\s*(?:;|;?\\?>))",
            "style": "default",
            "language_filter": "whitelist",
            "scope_exclude": ["string", "comment", "text.html"],
            "scope_exclude_exceptions": [
                "source.php -comment -string"
            ],
            "plugin_library": "bh_modules.phpkeywords",
            "language_list": [
                "HTML",
                "HTML 5",
                "PHP",
                "HTML+CFML",
                "ColdFusion",
                "ColdFusionCFC"
            ],
            "enabled": true
        },
        // Erlang conditional statements
        {
            "name": "erlang",
            "open": "\\s*(\\b(?:if|case|begin|try|fun(?=\\s*\\()|receive)\\b)",
            "close": "\\b(end)\\b",
            "style": "default",
            "scope_exclude": ["string", "comment"],
            "language_filter": "whitelist",
            "plugin_library": "bh_modules.lowercase",
            "language_list": ["Erlang", "HTML (Erlang)"],
            "enabled": true
        },
        //Bash
        {
            "name": "bash",
            "open": "(?:(?<!\\\\\\n)(?:;|^|&|\\|)\\s*)\\b(if|case|while|select|until|for)\\s",
            "close": "(?:(?<!\\\\\\n)(?:;|^)\\s*)\\b(fi|esac|done)(?=;|\\s|$)",
            "style": "default",
            "scope_exclude": ["string", "comment"],
            "plugin_library": "bh_modules.bashsupport",
            "language_filter": "whitelist",
            "language_list": ["Shell-Unix-Generic", "Bash"],
            "enabled": true
        },
        //Fish shell
        {
            "name": "fish",
            "open": "(?:(?<!\\\\\\n)(?:;|^|&|\\||and|or|not)\\s*)\\b(begin|if|while|for|switch|function)(?:;|\\s)",
            "close": "(?:(?<!\\\\\\n)(?:;|^)\\s*)\\b(end)(?=;|\\s|$)",
            "style": "default",
            "scope_exclude": ["string", "comment"],
            "language_filter": "whitelist",
            "language_list": ["fish"],
            "enabled": true
        },
        // Lua
        {
            "name": "lua",
            "open": "(?:(?<=[\\s;])|(?<=^))(if|function|do|repeat)\\b",
            "close": "(?:(?<=[\\s;])|(?<=^))(end|until)\\b",
            "style": "default",
            "scope_exclude": ["string", "comment"],
            "plugin_library": "bh_modules.luakeywords",
            "language_filter": "whitelist",
            "language_list": ["Lua"],
            "enabled": true
        },
        // LaTeX
        {
            "name": "latexenv",
            "open": "(\\\\begin{[^}]*})",
            "close": "(\\\\end{[^}]*})",
            "style": "tag",
            "scope_exclude": ["comment"],
            "plugin_library": "bh_modules.latexenvironments",
            "language_filter": "whitelist",
            "language_list": ["LaTeX", "LaTeX (TikZ)", "knitr (Rnw)"],
            "sub_bracket_search": "true",
            "enabled": true
        },
        // Pascal
        {
            "name": "pascal",
            "open": "(?:(?<=^)|(?<=[\\s;]))(try|(?<=\\=\\s)(?:class|record|interface)|begin|repeat)\\b",
            "close": "(?<=[\\s;])(end(?=[;\\s])|until(?=\\s))",
            "style": "default",
            "scope_exclude": ["string", "comment"],
            "plugin_library": "bh_modules.pascalkeywords",
            "language_filter": "whitelist",
            "language_list": ["Pascal"],
            "enabled": true
        },
        // Elixir
        {
            "name": "elixir",
            "open": "\\b(do$|fn)\\b",
            "close": "\\b(end)\\b",
            "style": "default",
            "scope_exclude": ["string", "comment"],
            "language_filter": "whitelist",
            "language_list": ["Elixir"],
            "enabled": true
        },
        // CMake
        {
            "name": "cmake",
            "open": "\\b(foreach|function|if|macro|while)\\b",
            "close": "\\b(end(?:foreach|function|if|macro|while))\\b",
            "style": "default",
            "scope_exclude": ["-keyword.cmake"],
            "plugin_library": "bh_modules.cmakekeywords",
            "language_filter": "whitelist",
            "language_list": ["CMake"],
            "enabled": true
        },
        // `SINUMERIK 840D SL G-Code`
        {
            "name": "s840d_gcode",
            "open": "\\b(IF(?!.*GOTO)|FOR|WHILE|REPEAT(?!.*GOTO))\\b",
            "close": "\\b(END(?:IF|FOR|WHILE)|UNTIL)\\b",
            "style": "tag",
            "scope_exclude": ["string", "comment"],
            "plugin_library": "bh_modules.s840d_gcode",
            "language_filter": "whitelist",
            "language_list": ["s840d_gcode"],
            "enabled": true
        },
        // `SINUMERIK 840D SL RunMyHmi`
        {
            "name": "s840d_hmi",
            "open": "^\\s*(//[ABGMS]|ACTIVATE|CHANGE|FOCUS|IF|LOAD|UNLOAD|OUTPUT|PRESS|SUB)\\b",
            "close": "^\\s*(//END|END_(?:ACTIVATE|CHANGE|FOCUS|IF|LOAD|UNLOAD|OUTPUT|PRESS|SUB))\\b",
            "style": "tag",
            "scope_exclude": ["string", "comment"],
            "plugin_library": "bh_modules.s840d_hmi",
            "language_filter": "whitelist",
            "language_list": ["s840d_hmi"],
            "enabled": true
        }
    ],

    // `user_scope_brackets` and `user_brackets` will be appended
    // to the tail of scope_brackets and brackets respectively
    // If you have custom rules that you don't want to commit to
    // the official list, and do not need to be inserted before
    // one of the official definitions, this is a good place to
    // put yours rules and keep in sync with the defaults.
    // If you want to disable all gutter icons, please set icon
    // to none for all region with user_bracket_styles
    "user_scope_brackets": [],
    "user_brackets": [],
    "user_bracket_styles": {},

    // Define region highlight styles
    "bracket_styles": {
        // `default` and `unmatched` styles are special
        // styles. If they are not defined here,
        // they will be generated internally with
        // internal defaults.

        // `default` style defines attributes that
        // will be used for any style that does not
        // explicitly define that attribute.  So if
        // a style does not define a color, it will
        // use the color from the "default" style.
        "default": {
            "icon": "dot",
            // Support the old convention of `brackethighlighter.default`
            // for themes that already provide something.
            // As this has always been the only one we've provided
            // by default, all the others will use region-ish colors.
            "color": "region.yellowish brackethighlighter.default",
            "style": "underline"
        },

        // This particular style is used to highlight
        // unmatched bracket pairs.  It is a special
        // style.
        "unmatched": {
            "icon": "question",
            "color": "region.redish",
            "style": "outline"
        },
        // User defined region styles
        "curly": {
            "icon": "curly_bracket",
            "color": "region.yellowish",
            "style": "underline"
        },
        "round": {
            "icon": "round_bracket",
            "color": "region.yellowish"
            // "style": "underline"
        },
        "square": {
            "icon": "square_bracket",
            "color": "region.yellowish"
            // "style": "underline"
        },
        "angle": {
            "icon": "angle_bracket",
            "color": "region.orangish"
            // "style": "underline"
        },
        "tag": {
            "icon": "tag",
            "color": "region.orangish"
            // "style": "underline"
        },
        "c_define": {
            "icon": "hash",
            "color": "region.yellowish"
            // "style": "underline"
        },
        "single_quote": {
            "icon": "single_quote",
            "color": "region.greenish"
            // "style": "underline"
        },
        "double_quote": {
            "icon": "double_quote",
            "color": "region.greenish"
            // "style": "underline"
        },
        "regex": {
            "icon": "star",
            "color": "region.greenish"
            // "style": "underline"
        }
    }
}