Gibt es eine Möglichkeit, das mehrzeilige Einrücken in Sublime Text 3 so zu korrigieren, dass die Einzugszeichen für die erste Zeile innerhalb der Auswahl hinzugefügt werden?

3747
Wilson F

Wenn ich in Sublime Text 3 mehrere Zeilen auswähle und sie als Block einrücke (entweder mit Taboder Ctrl+ ]), werden die neuen Leerzeichen am Anfang der ersten Zeile außerhalb der Auswahl eingefügt und nicht innerhalb.

Angenommen, ich habe einen Codeblock, der wie folgt aussieht (Hinweis: Alle folgenden Angaben dienen lediglich der Veranschaulichung; bitte fangen Sie nicht bei mir an, wo meine Zahnspangen sind oder wie viel ich einrücken möchte usw.):

int firstVar, secondVar;  firstVar = 4; secondVar = 11; 

Nun komme ich später auf diesen Code zurück und muss die Wertzuweisungen bedingt machen:

int firstVar, secondVar; int myVar = 0; int result = someThing(myVar);  if (result == GOOD_RESULT) { firstVar = 4; secondVar = 11; } else { } 

Natürlich möchte ich es gut einrücken, also wähle ich die beiden Elemente in der ifKlausel aus und rücke sie mit dem TabSchlüssel als Block ein. Sublime Text setzt, wie erwartet, Einrückungszeichen voran (ein Tabulator oder eine vorgegebene Anzahl von Zeichen) Leerzeichen) zu jeder ausgewählten Zeile:

[snip]  if (result == GOOD_RESULT) { firstVar = 4; secondVar = 11; } else { } 

Da ich ihnen in der elseKlausel nur andere Werte zuweisen werde, kopiere ich sie und füge sie dort ein, um sie zu ändern:

if (result == BAD_RESULT) { firstVar = 4; secondVar = 11; } else { firstVar = 4; secondVar = 11; } 

Und das Problem: Sublime Text hat die erste Zeile meines Blocks eingerückt, die Einrückungszeichen jedoch nicht in die Auswahl aufgenommen, sodass ich beim Einfügen und Einfügen nicht die Einrückung der ersten Zeile erhielt. (Ich wünschte, ich könnte die Hintergrundfarbe ändern, um sie besser darzustellen.)

Nicht nur das, aber wenn ich es stattdessen geschnitten und eingefügt hätte, wären die eingerückten Charaktere zurückgelassen worden.

Ich kann etwas umgehen, indem ich mich vor dem Einrücken daran erinnere, dass ich kopiere / schneide, aber a) ich erinnere mich nicht immer und b) dann muss ich den Code zweimal einrücken.

Kennt jemand eine Lösung für dieses Problem?

3

2 Antworten auf die Frage

2
racl101

Auf Sublime 3 gibt es diese genannt Befehl Paste and Indentund der Tastaturbefehl für das ist, Super + shift + Vwo Superdie Hauptbefehlstaste für Ihr Betriebssystem. Dies scheint den Trick zu tun.

Ich habe es hier gefunden: https://gist.github.com/eteanga/1736542


Bearbeiten: Originalposter fügt weitere Informationen hinzu, sodass die Benutzer nicht versuchen müssen, die Kommentare zu analysieren.

Zurück zum zweiten Schritt des ursprünglichen Problems:

int firstVar, secondVar; int myVar = 0; int result = someThing(myVar);  if (result == GOOD_RESULT) { firstVar = 4; secondVar = 11; } else { } 

