ВИМ редактирование нескольких местах одновременно

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

например, предположим, что у вас есть

<tag1 class=""></tag1>
<tag2><tag3 class=""></tag3></tag2>

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

6 ответов


посмотреть SnippetsEmu. Он должен делать что-то очень похожее на то, что вам нужно.

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


вот как я бы, вероятно, отредактировал эти конкретные строки (есть много способов):

/""<enter>
aText to replace...<esc>
n
.

сначала найдите пустые кавычки, чтобы поместить курсор на первую. С помощью команды" a " (добавить) введите новый текст, чтобы поместить его в кавычки. Когда вы закончите, используйте "n "(next), чтобы перейти к следующему экземпляру и"."(повторите последнюю команду), чтобы снова вставить тот же текст. Повторите " n .- столько раз, сколько потребуется.

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


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

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

сочетания клавиш ctrl-v будет место в blockwise визуальном режиме.

если у вас есть несколько такие строки:

INSERT INTO Users VALUES(1, 'Jim');
INSERT INTO Users VALUES(2, 'Jack');
INSERT INTO Users VALUES(3, 'Joseph');

и хотел вставить " 0 " после идентификатора для каждой строки, затем поместите курсор после запятой в первой строке:

INSERT INTO Users VALUES(1,* 'Jim');

со звездочкой, представляющей курсор, последовательность команд будет:

CTRL-v  # Put into blockwise visual mode
j       # Down a line
j       # Down a line
CTRL-I  # Captial I for insert
0,      # the text to insert
Esc     # escape

теперь текст должен выглядеть так:

INSERT INTO Users VALUES(1, 0, 'Jim');
INSERT INTO Users VALUES(2, 0, 'Jack');
INSERT INTO Users VALUES(3, 0, 'Joseph');

также блочный визуальный режим, x удалит выделение, y будет дергать его.

:справка CTRL-V даст дополнительную документацию.


для вашего примера я бы использовал замену:

:%s/class=""/class="something"/g

Я также ищу что-то подобное, в частности, очень полезную функциональность из ST2, где вы нажимаете CTRL+D, чтобы выбрать следующее вхождение, а затем замените оба вхождения, просто введя его.


попробуйте этот плагин. Просто нажмите CTRL+N столько раз, сколько необходимо, чтобы выбрать несколько случаев

https://github.com/terryma/vim-multiple-cursors