Vim: вставлять одинаковые символы в несколько строк - PullRequest
264 голосов
/ 04 марта 2012

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

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

name
comment
phone
email

И заставил бы его выглядеть какthis

vendor_name
vendor_comment
vendor_phone
vendor_email

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

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

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

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

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

Ответы [ 12 ]

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

mini-screencast demonstrating the method

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

mini-screencast showing the usefulness of the it text object

63 голосов
/ 05 марта 2012

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

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

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

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

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

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

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

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

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

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

Введите 3@q, чтобы выполнить макрос 3 раза, чтобы выполнить остальные строки.

26 голосов
/ 07 марта 2012
:%s/^/vendor_/

или я что-то упустил?

12 голосов
/ 01 января 2016

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

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

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

visual illustration

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

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

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

7 голосов
/ 03 июля 2014

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

Как это

Hello World

Hello World

К

Hello Cool

Hello Cool

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

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

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

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

6 голосов
/ 17 октября 2017

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

  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

6 голосов
/ 04 марта 2012

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

something

name
comment
phone
email

somethine else
and more ...

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

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

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

3 голосов
/ 02 мая 2018

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

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

:%norm IXYZ

Что здесь происходит?

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

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

Специально для вашего запроса:

:%norm Ivendor_

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

:2,4norm Ivendor_

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

:'<,'>norm Ivendor_

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...