Как создать фрагмент, который вставляет \ {\}, используя escape-символы? - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь создать фрагмент в возвышенном тексте, который, когда я нажимаю Ctrl + Shift + [вставляет фрагмент \{\}, но у меня возникают проблемы при разработке, как использовать escape-символы для этого.

Вот что у меня есть:

{
    "keys": ["ctrl+shift+["], 
    "command": "insert_snippet", 
    "args": {
        "contents": "\\{\\}"
    }
}

, но когда я использую сочетание клавиш, он вставляет только {} без обратной косой черты!Это странно, потому что когда я изменяю его на "\\", то получается \, но когда что-то приходит после двух обратных косых черт, оно игнорирует обратную косую черту.

Я нашел обходные пути, используяпакет ChainOfCommand, который вставляет каждый символ в отдельности, например так:

{ 
    "keys": ["ctrl+shift+["], 
    "command": "chain", 
    "args": {
        "commands": [
            ["insert_snippet", {"contents": "\\"}],
            ["insert_snippet", {"contents": "{"}],
            ["insert_snippet", {"contents": "\\"}],
            ["insert_snippet", {"contents": "}"}]
        ]
    }
}

, но проблема в том, что если я затем выполню отмену ctrl-z, он будет удалять каждый символ по одному, а не удалятьвесь фрагмент, который раздражает.Кроме того, это всего лишь принцип, я должен быть в состоянии сделать это одним фрагментом, я уверен!

Кто-нибудь знает, как я могу заставить его работать?

1 Ответ

0 голосов
/ 25 мая 2018

Как бы не было интуитивно понятно, при использовании следующей привязки клавиш будет вставлено \{\}:

{
    "keys": ["ctrl+shift+["], 
    "command": "insert_snippet", 
    "args": {
        "contents": "\\\\{\\\\}"
    }
},

Причина этого объясняется по адресу: https://github.com/SublimeTextIssues/Core/issues/1878#issuecomment-328133400:

Из-за совместимости с фрагментами TextMate следующие символы должны быть экранированы, чтобы быть буквальными:

\, $, {, }

Любые другие \{CHAR}будет производиться дословно.Это объясняет, почему один обратный слеш хорош, но два становятся одним.

В случае, если это поможет, вы также можете выполнить следующее в консоли ST, чтобы увидеть разницу, которую делает экстра-экранирование JSON(по сравнению, например, с тем же содержимым в файле .sublime-snippet):

view.run_command('insert_snippet', { 'contents': r'\\{\\}' })
...