Ich wähle die beiden Linien zwischen dem ersten Satz von Klammern (die Zuordnungen firstVarund secondVarkopieren Sie sie ( Ctrl+ C), dann eine Leerzeile zwischen dem zweiten Satz von Klammern hinzuzufügen und meinen Cursor am Anfang der Leerzeile setzen (durch die angegeben |, unten):

int firstVar, secondVar; int myVar = 0; int result = someThing(myVar);  if (result == GOOD_RESULT) { firstVar = 4; secondVar = 11; } else { | } 

Dann füge ich 'Einfügen und Einrücken' ( Ctrl+ Shift+ V) ein, und der Code wird mit der Standardeinrückung für den Dateityp eingefügt und kann nun geändert werden. (Auch wenn ich mehr Zeilen mit unterschiedlichen Einrückungsebenen eingefügt habe, würden sie alle entsprechend angepasst.)

int firstVar, secondVar; int myVar = 0; int result = someThing(myVar);  if (result == GOOD_RESULT) { firstVar = 4; secondVar = 11; } else { firstVar = 4; secondVar = 11; | } 

Leider ist auch eine zusätzliche leere Zeile übrig geblieben (da ich die zusätzliche Zeile nicht gesetzt hätte, wäre sie überhaupt nicht eingerückt worden), aber das lässt sich leicht löschen.

(Leider ist es immer noch nicht so gut, dass die mehrzeilige Einrückung korrekt funktioniert, da ich zunächst eine Leerzeile erstellen und dann löschen muss. Nur zwei zusätzliche Tastendrücke, sagen Sie? Sicher, aber es sind zwei Tastendrücke, die ich mache Ich müsste es nicht tun, wenn die mehrzeilige Einrückung korrekt funktioniert hat und mein natürlicher Fluss unterbrochen wird. Daher muss ich eher darüber nachdenken , als über die Codeänderungen, die ich vornehmen möchte .

(Alternativ kann ich das Zeilenvorschubzeichen am Ende der letzten Zeile abwählen, indem Sie gedrückt halten Shiftund dabei weiter gedrückt halten, und dann muss ich nur eine neue Zeile erstellen, aber keine nach dem Einfügen löschen. Aber das ist noch weniger Eine natürliche Sache, die Sie tun oder darüber nachdenken sollten, als das Hinzufügen und Löschen einer zusätzlichen Leerzeile, und es sind immer noch zwei zusätzliche Tastendrücke erforderlich.

(Auf jeden Fall ist diese Funktion eine Problemumgehung, keine Behebung, auch wenn sie eine interessante, sogar coole Funktion ist.)

In Situationen, in denen Sie bereits Textzeilen zwischen Ihren geschweiften Klammern haben ( und Sie den neuen Code nicht unmittelbar vor der letzten geschweiften Klammer einfügen müssen), funktioniert dies ziemlich gut: Sie müssen nicht einfach eine leere Zeile hinzufügen Positionieren Sie den Cursor an den Anfang der Zeile, an der Sie den neuen Code einfügen möchten, und drücken Sie Ctrl+ Shift+ V. Die Zeilen werden mit einer Einrückung eingefügt, die ihrer Umgebung entspricht.

Außerdem müssen Sie nicht unbedingt die Standardeinrückung verwenden. Wenn Sie den Mauszeiger auf eine beliebige Spalte setzen (nur mit Leerzeichen links davon), wird der Befehl "Einfügen und Einzug" alles, was Sie in diese Spalte einfügen, einrücken. (Wenn Sie dies in einer Zeile mit Text rechts vom Cursor tun, wird die Einrückung dieser Zeile so geändert, dass sie der von Ihnen eingefügten entspricht.)

Wie gesagt, ein interessantes und ziemlich cooles Feature, das es wert ist, mit ihm zu spielen und es sicher kennenzulernen. Und es lohnt sich, die akzeptierte Antwort für diese Frage zu sein. Aber immer noch nicht ganz so gut, als hätte man die mehrzeilige Einrückung richtig gemacht. :)

Hmm. Ich habe diesen Befehl ausprobiert und sehe keinen Unterschied zwischen dem und dem normalen Einfügen. Ich gehe davon aus, dass ich etwas falsch mache, aber ich bin mir nicht sicher, was es sein könnte. Funktioniert es nur mit einer Zeile oder etwas? Wilson F vor 8 Jahren 0
Es funktioniert auf mehreren Zeilen gleichzeitig. Es wird der Code mit der genauen Anzahl von Leerzeichen pro Zeile für jede Zeile eingefügt, anstatt nur einige Zeilen zu beeinflussen. Der einzige Unterschied besteht darin, wo sich der Cursor befindet, bevor er eingefügt wird. Wenn sich der Cursor ganz am Anfang der Zeile befindet, wird er mit der Einrückung für jede kopierte Zeile eingefügt. Wenn sich der Cursor jedoch bereits um die gleiche Anzahl von Spalten vor der Anzahl der Leerzeichen der ersten Zeile im Block befindet Wenn Sie kopiert haben, werden die Zeilen um die Anzahl dieser zusätzlichen Leerzeichen pro Zeile zusätzlich eingerückt, aber es wird konsistent sein. racl101 vor 8 Jahren 0
Ich habe ein wenig experimentiert. Die Cursorposition wird verwendet, wenn a) sich der Cursor in einer leeren Zeile befindet UND b) der Cursor sich nicht in der ersten Spalte befindet. Befindet sich der Cursor in einer nicht leeren Zeile, verwendet er die Einrückung der Zeile, in der er sich befindet (dh die Startspalte des eingefügten Texts entspricht der Startspalte der Cursorzeile und der Einrückung aller anderen eingefügten Textzeilen) Zeilen werden entsprechend angepasst). Wenn sich der Cursor in der ersten Spalte einer leeren Zeile befindet, wird die erste Spalte der letzten nicht leeren Zeile darüber verwendet. Das ist eigentlich ziemlich cool. Wilson F vor 8 Jahren 0
Ich akzeptiere das gerne als The Answer, aber im Text der Antwort bedarf es weiterer Erklärungen / Illustrationen, da die Erklärungen in diesen Kommentaren dicht und schwer lesbar sind. Wenn Sie nichts dagegen haben, dass ich Ihre Antwort editiere, bin ich froh, es zu tun. sonst überlasse ich es dir. Wilson F vor 8 Jahren 0
Ich gehe also davon aus, dass keine Antwort "Weitergehen" bedeutet. :) Wilson F vor 8 Jahren 0
0
Ciprian Tomoiagă

