Добавить один диапазон строк в конец другого диапазона строк - PullRequest
2 голосов
/ 26 марта 2010

Вот пример буфера в vim:

fooooo
bar
pippy

one
two
three

А вот что я хотел бы произвести:

foooooone
bartwo
pippythree

В идеале, указав два диапазона номеров строк, но последовательность команд также будет хорошей.

Ответы [ 5 ]

2 голосов
/ 27 марта 2010

Вот решение для vim-скрипта:

fun MergeLines(start1, start2, length)
    let end1 = a:start1 + a:length - 1
    let end2 = a:start2 + a:length - 1
    let starting_lines = getline(a:start1, end1)
    let ending_lines = getline(a:start2, end2)

    " Append each line in ending_lines to starting_lines.
    let i = 0
    while i < linecount
        let starting_lines[i] .= ending_lines[i]
        let i += 1
    endw

    " Set the new lines.
    call setline(a:start1, starting_lines)

    " Delete the old ones (there should be a function for this...).
    exe a:start2 . ',' . end2 . 'del'
endf

Итак, чтобы выполнить ваш пример:

:call MergeLines(1, 4, 3)
2 голосов
/ 26 марта 2010

В таких случаях я обычно записываю макрос так: qq4j^y$4k$pjq. Вот что он делает: начиная с элемента первого списка, он переходит ко второму списку, копирует элемент, возвращается назад, затем вставляет элемент в конец строки. Наконец, он переходит ко второму элементу первого списка. Выполнение этого макроса три раза (3@q) дает желаемый результат.

1 голос
/ 26 марта 2010

Хорошо, начните с того, что дергаете или удаляете три строки, которые вы хотите поместить в конце (например, 5G3dd). Тогда:

:let lines=split(@","\n")

Это помещает все эти строки в список строк (например, ['one', 'two', 'three']).

Теперь выберите линии, к которым вы хотите добавить (например, 1GV2j). Тогда

:'<,'>s/$/\=remove(lines,0)

Заменяет конец каждой строки (/$/) в выбранном диапазоне ('<,'>) следующей строкой, не сдвинутой с начала списка строк (\=remove(lines,0)).

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

1 голос
/ 26 марта 2010

Поскольку ваша первая группа имеет одинаковую длину строки, вы можете использовать выбор блока с <C>-v. Начиная с первого выбранного символа вашего второго блока,

<C>-v } $ d { $ p

Таким образом, вы выбираете всю нижнюю часть в режиме «блока», перемещаетесь к концу строки начала первого блока и вставляете.

1 голос
/ 26 марта 2010

Регистры Vim имеют связанный с ними режим: символьно, соответственно и блочно Это влияет на то, как содержимое регистра помещается в буфер при вставке содержимого регистра. Вы можете использовать это в своих интересах для этой проблемы.

Поместите курсор в начало строки one и выберите эти строки в режиме визуального блока:
Ctrl + v $ J J
Удалить блок:
х
Переместите курсор в конец строки foo и вставьте то, что вы только что удалили:
р

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