vim: удалить первые 2 пробела для нескольких строк

79

Какой самый простой способ удалить первые 2 пробела для каждой строки с помощью VIM? В основном это повторение «2x» для каждой строки.

Уточнение: здесь предполагается, что первые 2 символа - это пробелы. Итак, вопрос заключается в том, чтобы сделать отступ для нескольких строк вместе.

два раза
источник
Это именно пробел или первые два символа, независимо от того, что они собой представляют?
Джейсон Даун
Это первые два символа. Предполагая, что первые два символа являются пробелами.
дважды
Я показал способ сделать это с помощью поиска и замены в режиме бывшего редактора. Один способ гарантирует, что он сделает это только для строк, начинающихся с двух пробелов (и удалит только два пробела). Другой просто выпотрошит первых двух персонажей независимо от того, что они собой представляют.
Джейсон Даун
Вопросы по Vim не выходят за рамки темы SO (проверьте обсуждения на мета и ... SO FAQ). Более того, отступы имеют отношение к развитию ...
Люк Эрмитт 09

Ответы:

93

Еще несколько вариантов. Вы можете решить, какой из них «самый простой».

Удалите первые 2 символа каждой строки:

:%normal 2x

Удалите первые 2 символа каждой строки, только если они пробелы:

:%s/^  /

Обратите внимание, что последняя косая черта является необязательной и находится здесь только для того, чтобы вы могли видеть два пробела. Без косой черты это всего 7 символов, включая расширение :.

Переместите отступ влево для каждой строки:

:%normal <<
Bhinesley
источник
11
Мне нравится, что в Vim есть 30 различных способов сделать что-то. Подобные вопросы поднимают то, о чем вы никогда не знали. Я понятия не имел о% нормальном.
Джейсон Даун
Спасибо за разъяснения по поводу последнего рывка. Это полезно.
ryanjdillon
1
Я добавлю, что %знак просто означает «выполнить эту команду для каждой строки в документе, а не только для текущей». Я думаю. Не могу найти много документации по этому поводу.
Sammaron
119
  1. Войдите в режим визуального блока с помощью Ctrl-V(или, Ctrl-Qесли вы используете Ctrl-Vдля вставки);
  2. Выберите область для удаления с помощью стрелок;
  3. Затем нажмите, dчтобы удалить выбранную область.
  4. Нажмите Esc
Том Керр
источник
7
ctrl-v, чтобы выбрать символы для удаления, а затем d для вырезания.
Henrik K
2
Самый популярный ответ! :-)
Никос Александрис
Это не работает во всех vim, которые я использую, но для тех, которые действительно работают, это очень удобно, и приятно иметь возможность визуализировать область, которую вы удаляете, прежде чем вы действительно это сделаете.
searchchengine27
Возможно, другая привязка по умолчанию для режима визуального блока? Возможно, разница между старым дистрибутивом UNIX VI (в отличие от VIM).
Tom Kerr
Это, наверное, самый простой и разумный ответ.
Виллем ван
13

Вы также можете использовать поиск и замену (в редакторе ex, доступ к которому осуществляется через :символ):

Удалите первые два символа несмотря ни на что:

%s/^.\{2}//

Удалите первые два символа пробела (должны быть в начале и оба должны быть пробелами ... любая строка, не соответствующая этому критерию, будет пропущена):

%s/^\s\{2}//
Джейсон Даун
источник
2
Символ / g в конце не нужен. Вы делаете только одно совпадение в строке.
bhinesley 05
imo, это отличное решение
Виктория Стюарт
7

Предполагая a shiftwidth=2, затем используя shift с диапазоном%

:%<
Питер Ринкер
источник
4

Два пробела или два символа? ( 2xделает последнее.)

:[range]s/^  //

удаляет два пробела в начале каждой строки; используйте %(эквивалент 1,$) as [range]do to this для всего файла.

:[range]s/^..//

удаляет первые два символа каждой строки, какими бы они ни были. (Обратите внимание, что он удаляет два символа , не обязательно два столбца ; символ табуляции считается как один символ).

Если на самом деле вы меняете отступ, вы можете использовать <команду, чтобы уменьшить его, или >команду, чтобы увеличить его. Установите, shiftwidthчтобы контролировать, насколько он сдвигается, например

:set shiftwidth=2
Кейт Томпсон
источник
3

Я бы попробовал один из двух подходов:

  1. Выполните редактирование столбцов в удаляемом блоке Ctrl+V(часто с отображением Ctrl+Q).
  2. Запишите макрос в первой строке, используя q1(или любую другую цифру / букву, которую вы хотите обозначить регистр записи), затем воспроизведите этот макрос несколько раз, используя @1(для использования моего предыдущего примера. Еще лучше, используйте предыдущее число, чтобы указать, сколько раз для выполнения - например, 10@1для запуска этого макроса 10 раз. Однако это зависит от того, что вы записали - не забудьте перемотать курсор назад 0или опустить одну строку j, если это необходимо.
sa125
источник
3

Я бы также добавил: узнайте, как настроить отступ для vim. Тогда простое gg=Gпоможет.

Люк Эрмитт
источник