Есть ли способ исправить многострочный отступ в Sublime Text 3, чтобы он добавлял символы отступа для первой строки внутри выделения?

3278
Wilson F

Когда я выделяю несколько строк в Sublime Text 3 и делаю отступ в виде блока (используя либо Tabили Ctrl+ ]), он добавляет новые пробельные символы в начале первой строки за пределами выделения, а не внутри.

Скажем, у меня есть блок кода, который выглядит следующим образом (Примечание: все нижеприведенное приведено только для иллюстрации идеи; пожалуйста, не начинайте с меня о том, где находятся мои скобки, или какой отступ я делаю и т. Д.):

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

Теперь я вернусь к этому коду позже и мне нужно сделать условные присвоения значений:

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

Конечно, я хочу сделать отступ в нужном месте, поэтому я выбираю два элемента в ifпредложении и делаю отступ в виде блока с Tabключом, а Sublime Text, как и ожидалось, добавляет символы отступа (табуляция или заранее определенное число пробелы) к каждой выбранной строке:

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

Затем, поскольку я просто собираюсь назначать им различные значения в elseпредложении, я копирую и вставляю их туда, готовый к изменению:

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

И есть проблема: Sublime Text отступил в первой строке моего блока, но не включил символы отступа в выделение, поэтому, когда я его копировал и вставлял, я не получал отступ первой строки. (Я хотел бы изменить цвет фона, чтобы проиллюстрировать лучше.)

Не только это, но если бы я вырезал и вставил вместо этого, символы отступа остались бы позади.

Я могу немного обойти эту проблему, пытаясь вспомнить, чтобы скопировать / вырезать перед выполнением отступа, но а) я не всегда помню и б) затем мне приходится делать отступ кода дважды.

Кто-нибудь знает, как это исправить?

3

2 ответа на вопрос

2
racl101

On Sublime 3 there's this command called Paste and Indent and the keyboard command for that is Super + shift + V where Super is the main command key for your OS. This seems to do the trick.

I found it here: https://gist.github.com/eteanga/1736542


Edit: Original poster adding further information, so people don't have to try to parse the comments.

Going back to the second step of the original problem:

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

