Иногда я хочу отредактировать определенный визуальный блок текста по нескольким строкам.
Например, я бы взял текст, который выглядит так:
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
еще раз, чтобы остановить запись.
Теперь у вас хороший макрос.
Введите 3@q
, чтобы выполнить ваш макрос 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