2012-03-03 1 views
223

Иногда я хочу отредактировать определенный визуальный блок текста на нескольких строках.В Vim, как эффективно вставлять одни и те же символы в несколько строк?

Для примера я хотел бы взять текст, который выглядит следующим образом:

name 
comment 
phone 
email 

И сделать это lõoke как этот

vendor_name 
vendor_comment 
vendor_phone 
vendor_email 

В настоящее время, как я бы сделать это сейчас ...

  1. Выделить все 4 строки строк блока, нажав V, а затем j 4 раза.
  2. Отступ с >.
  3. Вернуться назад одна буква с h.
  4. Перейти к блочному визуальному режиму с помощью ctrlv.
  5. Выберите 4 ряда, нажав j 4 раза. На этом этапе вы выбрали 4x1 визуальный блок пробелов (4 строки, 1 cols).
  6. Пресс c. Обратите внимание, что это почти отступом слева от одного столбца.
  7. Введите " vendor_" без котировки. Обратите внимание на дополнительное пространство, которое мы должны были вернуть.
  8. Пресс esc. Это один из самых немногих случаев, когда я использовал esc, чтобы выйти из режима вставки. ctrlc отредактировал бы только первую строчку.
  9. Повторите шаг 1.
  10. Отступ другой путь с <.

Мне не нужно отступать, если перед словами есть хотя бы один столбец пробелов. Мне не нужны пробелы, если мне не нужно было очищать визуальный блок с помощью c.

Но если мне нужно очистить, то есть ли способ сделать то, что я выполнил выше, не создавая необходимые пробелы с отступом?

Также почему редактирование нескольких строк сразу работать только при выходе из режима вставки с ЭКУ над CTRlс?

Редактировать:

Вот более сложный пример

name = models.CharField(max_length = 135) 
comment = models.TextField(blank = True) 
phone = models.CharField(max_length = 135, blank = True) 
email = models.EmailField(blank = True) 

к

name = models.whatever.CharField(max_length = 135) 
comment = models.whatever.TextField(blank = True) 
phone = models.whatever.CharField(max_length = 135, blank = True) 
email = models.whatever.EmailField(blank = True) 

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

+8

Лучший способ: ":% S/^/vendor_ /" –

+1

Спасибо за ответ. Это работает, если я хочу только добавить слово в каждую строку. Но метод, который я использую, можно сделать в любой позиции. Позвольте мне добавить еще один мой пример с более сложным примером. – hobbes3

+3

Затем выделите строки, которые вы хотите изменить, с помощью shift-V и введите соответствующую команду поиска и замены - во втором примере: ': s/models \ ./ \ 0whatever. /' –

ответ

643
  1. Переместите курсор на n в name.
  2. Ввод режима визуального блока (ctrlv).
  3. Пресс j три раза.
  4. Пресс I (столица i).
  5. Тип: vendor_.
  6. Пресс esc.

mini-screencast demonstrating the method

заглавной I должны быть использованы, а не строчной i, так как в нижнем регистре i интерпретируется как началом text object, который является весьма полезным сам по себе, например, для выбора внутри блока тэга (it):

mini-screencast showing the usefulness of the it text object

+2

Ницца. Я не знал о «Я». –

+0

Эй, я не знал, что «я» работал в визуальном блоке. Очевидно, я попробовал «я» раньше, но он звучал на меня, поэтому я использовал 'c' с тех пор ... и имел описанное ограничение. Спасибо за ответ! :-) – hobbes3

+84

Вау, мне жаль, что я не мог дать вам больше, чем +1 для этого анимированного GIF lol. Хорошая работа! – hobbes3

24

Я хотел бы использовать макрос, чтобы записать свои действия, а затем повторить его.

  1. Наведите курсор на первую букву имени.
  2. Нажмите qq, чтобы начать запись в буфер q.
  3. Нажмите i, чтобы перейти в режим вставки, и введите vector_, затем нажмите ESC, чтобы выйти из режима вставки.
  4. Теперь нажмите 0, чтобы вернуться в начало линии.
  5. Теперь нажмите j, чтобы спуститься.
  6. Теперь нажмите q еще раз, чтобы остановить запись.

У вас теперь хороший макрос.

Тип [email protected], чтобы выполнить ваш макрос 3 раза, чтобы сделать остальные строки.

5

Предположим, у вас есть этот файл:

something 

name 
comment 
phone 
email 

somethine else 
and more ... 

Вы хотите добавить «vendor_» перед «имя», «комментарий», «телефон» и «электронная почта», независимо от того, где они появляются в файле.

:%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc 

Флаг c запросит подтверждение. Вы можете отказаться от этого, если вам не нужна подсказка.

56

Другой подход заключается в использовании . (dot) команда в сочетании с I.

  1. Переместите курсор туда, где вы хотите начать
  2. Нажмите I
  3. Введите префикс, который требуется (например, vendor_)
  4. Нажмите ESC.
  5. Нажмите J идти вниз линию
  6. Тип ., чтобы повторить последнее редактирование, автоматически вставляя префикс снова
  7. Замещаем быстро между j и .

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

