Existe-t-il un moyen de corriger l'indentation multiligne dans Sublime Text 3 de manière à ce qu'il ajoute les caractères d'indentation de la première ligne de la sélection?

4

Lorsque je sélectionne plusieurs lignes Sublime Text 3 et les indenter comme un bloc ( en utilisant Tabou Ctrl+ ]), il ajoute les nouveaux caractères blancs au début de la première ligne en dehors de la sélection au lieu de l' intérieur.

Dites que j'ai un bloc de code qui ressemble à ceci (Note: tout ce qui suit est juste pour illustrer l'idée; s'il vous plait, ne commencez pas à me dire où sont mes accolades, ni combien j'indique, etc.):

int firstVar, secondVar;

firstVar = 4;
secondVar = 11;

Maintenant, je reviens sur ce code plus tard et je dois rendre les assignations de valeur conditionnelles:

int firstVar, secondVar;
int myVar = 0;
int result = someThing(myVar);

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

Bien sûr, je veux bien le mettre en retrait, alors je sélectionne les deux éléments de la ifclause et les mets en retrait sous forme de bloc, avec la Tabclé, et Sublime Text, comme prévu, précéde les caractères d’indentation (une tabulation ou un nombre prédéterminé de caractères). espaces) à chaque ligne sélectionnée:

[snip]

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

Ensuite, comme je vais simplement leur attribuer différentes valeurs dans la elseclause, je les copie et les colle ici, prêtes à être modifiées:

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

Et il y a le problème: Sublime Text a indenté la première ligne de mon bloc, mais n'a pas inclus les caractères d'indentation dans la sélection . Ainsi, lorsque je l'ai copié-collé, je n'ai pas obtenu l'indentation de la première ligne. (J'aimerais pouvoir changer la couleur de fond pour mieux illustrer.)

Non seulement cela, mais si je l'avais coupé et collé à la place, les caractères indentés auraient été laissés derrière.

Je peux le contourner un peu en essayant de me rappeler de copier / couper avant de mettre en retrait, mais a) je ne me souviens pas toujours et b) alors je dois indenter le code deux fois.

Est-ce que quelqu'un connaît un correctif pour cela?

Wilson F
la source

Réponses:

4

Sur Sublime 3, cette commande est appelée Paste and Indentet la commande clavier correspondante est Super + shift + Voù se Supertrouve la touche de commande principale de votre système d'exploitation. Cela semble faire l'affaire.

Je l'ai trouvé ici: https://gist.github.com/eteanga/1736542


Modifier: Affiche originale qui ajoute des informations supplémentaires afin que les utilisateurs n'aient pas à analyser les commentaires.

Revenons à la deuxième étape du problème initial:

int firstVar, secondVar;
int myVar = 0;
int result = someThing(myVar);

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

Je sélectionne les deux lignes entre le premier jeu d'accolades (les affectations à firstVaret secondVar, les copie ( Ctrl+ C), puis ajoute une ligne vide entre le deuxième jeu d'accolades et place mon curseur au début de la ligne vierge (indiquée par le symbole |, au dessous de):

int firstVar, secondVar;
int myVar = 0;
int result = someThing(myVar);

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

Ensuite, je «colle et indente» ( Ctrl+ Shift+ V), et le code est collé avec l'indentation par défaut pour le type de fichier, prêt à être modifié. (En outre, si j'avais collé plus de lignes, avec des niveaux de retrait différents, elles seraient toutes ajustées en conséquence.)

int firstVar, secondVar;
int myVar = 0;
int result = someThing(myVar);

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

Malheureusement, il reste également une ligne vierge supplémentaire (car si je n'avais pas inséré la ligne supplémentaire, elle n'aurait pas du tout été indentée), mais c'est assez facile à supprimer.

