2017-02-05 6 views
2

Um das Verhalten von Sublime Text beim Einrücken von Zeilenumbrüchen anzupassen, können Sie je nach aktueller Zeile die whatever.tmPreferences Datei entsprechend ändern und die Werte increaseIndentPattern und setzen Optionen, wie zum Beispiel in this other answer gezeigt.So erstellen Sie Sublime Text 3 Einrücken von Zeilenumbrüchen, wenn Caret in Klammern (oder anderen Symbolen) ist

Allerdings kann ich nicht zu arbeiten scheinen, wie das folgende Verhalten zu erzeugen: Da eine Zeile wie

[<cursor here>] 

mit dem Cursor zwischen den eckigen brakets, Press- enter ich folgendes Ergebnis wollen:

Dies ist zum Beispiel was passiert, wenn Sie eine xml Datei ändern, drücken Sie die Eingabetaste zwischen zwei Klammern, wie in <sometag><cursor here></sometag>.

Ich habe versucht, in die tmPreferences Dateien für die xml zu suchen, aber ohne Erfolg.

Eine ähnliche Frage wurde here gefragt, aber die vorliegende ist anders aus mehreren Gründen:

  1. ich dieses Verhalten möchte nur für bestimmte Dateierweiterungen implementiert werden, und mit einem Paket verschickt werden . Also frage ich auch, wo genau ich die Anweisungen für diese benutzerdefinierte Tastaturkürzel legen soll.
  2. In der verknüpften Frage ist die Sache einfacher: einfach Zeilenumbrüche zwischen einer Art Klammern hinzufügen und einfügen. Es ist für mich nicht einfach, dieses Verhalten zu verallgemeinern, wie in dem oben zitierten Beispiel, in dem wir einen Zeilenumbruch zwischen XML-ähnlichen Tags wünschen, da wir uns in diesem Fall mit den Regexes und verifizieren müssen und richtige Muster stimmen überein.

Wie kann dieses Verhalten implementiert werden?

+0

Mögliche Duplikate von [Wie Bracket Einzug Verhalten in ST3 einstellen] (http://stackoverflow.com/questions/41456641/how-to-set-bracket-indentation-behavior-in-st3) –

+0

@KeithHall thanks for der Link. Das ist zwar sehr verwandt, aber nicht wirklich eine direkte Antwort. Im Fall von 'xml' zum Beispiel, das im Beitrag gezeigt wird, kann ich keine' .suide-keymap' Datei im 'XML'-Ordner in' Packages' finden, so dass ich nicht sicher bin, wo diese Tastenkürzel gesetzt wurden. – glS

+0

Ihre Benutzer-Tastenbelegungen befinden sich immer in Ihrem 'Benutzer'-Paket, sie sind nicht in dem Paket, das sich auf den Ort bezieht, an dem Sie sie verwenden möchten. Damit die verknüpften Bindungen nur für eine XML-Datei funktionieren, müssen Sie lediglich einen zusätzlichen Kontext hinzufügen, der überprüft, ob es sich um eine XML-Datei handelt. Sehen Sie sich die letzte Bindung in der Standard-Tastaturbelegungsdatei als Beispiel an. – OdatNurd

Antwort

3

Um eine Tastenkombination zu erstellen, die mit einem Paket geliefert wird, erstellen Sie a Default.sublime-keymap file in your package.

Normalerweise Sublime Text untersucht die Syntax, mit der das Dokument hervorgehoben wird, im Gegensatz zu den verwendeten Dateierweiterungen, um zu bestimmen, ob Tastatureingaben/Plugins aktiv sein sollen usw. Dies ist hauptsächlich so Noch nicht gespeichert. Wenn Sie dieser Richtlinie folgen möchten, können Sie den Tastenbindungskontext selector verwenden. Im Fall von XML-Dateien möchten Sie wahrscheinlich source.xml verwenden. Andernfalls müssen Sie eine EventListener erstellen, die eine on_query_context-Methode definiert, um die view.file_name() zu überprüfen. Sie können die os.path.splitext Methode verwenden, um die Dateierweiterung abzurufen.

Wenn Sie wirklich mit XML zu tun haben, dann können Sie den Standard auto_indent_tag Keybinding als Inspiration verwenden:

{ "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 }, 
    ] 
}, 

wie etwas zu bauen:

hier verwendet
{ "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 }, 
    ] 
}, 

Die regulären Ausdrücke sind sehr einfach Überprüfen Sie einfach den Text unmittelbar vor dem Caret > und der Text unmittelbar nach dem Caret ist </. Dies ist möglich, weil die selector überprüft, dass a) wir in einer XML-Syntax sind, und b) der Text unmittelbar nach der Einfügemarke als punctuation.definition.tag.begin definiert ist. (Sie können den Bereich direkt über das Menü Extras -> Entwickler -> Bereichsnamen anzeigen direkt rechts neben dem Caret überprüfen.) Wenn Sie eine benutzerdefinierte Syntax verwenden, müssen Sie sicherstellen, dass Sie diese entsprechend anpassen.

In diesem Fall werden die in tmPreferences Dateien angegebenen Einrückungsregeln ignoriert, da wir eine Tastenkombination für den Schlüssel Enter verwenden.

Verwandte Themen