Иногда я хочу отредактировать определенный визуальный блок текста в несколько строк.
Например, я бы взял текст, который выглядит так:
name
comment
phone
email
И чтобы это выглядело так
vendor_name
vendor_comment
vendor_phone
vendor_email
В настоящее время, как я бы сделал это сейчас ...
- Выберите все 4 строки строки блока, нажав, Vа затем jчетыре раза.
- Отступ с >.
- Вернитесь на одно письмо с h.
- Перейти в блок визуального режима с помощью Ctrlv.
- Выберите четыре строки вниз, нажав jчетыре раза. На этом этапе вы выбрали визуальные блоки 4x1 (четыре строки и один столбец).
- Нажмите C. Обратите внимание, что это в значительной степени отступ слева от одного столбца.
- Введите
" vendor_"
без цитаты. Обратите внимание на дополнительное пространство, которое мы должны были вернуть. - Нажмите Esc. Это один из немногих случаев, когда я Escвыхожу из режима вставки. Ctrlcбудет редактировать только первую строку.
- Повторите шаг 1.
- Сделайте отступ в другом направлении <.
Мне не нужно делать отступ, если перед словами есть хотя бы один столбец пробела. Мне бы не понадобились пробелы, если бы мне не пришлось очищать визуальный блок c.
Но если мне нужно очистить, то есть ли способ сделать то, что я выполнил выше, без создания необходимого пробела с отступом?
Кроме того, почему редактирование нескольких строк одновременно работает только при выходе из режима вставки с Escболее чем Ctrlc?
Вот более сложный пример:
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.
. Надеюсь, теперь вы можете увидеть недостаток этого метода. Я ограничен только выбором столбца текста , которые все одинаковы в вертикальном положении .
:s/models\./\0whatever./
\0
на&
.Ответы:
n
вname
.I
(заглавная я).vendor_
. Примечание. Он будет обновлять экран только в первой строке - пока не Escбудет нажата кнопка (6.), после чего все строки будут обновлены.В верхнем регистре
I
должен использоваться, а не в нижнем регистреi
, потому что нижний регистрi
интерпретируется как начало текстового объекта , который довольно полезен сам по себе, например, для выбора внутри тега block (it
):источник
j
или^L
. Вы должны видеть, что Вим не был занят в конце концов; это было просто ожидание. Во-вторых, попробуйте изменить значение'timeout'
на более низкое, например80
(вместо значения по умолчанию1000
), и заметьте, что оно истекает быстрее.timeoutlen
не являетсяtimeout
.A
вместоI
, который будет вставлен после выбранного блока, а не до. Если ваши строки имеют разную длину, это не сработает; Для этого мне нравится использовать подстановку, совпадающую с концом каждой строки, например, выбирая несколько строк и используя:s/$/inserted/
.Другой подход заключается в использовании команды .(
dot
) в сочетании с I.vendor_
)Я считаю этот метод часто быстрее , чем в режиме визуального блока для небольшого числа дополнений и имеет дополнительное преимущество , что , если вам не нужно , чтобы вставить текст на каждой строке в диапазоне вы можете легко пропустить их, нажав дополнительные j«ю.ш. ,
Обратите внимание, что для большого количества смежных дополнений, блочный подход или макрос, вероятно, будет лучше.
источник
Нажмите:
Введите новый текст.
источник
Esc
для новичков VIM, таких как я, - мне потребовалось некоторое время, чтобы понять, что изменения распространяются «позже»!v
? Я могу сделать это с помощьюCtrl+V --> A
, ноv
выбор текста не работает -A
только добавляет к этой строке. Разве они не выбор? Кроме того, очень странно -A
добавляется только в конец строки, если я расширяю визуальный блок до конца строки; в противном случае он добавляется везде, где заканчивается визуальный блок для каждой строки. Как будто он не распознает разницу междуa
иA
.c
вместоC
, но он работал отлично. СпасибоЯ использовал макрос для записи своих действий, а затем повторял бы его.
Теперь у вас есть хороший макрос.
Напечатайте, 3@qчтобы выполнить ваш макрос три раза, чтобы выполнить остальные строки.
источник
или я что-то упустил?
источник
vender_
префикс нежелателен.1,4s/^/vendor_/
V
и набрать текст:
. Это будет префиксом выражения ed, с помощью:'<,'>
которого ed будет применяться только к выделению с помощью:'<,'>s/^/vendor_/
Обновлено января 2016
Хотя принятый ответ является отличным решением, на самом деле это несколько меньшее количество нажатий клавиш и лучше масштабируется - в принципе, исходя из принятого ответа.
n
вname
.I
.vendor_
.Обратите внимание, что это имеет меньше нажатий клавиш, чем принятый ответ (сравните Шаг 3). Мы просто посчитаем количество j действий для выполнения.
Если у вас включены номера строк (как показано выше) и вы знаете номер строки, на которую хотите перейти, то шаг 3 можно изменить на #, Gгде # - номер требуемой строки.
В нашем примере выше это было бы 4G. Однако при работе с несколькими номерами строк явный счет работает хорошо.
источник
Я хотел закомментировать много строк в каком-либо файле конфигурации на сервере, на котором был только vi (без nano), поэтому визуальный метод также был громоздким. Вот как я это сделал.
vi file
:set number!
или:set number
:35,77s/^/#/
Примечание: цифры включительно, строки от 35 до 77, обе включены будут изменены.
Чтобы раскомментировать / отменить это, просто используйте
:35,77s/^#//
Если вы хотите добавить текстовое слово в качестве комментария после каждой строки кода, вы также можете использовать:
:35,77s/$/#test/
(для таких языков, как Python):35,77s/;$/;\/\/test/
(для таких языков, как Java)кредиты / ссылки:
/unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim
/unix/120615/how-to-comment-multiple-lines-at-once
источник
У вас также может быть случай использования, когда вы хотите удалить блок текста и заменить его.
Как это
к
Вы можете просто визуальным блоком выбрать «Мир» в обеих строках.
Введите cдля изменения - теперь вы будете в режиме вставки.
Вставьте материал, который вы хотите, и нажмите «Побег».
Оба отражаются вертикально. Он работает так же, как «I», за исключением того, что он заменяет блок новым текстом вместо его вставки.
источник
Предположим, у вас есть этот файл:
Вы хотите добавить «vendor_» перед «name», «comment», «phone» и «email» независимо от того, где они появляются в файле .
c
Флаг запросит подтверждение. Вы можете отказаться от этого, если вы не хотите, чтобы подсказка.источник
Альтернатива, которая может быть более гибкой:
Пример: для ввода текста XYZ в начале строки
Что тут происходит?
%
== Выполнить в каждой строкеnorm
== Выполнить следующие ключи в обычном режимеI
== Вставить в начале строкиXYZ
== Текст, который вы хотите ввестиЗатем вы нажмете Enter, и это выполняется.
Специально для вашего запроса:
Вы также можете выбрать определенный диапазон:
Или выполнить в выбранном визуальном диапазоне:
источник
ctrl-v ctrl-[
«Esc», который возвращает вас в «обычный режим» для вашей обычной команды. Я просто проверил это с'<,'>norm Iaa^[ysiw"
, где^[
находится сбежавший Esc.источник
источник