Экранирование символов в файле раскладки - PullRequest
0 голосов
/ 29 мая 2019

Вот таблица ключей для автоматического сопряжения файлов звездочек (для Markdown и AsciiDoc).Оно работает.Вопросы:

1) Должен ли я избегать звездочек в 6-й строке 1-го блока?

2) В моих тестах экранирование в этой строке не имеет значения.Но почему?Если вы попытаетесь удалить экранирование в 5-й и 6-й строках последнего блока (а также в строке в 5-м блоке), это приведет к некорректному поведению.Таким образом, для экранирования требуется .Но, кажется, это не требуется в 1-м блоке.Это приводит меня в замешательство.

[
    // Auto-pair *
    { "keys": ["*"], "command": "insert_snippet", "args": {"contents": "*$0*"}, "context":
        [
            { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
            { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
            { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true },
            { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\\*a-zA-Z0-9_]$", "match_all": true }, // --- THIS line ---
            { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.other - punctuation.definition.string.end", "match_all": true }
        ]
    },
    { "keys": ["*"], "command": "insert_snippet", "args": {"contents": "*${0:$SELECTION}*"}, "context":
        [
            { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
            { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }
        ]
    },
    { "keys": ["*"], "command": "move", "args": {"by": "characters", "forward": true}, "context":
        [
            { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
            { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
            { "key": "following_text", "operator": "regex_contains", "operand": "^\\*", "match_all": true }, // --- THIS line ---
            { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true },
            { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.other - punctuation.definition.string.end", "match_all": true },
        ]
    },
    { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context":
        [
            { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
            { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
            { "key": "preceding_text", "operator": "regex_contains", "operand": "\\*$", "match_all": true }, // --- THIS line ---
            { "key": "following_text", "operator": "regex_contains", "operand": "^\\*", "match_all": true }, // --- THIS line ---
            { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true },
            { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.other - punctuation.definition.string.end", "match_all": true },
        ]
    },
]

Обновление: на самом деле, будет лучше использовать другое регулярное выражение:

- [*a-zA-Z0-9_]$
+ (^[*\\s]*$)|([*a-zA-Z0-9_]$)

Таким образом, звездочки не будут дублироваться в началестроки, когда вы будете работать с маркированными списками.

1 Ответ

1 голос
/ 29 мая 2019

В регулярных выражениях оператор * является специальным и указывает ноль или более повторений предыдущего атома . Поэтому, чтобы соответствовать буквальному символу *, вам нужно экранировать его как \* (или в JSON \\*), чтобы указать движку регулярных выражений, что вы имеете в виду литерал *, а не применять специальное значение.

Конструкция [] представляет набор символов , который соответствует любому из символов в наборе. Внутри набора символов единственными символами, которые имеют особое значение для механизма регулярных выражений, являются ] (закрывает набор), \ (все еще должен быть в состоянии сбежать), - (указывает диапазон символов) и ^ (отрицает набор и является особенным, только когда это первый символ), поэтому только те символы должны быть экранированы внутри набора.

Поскольку набор символов означает соответствует любому из следующих символов , специальное значение * не применяется, поэтому внутри набора символов его не нужно экранировать (хотя вы можете сделайте это, если хотите).

...