В Vim, как эффективно вставлять одни и те же символы в несколько строк?

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

Например, я бы взял текст, который выглядит так:

name
comment
phone
email

И сделайте так, чтобы это выглядело

vendor_name
vendor_comment
vendor_phone
vendor_email

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

  • Выберите все 4 строки строки блока, нажав V, а затем j 4 раза.
  • Отступ с >.
  • Верните одну букву с помощью h.
  • Перейдите в блок визуального режима с помощью ctrl V.
  • Выберите 4 строки, нажав j 4 раза. На этом этапе вы выбрали 4x1 визуальный блок пробелов (4 строки, 1 столбец).
  • Нажмите c. Обратите внимание, что это в значительной степени отступом слева от одного столбца.
  • Введите текст " vendor_" без цитаты. Обратите внимание на дополнительное пространство, которое нам нужно было вернуть.
  • Нажмите esc. Это один из тех немногих раз, когда я использую esc, чтобы выйти из режима вставки. ctrl c будет редактировать только первую строку.
  • Повторите шаг 1.
  • Отступом с помощью <.

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

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

Также почему редактирование нескольких строк сразу работает только путем выхода из режима вставки с esc поверх ctrl c?

Edit:

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

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.. Надеюсь, теперь вы можете увидеть недостаток этого метода. Я ограничен только выбором столбца текста , которые все одинаковы в вертикальной позиции.

Ответ 1

  • Переместите курсор на n в name.
  • Введите режим визуального блока (ctrl v).
  • Нажмите j три раза.
  • Нажмите I (столица i).
  • Введите vendor_.
  • Нажмите esc.

mini-screencast demonstrating the method

Вместо верхнего строчного I следует использовать прописную букву I, потому что нижний регистр I интерпретируется как начало текстового объекта, что весьма полезно само по себе, например для выбора внутри блока тегов (it):

mini-screencast showing the usefulness of the it text object

Ответ 2

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

  • Переместите курсор, где вы хотите начать
  • Нажмите I
  • Введите желаемый префикс (например, vendor_)
  • Нажмите esc.
  • Нажмите j, чтобы перейти по строке
  • Введите ., чтобы повторить последнее редактирование, автоматически вставив префикс снова
  • Быстрое изменение между j и .

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

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

Ответ 3

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

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

Теперь у вас хороший макрос.

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

Ответ 4

:%s/^/vendor_/

или я что-то не хватает?

Ответ 5

  • Выберите строки, которые вы хотите изменить, используя Ctrl-v.
  • Нажмите

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

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

Ответ 6

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

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

  • Переместите курсор на n в name.
  • Введите режим визуального блока (ctrl v).
  • Нажмите 3j
  • Нажмите I.
  • Введите vendor_.
  • Нажмите esc.

визуальная иллюстрация

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

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

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

Ответ 7

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

something

name
comment
phone
email

somethine else
and more ...

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

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

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

Ответ 8

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

Подобно этому

Hello World

Hello World

Для

Hello Cool

Hello Cool

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

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

Вставьте нужный материал и нажмите escape.

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

Ответ 9

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

  • Открыть файл vi file
  • Отобразить номера строк :set number! или :set number
  • Затем используйте номера строк, чтобы заменить start-of-line на "#", как?

:35,77s/^/#/

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

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

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

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

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

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

Ответ 10

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