I select the two lines between the first set of braces (the assignments to firstVar and secondVar, copy them (Ctrl+C), then add an empty line between the second set of braces and place my cursor at the beginning of the blank line (indicated by the |, below):

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

Then I 'Paste and Indent' (Ctrl+Shift+V), and the code is pasted with the default indentation for the file type, ready for me to change. (Also, if I'd pasted more lines, with different indent levels, they would all be adjusted accordingly.)

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

Unfortunately, it's also left an extra blank line (because if I hadn't put the extra line, it wouldn't have indented at all), but that's easy enough to delete.

(So, sadly, it's still not as good as having the multi-line indentation work correctly, since I have to first create and then destroy a blank line. Just two extra key presses, you say? Sure, but it's two key presses I wouldn't need to do if multi-line indentation worked correctly, and it interrupts my natural flow, so I have to think about that rather than about the code changes I'm trying to make.

(Alternatively, I can de-select the newline character at the end of the last line, by pressing while continuing to hold down Shift, and then I only have to create a new line, but not delete one after pasting. But that's an even less natural thing to do or think about than adding and deleting and extra blank line, and it still involves two extra key presses.

(So either way, this feature is a workaround, not a fix, even if it is an interesting, even cool, feature.)

However, in situations where you already have lines of text between your braces (and you don't need to paste the new code just before the last brace), it works quite well: you don't have to add a blank line, just position your cursor at the beginning of the line where you want to insert the new code and press Ctrl+Shift+V. The lines will be inserted with indentation that matches its surroundings.

Also, you don't necessarily have to use the default indenting. If you place your cursor on some arbitrary column (with only whitespace to the left of it), the 'Paste and Indent' command will indent everything you paste to that column. (If you do this on a line with text to the right of the cursor, that line's indenting will be changed to match that of whatever you pasted.)

As I say, an interesting and fairly cool feature, worth playing with and getting to know, for sure. And worth being The Accepted Answer for this question. But still not quite as good as just having made the multi-line indentation work properly. : )

Хм. Я попробовал эту команду, и я не вижу никакой разницы между этим и обычным склеиванием. Я ожидаю, что делаю что-то не так, но я не уверен, что это может быть. Это работает только с одной линией за раз или что-то? Wilson F 8 лет назад 0
Он работает на нескольких линиях одновременно. Он вставит код с точным количеством пробелов с отступом на строку для каждой строки, а не просто влияет на некоторые строки. Единственное, что будет отличаться, это то, где находится ваш курсор перед вставкой. Если ваш курсор находится полностью в начале строки, он будет вставлен с отступом для каждой строки, которую вы скопировали, но если ваш курсор уже равен тому же количеству столбцов перед числом пробелов в первой строке в блоке если вы скопировали, то строки будут добавлены с отступом на количество этих дополнительных пробелов в строке, но это будет согласованно. racl101 8 лет назад 0
Я сделал некоторые эксперименты. Он использует позицию курсора IF а) курсор находится на пустой строке И б) курсор находится не в первом столбце. Если курсор находится на непустой строке, он будет использовать отступ строки, на которой он находится (т. Е. Начальный столбец вставленного текста будет таким же, как начальный столбец строки курсора и отступ всех остальных вставленных строк). линии будут скорректированы соответственно). Если курсор находится в первом столбце пустой строки, он будет использовать первый столбец последней непустой строки над ним. Это на самом деле довольно круто. Wilson F 8 лет назад 0
Я был бы рад принять это как «Ответ», но в теле ответа требуется некоторое дополнительное объяснение / иллюстрация, потому что объяснения в этих комментариях плотны и трудны для чтения. Если вы не возражаете, чтобы я отредактировал ваш ответ, я с удовольствием это сделаю; иначе я оставлю это тебе. Wilson F 8 лет назад 0
Я предполагаю, что отсутствие ответа означает «вперёд». :) Wilson F 8 лет назад 0
0
Ciprian Tomoiagă

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

Это происходит потому, что вы не копируете отступ.

Ты делаешь это:

select without indent

Вам также нужно будет выбрать это место перед копированием. Это можно легко сделать двумя способами:

  1. Начните свой выбор с двойного щелчка на отступе этой строки. Это выберет все это, точно так же, как выберет слово (которое состоит из пробела). Преимущество также заключается в том, что выбор изменяется словами, а не символами.

    select including indent

  2. Начните свой выбор в конце предыдущей строки

    select with prev line

Ваше первое изображение - это то, как выглядит мой выбор после отступа. Т.е. начало блока выбора имеет отступ, а не текст внутри блока выбора с отступом. ... Ваше второе изображение выглядит так, как мое, до того, как я сделаю отступ (то есть мой выбор начинается с 1-го столбца - пробелы могут начинаться или не начинаться с каждой строки, хотя это не имеет значения для того, что происходит, когда текст отступает ). ... Я попробовал ваше предложение в пункте b), но оно закончилось отступом предыдущей строки, а также строк, которые я на самом деле хотел сделать отступом. Спасибо за идею, хотя. Wilson F 9 лет назад 0
Да, извините, я немного не понял вопрос. Я не знаю исправления, чтобы вы сохранили рабочий процесс. В моем случае он автоматически делает отступ в первой строке условия `else` (после скобки), поэтому потерянный отступ восстанавливается. Но если вы отрежете от if, тогда да, пробелы останутся позади. Другим решением будет вырезать / скопировать целые строки, а затем вставить их с вставкой из истории. Однако я не знаю ярлыка kbd для этой команды. Ciprian Tomoiagă 9 лет назад 0
Нет проблем; спасибо за попытку :) Wilson F 9 лет назад 0

Похожие вопросы