Я хотел бы объединить два блока строк в Vim, то есть взять строки n..m
и добавить их в строки a..b
. Если вы предпочитаете объяснение псевдокода:[a[i] + b[i] for i in min(len(a), len(b))]
Пример:
abc
def
...
123
45
...
должен стать
abc123
def45
Есть хороший способ сделать это без копирования и вставки вручную?
x
с помощью joinx+2
?[a[i] + b[i] for i in min(len(a), len(b))]
Ответы:
Конечно, вы можете сделать все это с помощью одной копии / вставки (используя выбор в блочном режиме), но я предполагаю, что это не то, что вы хотите.
Если вы хотите сделать это только с помощью команд Ex
преобразует
в
ОБНОВЛЕНИЕ: ответ с таким большим количеством голосов заслуживает более подробного объяснения.
В Vim вы можете использовать символ pipe (
|
) для объединения нескольких команд Ex, поэтому приведенное выше эквивалентноМногие команды Ex принимают диапазон строк в качестве аргумента префикса - в приведенном выше случае
5,8
beforedel
и the1,4
befores///
указывают, какие строки работают с командами.del
удаляет указанные строки. Он может принимать аргумент регистра, но когда он не задан, он сбрасывает строки в безымянный регистр,@"
как удаление в обычном режиме.let l=split(@")
затем разбивает удаленные строки в список, используя разделитель по умолчанию: пробел. Для правильной работы с вводом, который имеет пробелы в удаленных строках, например:мы должны были бы указать другой разделитель, чтобы предотвратить «работа» из раскалывается на два списка элементов:
let l=split(@","\n")
.Наконец, в подстановке
s/$/\=remove(l,0)/
мы заменяем конец каждой строки ($
) значением выраженияremove(l,0)
.remove(l,0)
изменяет списокl
, удаляя и возвращая его первый элемент. Это позволяет нам заменять удаленные строки в том порядке, в котором мы их читаем. Вместо этого мы могли бы заменить удаленные строки в обратном порядке, используяremove(l,-1)
.источник
s/\s*$/
вместоs/$/
.:sil5,8del | let l=split(@") | sil1,4s/$/\=remove(l,0)/ | call histdel("/", -1) | nohls
кажется, даже лучше, так как он очищает историю поиска после запуска. И он не показывает сообщение «х больше / меньше строк», требующее от меня нажатия клавиши ввода.:help range
,:help :d
,:help :let
,:help split()
,:help :s
,:help :s\=
,:help remove()
.Элегантная и краткая команда Примера решения вопроса может быть получена путем объединения
:global
,:move
и:join
команды. Предполагая, что первый блок строк начинается с первой строки буфера и что курсор находится на строке, непосредственно предшествующей первой строке второго блока, команда выполняется следующим образом.Для подробного объяснения этой техники см. Мой ответ на похожий вопрос « Vim paste -d» поведение «из коробки»? ».
источник
E16: Invalid Range
- но это все равно работает. При удалении1,
работает без ошибок.:move
и:join!
, ни того, что''
имел в виду в качестве аргумента диапазона (:help ''
) и тем, что+
и-
имел в виду в качестве модификаторов диапазона (:help range
). Спасибо!sil!
команду.Чтобы соединить блоки строки, вы должны сделать следующие шаги:
jj
CTRL-v
$
CTRL-END
x
kk$
p
Движение не самое лучшее (я не эксперт), но оно работает так, как вы хотели. Надеюсь, что будет более короткая версия.
Вот предварительные условия, чтобы этот метод работал хорошо:
abc
иdef
) имеют одинаковую длину XORисточник
abc
иdef
имеют одинаковую длину. При выборе блока будут сохраняться отступы удаленного текста, поэтому, если при размещении текста курсор находится на короткой строке, строки вставляются между буквами более длинных, а пробелы добавляются к более коротким, если курсор был длиннее. один.:%s/ \+/ /g
set ve=all
должно помочь, см. vimdoc.sourceforge.net/htmldoc/options.html#'virtualedit 'Вот как я это сделаю (с курсором на первой строке):
Вам нужно знать две вещи:
Вот что происходит:
qa
записывает все до следующегоq
в "буфер" вa
.ma
создает отметку на текущей строке.:5<CR>
идет к следующей группе.y$
дергает остальную часть линии.'a
возвращается к отметке, установленной ранее.$p
вставляет в конце строки.:5<CR>
возвращается к первой строке второй группы.dd
удаляет это.'a
возвращается к отметке.jq
идет вниз на одну строку и останавливает запись.3@a
повторяет действие для каждой строки (3 в моем случае)источник
[Enter]
после того,:5
как оба раза вы наберете его, или это не сработает.:norm qama:5<CR>y$'a$p:5<CR>dd'ajq3@a
но, кажется, только для выполненияq
.:let @a="ma:5^My$'a$p:5^Mdd'aj" | normal 4@a
, где^M
символы набираются, нажав CTRL-V, затем Enter.Как упоминалось в другом месте, выбор блока - это путь. Но вы также можете использовать любой вариант:
:!tail -n -6 % | paste -d '\0' % - | head -n 5
Этот метод основан на командной строке UNIX.
paste
Утилита была создана для обработки такого рода линия сращивания.источник
paste -d
-подобное) поведение может быть реализовано с помощью короткой команды Vim, как показано в моем ответе .Примерные данные такие же, как у Rampion.
источник
Я не думаю, что сделать это слишком сложно. Я бы просто включил virtualedit
(
:set virtualedit=all
)Выберите блок 123 и все ниже.
Поместите это после первого столбца:
и удалите несколько пробелов между 1 пробелом:
источник
gvV:'<,'>s/\s+//g
(vim должен автоматически вставить'<,'>
для вас, так что вам не нужно вводить его вручную).Я бы использовал сложные повторы :)
Учитывая это:
С курсором в первой строке нажмите следующее:
а затем нажмите
@a
(и вы можете впоследствии использовать@@
) столько раз, сколько необходимо.Вы должны в конечном итоге:
(Плюс перевод строки)
Explaination:
qa
начинает запись сложного повтора вa
}
переходит на следующую пустую строкуjdd
удаляет следующую строку''
возвращается в положение перед последним прыжкомp
вставьте удаленную строку под текущуюkJ
добавить текущую строку в конец предыдущейx
удалить пробел, которыйJ
добавляется между комбинированными строками; Вы можете опустить это, если вы хотите местоj
перейти к следующей строкеq
закончить сложную повторную записьПосле этого вы будете использовать
@a
для запуска сложного повтора, хранящегося вa
, а затем вы сможете использовать@@
для повторного запуска последнего повторения сложного повтора.источник
Есть много способов сделать это. Я объединю два блока текста, используя любой из следующих двух методов.
Предположим, что первый блок находится в строке 1, а второй блок начинается со строки 10 с начальной позиции курсора в строке номер 1.
(\ n означает нажатие клавиши ввода.)
с макросом, используя команды: копировать, вставить и присоединиться.
с помощью макроса с помощью команд переместите строку на номер n-й строки и присоединитесь.
источник