2017-02-05 17 views
2

Чтобы настроить поведение Sublime Text относительно того, когда для отступа новой строки, в зависимости от текущей строки, можно изменить whatever.tmPreferences файл соответствующей установки increaseIndentPattern и decreaseIndentPattern варианты, как показано, например, в this other answer.Как сделать Sublime Text 3 отступа новой строки, когда курсор находится внутри скобок (или другие символы)

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

[<cursor here>] 

с курсором между квадратными brakets, нажав enter Я хочу следующий результат:

[ 
    <cursor here> 
] 

Это, например, то, что происходит при изменении файла xml, нажимает один из двух скобок, например, в <sometag><cursor here></sometag>.

Я попытался заглянуть в файлы tmPreferences для xml, но безрезультатно.

Аналогичный вопрос был задан here, но настоящее один отличается по нескольким причинам:

  1. Я хочу, чтобы это поведение будет осуществляться только для определенных расширений файлов, и быть погруженных с пакетом , Поэтому я также спрашиваю, куда именно я должен поместить инструкции для этого пользовательского привязки клавиш.
  2. В связанном вопросе вопрос проще: просто правильно добавить и отменить новые строки между некоторыми фигурными скобками. Мне не просто (как мне), как обобщать это поведение, как в приведенном выше примере, в котором мы хотим использовать новую строку между XML-подобными тегами, так как в этом случае нам придется как-то справляться с регулярными выражениями и, чтобы убедиться, что левая и правильные шаблоны совпадают.

Как можно реализовать это поведение?

+0

Возможный дубликат [Как установить поведение отступов в скобках в ST3] (http://stackoverflow.com/questions/41456641/how-to-set-bracket-indentation-behavior-in-st3) –

+0

@KeithHall благодарит за связь. Это действительно очень связано, но на самом деле не прямой ответ. Например, в случае 'xml ', показанного в сообщении, я не могу найти файл' .sublime-keymap' в папке 'XML' в' Packages', поэтому я не уверен, что этот ключ был установлен. – glS

+0

Ваши привязки ключевых слов пользователя всегда находятся в вашем пакете 'User', они не находятся в пакете, связанном с тем, где вы хотите их использовать. Чтобы привязки были связаны только для файла XML, вам просто нужно добавить дополнительный контекст, который проверяет, что это файл XML. Посмотрите на самую последнюю привязку в файле привязки ключевых слов по умолчанию для примера. – OdatNurd

ответ

3

Чтобы сделать привязку для ключей, которая будет поставляться вместе с пакетом, создайте a Default.sublime-keymap file in your package.

Обычно Sublime Text рассматривает синтаксис, используемый для выделения документа, в отличие от используемых расширений файлов, для определения того, активны ли ключевые слова/плагины и т. Д. Это в основном так, что оно будет работать с файлами, еще не сохранен. Если вы хотите следовать этому руководству, вы можете использовать контекст связывания ключей selector. В случае файлов XML вы, вероятно, захотите использовать source.xml. В противном случае вам нужно будет создать EventListener, который определяет метод on_query_context для проверки view.file_name(). Вы можете использовать метод os.path.splitext для извлечения расширения файла.

Если вы действительно имеет дело с XML, то вы можете использовать по умолчанию auto_indent_tag привязки по вдохновению:

{ "keys": ["enter"], "command": "auto_indent_tag", "context": 
    [ 
     { "key": "setting.auto_indent", "operator": "equal", "operand": true }, 
     { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, 
     { "key": "selector", "operator": "equal", "operand": "punctuation.definition.tag.begin", "match_all": true }, 
     { "key": "preceding_text", "operator": "regex_contains", "operand": ">$", "match_all": true }, 
     { "key": "following_text", "operator": "regex_contains", "operand": "^</", "match_all": true }, 
    ] 
}, 

построить что-то вроде:

{ "keys": ["enter"], "command": "insert_snippet", "args": { "contents": "\n\t$1\n" }, "context": 
    [ 
     { "key": "setting.auto_indent", "operator": "equal", "operand": true }, 
     { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, 
     { "key": "selector", "operator": "equal", "operand": "text.xml punctuation.definition.tag.begin", "match_all": true }, 
     { "key": "preceding_text", "operator": "regex_contains", "operand": ">$", "match_all": true }, 
     { "key": "following_text", "operator": "regex_contains", "operand": "^</", "match_all": true }, 
    ] 
}, 

регулярных выражений, используемых здесь очень просто , просто проверяя текст непосредственно перед тем, как каретка >, а текст сразу после каретки - </. Это возможно, потому что selector проверяет, что a) мы находимся в синтаксисе XML, и b) текст сразу после того, как каретка имеет область действия punctuation.definition.tag.begin. (Вы можете вручную проверить область сразу справа от каретки в меню «Сервис» -> «Разработчик» -> «Показать имя области».) Если вы используете настраиваемый синтаксис, вам нужно будет убедиться, что вы соответствующим образом скорректируете их.

В этом случае, поскольку мы используем привязку клавиш к , введите ключ, правила отступа, указанные в файлах tmPreferences, игнорируются.