(Malheureusement, il n’est toujours pas aussi bon que l’indentation multiligne fonctionne correctement, car je dois d’abord créer puis détruire une ligne vierge. Juste deux appuis supplémentaires, vous dites? Bien sûr, mais c’est deux appuis clés I Je n'aurais pas besoin de le faire si l'indentation multiligne fonctionnait correctement et si cela interrompait mon flux naturel. Je dois donc penser à cela plutôt qu'aux modifications de code que j'essaie d'apporter.

(Alternativement, je peux désélectionner le caractère de nouvelle ligne à la fin de la dernière ligne, en appuyant tout en maintenant la touche enfoncée Shift, puis il ne me reste plus qu'à créer une nouvelle ligne, mais pas à en supprimer une après le collage. Mais c'est encore moins Il est naturel de penser ou d’ajouter que d’ajouter et de supprimer une ligne vierge supplémentaire, ce qui implique deux pressions supplémentaires.

(Donc de toute façon, cette fonctionnalité est une solution de contournement, pas une solution, même si c'est une fonctionnalité intéressante, voire intéressante.)

Cependant, dans les cas où vous avez déjà des lignes de texte entre vos accolades ( et que vous n'avez pas besoin de coller le nouveau code juste avant la dernière accolade), cela fonctionne très bien: vous n'avez pas besoin d'ajouter une ligne vierge, Placez votre curseur au début de la ligne où vous souhaitez insérer le nouveau code et appuyez sur Ctrl+ Shift+ V. Les lignes seront insérées avec l'indentation qui correspond à son environnement.

En outre, vous ne devez pas nécessairement utiliser l'indentation par défaut. Si vous placez votre curseur sur une colonne quelconque (avec uniquement des espaces à gauche), la commande "Coller et mettre en retrait" indente tout ce que vous collez dans cette colonne. (Si vous faites cela sur une ligne avec du texte à droite du curseur, l'indentation de cette ligne sera modifiée pour correspondre à celle de tout ce que vous avez collé.)

Comme je le disais, c'est une fonctionnalité intéressante et plutôt cool, qui vaut la peine de jouer avec et de faire connaissance, à coup sûr. Et mérite d'être la réponse acceptée pour cette question. Mais toujours pas tout à fait aussi bon que juste après avoir fait le travail d'indentation sur plusieurs lignes correctement. :)

racl101
la source
Hmm. J'ai essayé cette commande et je ne vois aucune différence entre cela et le collage ordinaire. Je suppose que je fais quelque chose de mal, mais je ne suis pas sûr de ce que cela pourrait être. Est-ce que cela ne fonctionne qu'avec une ligne à la fois ou quelque chose?
Wilson F
Cela fonctionne sur plusieurs lignes à la fois. Il va coller le code avec le nombre exact d'espaces en retrait par ligne pour chaque ligne, au lieu d'affecter certaines lignes. La seule chose qui diffère est l'endroit où se trouve votre curseur avant de coller. Si votre curseur se trouve complètement au début de la ligne, il sera collé avec l'indentation pour chaque ligne que vous avez copiée, mais si votre curseur se trouve déjà avec le même nombre de colonnes que le nombre d'espaces de la première ligne du bloc. vous copiez alors les lignes seront indentées supplémentaires par le nombre d'espaces supplémentaires par ligne, mais ce sera cohérent.
racl101
J'ai fait des expériences. Il utilise la position du curseur SI a) le curseur est sur une ligne vide ET b) le curseur ne se trouve pas dans la première colonne. Si le curseur se trouve sur une ligne non vide, il utilisera l’indentation de la ligne sur laquelle il se trouve (c’est-à-dire que la colonne de départ du texte collé sera la même que la colonne de départ de la ligne du curseur et l’indentation de tous les autres éléments collés. les lignes seront ajustées en conséquence). Si le curseur se trouve dans la première colonne d'une ligne vide, il utilisera la première colonne de la dernière ligne non vierge située au-dessus de celle-ci. C'est en fait assez cool.
Wilson F
Je serais heureux d'accepter ceci comme étant la réponse, mais cela nécessite quelques explications / explications supplémentaires dans le corps de la réponse, car les explications de ces commentaires sont denses et difficiles à lire. Si vous ne voulez pas que je modifie votre réponse, je le ferai avec plaisir; sinon je vous le laisse.
Wilson F
Je supposerai que pas de réponse signifie "allez-y", alors. :)
Wilson F
0

Je crois que ce n'est pas un bug, mais le comportement normal, donc je n'ai pas de solution. Au lieu de cela, j'ai une explication et un cas d'utilisation suggéré.

Cela se produit parce que vous ne copiez pas l'indentation.

Tu fais cela:

sélectionner sans retrait

Vous devrez également sélectionner cet espace avant de copier. Cela peut être fait facilement de deux manières:

  1. Commencez votre sélection par un double clic sur l'indentation de cette ligne. Cela sélectionnera tout cela, tout comme il sélectionnerait un mot (composé d'espaces blancs). Cela présente également l’avantage que la sélection change par mots plutôt que par caractères.

    sélectionner y compris le retrait

  2. Commencez votre sélection à la fin de la ligne précédente

    sélectionner avec la ligne précédente

Ciprian Tomoiagă
la source
Votre 1ère image correspond à ma sélection après mon retrait. Par exemple, le début du bloc de sélection est en retrait, plutôt que le texte dans le bloc de sélection étant en retrait. ... Votre deuxième image correspond à la mienne avant la mise en retrait (en ce sens que ma sélection commence dans la première colonne - il peut ne pas y avoir d'espace entre chaque ligne, bien que cela ne change rien à ce qui se produit lorsque le texte est mis en retrait ) ... J'ai essayé votre suggestion en b), mais elle a fini par mettre en retrait la ligne précédente ainsi que les lignes que je voulais réellement mettre en retrait. Merci pour l'idée, cependant.
Wilson F
Oui, désolé, j'ai un peu mal compris la question. Je ne connais pas de solution pour que vous gardiez votre flux de travail. Dans mon cas, il indente automatiquement la première ligne de la elseclause (après le crochet), ainsi l'indentation perdue est récupérée. Mais si vous coupez de si, alors oui, les espaces sont laissés derrière. Une autre solution serait de couper / copier des lignes entières, puis de les insérer avec une pâte de l’historique. Cependant, je ne connais pas de raccourci kbd pour cette commande.
Ciprian Tomoiagă