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

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

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

name comment phone email 

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

 vendor_name vendor_comment vendor_phone vendor_email 

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

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

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

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

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

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

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

 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 .
  2. Войдите в режим визуального блока ( ctrl v ).
  3. Нажмите j три раза.
  4. Нажмите I (капитал i).
  5. Введите vendor_ .
  6. Нажмите esc .

мини-скринкаст, демонстрирующий метод

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

мини-скринкаст, показывающий полезность текстового объекта

Другой подход – использовать . ( dot ) в комбинации с I.

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

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

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

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

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

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

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

 :%s/^/vendor_/ 

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

  1. Выберите строки, которые вы хотите изменить, используя Ctrl V.
  2. Нажмите:

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

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

Обновлено Январь 2016

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

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

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

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

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

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

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

 something name comment phone email somethine else and more ... 

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

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

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

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

Как это

 Hello World Hello World 

к

 Hello Cool Hello Cool 

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

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

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

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

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

  1. Открыть файл vi file
  2. Отображать номера строк :set number! или :set number
  3. Затем используйте номера строк, чтобы заменить start-of-line на «#», как?

: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

 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 
 1. ctrl + v to go to visual block 2. select the lines using up and down arrow 3. enter small 3i ( presess SMALL I three times) 4. I (Press capital I, That will take you into insert mode) 4. Write the text you want to add 5. esc 6. press down arrow 

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

Пример: для ввода текста XYZ в начале строки

:%norm IXYZ

Что тут происходит?

  • % == Выполнять на каждой строке
  • norm == Выполнить следующие клавиши в нормальном режиме
  • I == Вставка в начале строки
  • XYZ == Текст, который вы хотите ввести

Затем вы нажимаете enter, и он выполняется.

Конкретно по вашему запросу:

:%norm Ivendor_

Вы также можете выбрать определенный диапазон:

:2,4norm Ivendor_

Или выполнить над выбранным визуальным диапазоном:

:'<,'>norm Ivendor_

  • Как запустить терминал внутри Vim?
  • Как я могу расширить полный путь к текущему файлу, чтобы перейти к команде в Vim?
  • VIM - Как сопоставить Shift-Enter
  • Более полезная статусная линия в vim?
  • Как изменить курсор vim в режиме Insert / normal?
  • Вставить в режиме вставки?
  • Давайте будем гением компьютера.