Обратите внимание, что для большого количества смежных дополнений блок-подход или макрос, вероятно, будут выше.

+0

Приятно видеть другой подход. –

+0

Я предпочитаю это только для нескольких строк. Намного легче выполнить ИМО. – Dan

+0

После того, как вы введете префикс, который вам нужен, вам не нужно нажать клавишу эвакуации? – iamnotsam

23
:%s/^/vendor_/ 

или я что-то упускаю?

+0

Вам не хватает того, что это, скорее всего, подтекст в файле со многими другими строками, на которых префикс 'vender_' нежелателен. – Dan

+6

@dan Если требуется только подтекст, вы можете ограничить поиск набором номеров строк, например '1,4s/^/vendor_ /' –

+1

@BradKoch Интересно. Спасибо за это. – Dan

5

Возможно, у вас также есть прецедент, в котором вы хотите удалить блок текста и заменить его.

Как это

Hello World 

Hello World 

Для

Hello Cool 

Hello Cool 

Вы можете просто визуальный блок выбора "Мир" в обеих линиях.

Тип c для изменения - теперь вы будете в режиме вставки.

Вставьте материал, который вы хотите, и нажмите побег.

Оба отражаются вертикально. Он работает так же, как «я», за исключением того, что вместо нового слова вместо нового блока вместо нового текста заменяется блок.

8

Обновлено января 2016

Хотя принятого ответа является отличным решением, это на самом деле немного меньше нажатий клавиш, и масштабируется лучше - на основе, в принципе, на принятый ответ.

  1. Подведите курсор к n в name.
  2. Ввод режима визуального блока (ctrlv).
  3. Пресс 3j
  4. Пресс I.
  5. Тип: vendor_.
  6. Пресс esc.

visual illustration

Заметим, что это имеет меньшее количество нажатий клавиш, чем принято отвечать при условии (сравните Шаг 3). Мы просто подсчитываем количество j действий для выполнения.

Если у вас есть номера линий, включенные (как показано выше), и знаете номер строки, к которой вы хотите переместить, тогда шаг 3 можно изменить на # G где # - номер требуемой строки.

В нашем примере выше это будет 4G. Однако, имея дело с несколькими номерами строк, явный подсчет работает хорошо.

18
  1. Выберите строки, которые вы хотите изменить, используя Ctrl-v.
  2. Пресса:

    • I: Вставьте до того, что он выбран.
    • A: Добавить после того, что выбрано.
    • c: Замените выбранное.
  3. Внесите новый текст.

  4. Нажмите Esc, чтобы применить изменения ко всем выбранным линиям.
+2

Отлично! Я бы выделил последний шаг 'Esc' для VIM noobs, как и я - мне потребовалось некоторое время, чтобы понять, что изменения распространяются« позже »! –

0
Use Ctrl+V to enter visual block mode 
Move Up/Down to select the columns of text in the lines you want to comment. 
Then hit Shift+i and type the text you want to insert. 
Then hit Esc, wait 1 second and the inserted text will appear on every line 
+0

Этот метод работает для всех версий vim или требует каких-либо плагинов vim? причина, почему я спрашиваю, это b/c, она иногда работает на некоторых машинах, но иногда нет. я не могу понять разницу. vim, который поставляется с git на окнах - я не могу заставить его работать. на некоторых машинах Linux ubuntu и centos я не могу заставить его работать. У меня был успех в нескольких редких случаях, но я не смог воспроизвести успех. это тайна. ничего не происходит после того, как я нажму ESC. – davidj411

+0

странно, это работает для меня сейчас.ничего не изменилось, кроме, может быть, звезд :) , ища решение моей проблемы, я нашел что-то на этой странице, хотя это упоминает что-то искать в vim http://vim.wikia.com/wiki/ Inserting_text_in_multiple_lines В Vim убедитесь, что у вас есть функция blockwise-операторов (I, A и более), введя команду: version. Результат должен включать + visualextra. – davidj411

+0

Прошу проголосовать, если это сработает для вас –

4

Я хотел закомментировать много линий в некотором файле конфигурации на сервере, который был только VI (не нано), поэтому визуальный метод был громоздким, а Вот как я сделал это.

  1. Открыть файл vi file
  2. номера строк дисплея :set number! или :set number
  3. Затем используют номера строк для замены запуска производственной линии с «#», то как?

:35,77s/^/#/

Примечание: цифры включительно, строки от 35 до 77, и включенные будут изменены.

раскомментировать/отменить, что, просто используйте :35,77s/^#//

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

:35,77s/$/#test/ (для таких языков, как Python)

:35,77s/;$/;\/\/test/ (для таких языков, как Java)

кредитов/ссылки:

  1. https://unix.stackexchange.com/questions/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim

  2. https://unix.stackexchange.com/questions/120615/how-to-comment-multiple-lines-at-once

Смежные вопросы