Ich glaube, das ist kein Fehler, aber das normale Verhalten, also habe ich keine Lösung. Stattdessen habe ich eine Erklärung und einen Anwendungsfall.

Dies geschieht, weil Sie die Einrückung nicht kopieren.

Du machst das:

ohne Einzug auswählen

Sie müssen diesen Bereich auch auswählen, bevor Sie kopieren. Dies kann auf zwei Arten leicht gemacht werden:

  1. Starten Sie Ihre Auswahl mit einem Doppelklick auf die Einrückung dieser Zeile. Dadurch wird alles ausgewählt, genauso wie es ein Wort (das aus einem Leerzeichen besteht) auswählen würde. Es hat auch den Vorteil, dass sich die Auswahl durch Wörter anstelle von Zeichen ändert.

    einschließlich Einzug auswählen

  2. Beginnen Sie Ihre Auswahl am Ende der vorherigen Zeile

    select with prev line

Ihr erstes Bild ist, wie meine Auswahl aussieht, nachdem ich eingerückt bin. Das heißt, der Anfang des Auswahlblocks ist eingerückt, und nicht der Text im Auswahlblock, der eingerückt wird. ... Ihr 2. Bild sieht so aus, wie mein Bild vor dem Einzug aussieht (dh, meine Auswahl beginnt in der ersten Spalte.) Es kann sein, dass in jeder Zeile Leerzeichen stehen, was jedoch keinen Unterschied macht, was passiert, wenn der Text eingerückt wird ). ... Ich habe Ihren Vorschlag bei b) ausprobiert, endete aber damit, dass er die vorangegangene Zeile sowie die Zeilen, die ich eigentlich einrücken wollte, einrückt. Vielen Dank für die Idee. Wilson F vor 9 Jahren 0
Ja, sorry, ich habe die Frage ein bisschen falsch verstanden. Ich kenne keinen Fix, damit Sie Ihren Workflow beibehalten können. In meinem Fall wird die erste Zeile der "else" -Klausel (nach der Klammer) automatisch eingerückt, sodass der verlorene Einzug wiederhergestellt wird. Aber wenn man ausschneidet, wenn ja, dann bleiben die Leerzeichen zurück. Eine andere Lösung wäre, ganze Zeilen auszuschneiden / kopieren und sie dann mit Einfügen aus dem Verlauf einzufügen. Ich kenne jedoch keine kbd-Verknüpfung für diesen Befehl. Ciprian Tomoiagă vor 9 Jahren 0
Kein Problem; Danke für den Versuch. :) Wilson F vor 9 Jahren 0