Добавление набора строк в конец другого набора линий - PullRequest
4 голосов
/ 05 января 2012

У меня есть, скажем, 10 последовательных строк, за которыми следуют еще 10 строк, например,

1
2
:
10
a
b
:
j

Я хочу добавить второй набор строк, чтобы они появились в конце первого набора строк, чтобыэто выглядит так:

1a
2b
:
10j

Ответы [ 3 ]

3 голосов
/ 05 января 2012

Я бы начал с строки a, затем CTRL-V , 10j$d, чтобы удалить все из блоков.

Затем :set virtualedit=all, перейдите к первой строке, переместите курсор вправо на 10 символов, например, и нажмите p. Теперь удалите первую последовательность пробелов в десяти строках.

Есть второй способ, который в основном такой же:

  • 10dd
  • :call setreg('"', @", ' ^ V '), где ^ V набирается с помощью CTRL-V CTRL-V
    (это превратит регистр в блок)
  • P
  • :,+10s/ //g

Вы также можете сделать это программно: войдите в режим Ex с помощью Q и введите это

 let i = 1
 while i <= 10
    call setline(i, getline(i) . getline(11))
    11d
    let i = i + 1
 endwhile
 vi

Если вы собираетесь использовать его снова, поместите это в ваш vimrc:

 function PasteLines(startline,numlines)
     let i = 0
     while i < a:numlines
        call setline(a:startline+i, getline(a:startline+i) . getline(a:startline+a:numlines))
        exec '' . (a:startline+a:numlines) . 'd'
        let i = i + 1
     endwhile
 endfunction

И назовите это с помощью:

 :call PasteLines(1, 10)

где 1 - первая строка, а 10 - количество строк. Поэтому вам нужно 20 строк.

2 голосов
/ 06 января 2012

Предполагая, что курсор находится в первой строке блока из двадцати строк, давайте рассмотрим следующую короткую команду Ex:

:,+9g/^/''+10m.|-j!

Это команда :global, выполняющаяся на принадлежащих строкахв диапазон следующих десяти строк (начиная с текущей).В каждой из этих строк последовательно выполняются две команды Ex, ''+10m. и -j!.Первая команда занимает десятую строку под строкой, в которой был установлен курсор, и вставляет ее чуть ниже строки, в которой курсор находится в данный момент, с помощью команды :move.Команда :join, -j!, добавляет только что перемещенную строку к той, которая находится непосредственно над ней (без вставки или удаления пробела между ними из-за модификатора !).

Есть два соображения, которыенеобходимо принять во внимание, чтобы получить представление об этой линии движения.Во-первых, прежде чем команда, указанная в :global, будет выполнена в еще одной строке, курсор будет расположен в первом столбце этой строки.Таким образом, адрес, указанный в вышеупомянутой команде :move как ., соответствует самой последней строке, в которой команда выполняется в данный момент.Во-вторых, номер строки, которая была текущей непосредственно перед тем, как команда :global была отправлена ​​на выполнение, добавляется в список переходов.Поэтому его адрес может быть получен в диапазонах через псевдометку ' (см. :help :range).

Тот же эффект может быть достигнут с помощью команд обычного режима:

qqdd9+PgJ9-q9@q

Эта последовательность команд реализует ту же схему перемещения, используя макросы для повторения однострочной операции передачи.Команды для объединения первой пары строк, dd9+PgJ9-, записываются в регистр "q с помощью команды q.Подобно команде Ex, предложенной выше, макросы удаляют текущую строку (dd), перемещают курсор на девять строк вниз (9+), вставляют только что вырезанную линию над новой позицией курсора (P), соединяетдве строки без добавления или удаления пробелов между ними (gJ) и перемещения курсора на девять строк вверх (9-).Наконец, эти действия автоматически повторяются девять раз с помощью команды @, чтобы объединить оставшиеся девять пар соответствующих строк.

2 голосов
/ 06 января 2012

Это был бы мой путь:

qaG"aDdd9-$"apq
9@a

Пояснение:

q             # Begin recording typed characters...
a             # to register 'a'
G             # Set cursor in last line.
"aD           # Delete the content from the beginning of line till the end and save it in register 'a'.
dd            # Previous command deleted the content but left the line in blank, delete the complete line.
9-            # Go back 9 lines.
$             # Set cursor at the end of current line (last number in your example).
"ap           # Paste content of register 'a' (at end of line without newline character).
q             # Stop recording.
---------------
9             # Run nine times.
@a            # Commands of register 'a' (all previous commmands).
  • Зарегистрировать «а», где я записываю команды, - это другой регистр, в котором я сохраняю содержимое каждой строки, хотя они названы одинаково (буква «а»).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...