Как вставить строку из буфера копирования в конец каждой строки? - PullRequest
2 голосов
/ 14 октября 2019

У меня есть файл, содержимое которого выглядит следующим образом (более нескольких сотен строк):

+incdir+/a/b/c/

file_interface.c
file_fifo.c
file_thing.c

Мне нужно преобразовать файл так, чтобы он выглядел так:

file_interface.c +incdir+/a/b/c/
file_fifo.c +incdir+/a/b/c/
file_thing.c +incdir+/a/b/c/

Я знаю, что могу скопировать первую строку в буфер копирования, а затем вставить ее в любой символ, используя Control-V, а затем P, но кажется, что эта команда не работает с местом вставки, которое находится конкретно в конце каждой строки. Как я мог сделать это вместо этого?

Ответы [ 3 ]

4 голосов
/ 14 октября 2019

Вы можете удалить всю строку в именованном буфере и использовать обычную команду для добавления буфера к каждой строке

"aD
:%norm $"ap

или использовать буфер по умолчанию cudo's D. D. Knoble

D
:%norm! $p
1 голос
/ 16 октября 2019

Удалить первую строку:

:1delete

Удалить конец строки:

:let @" = substitute(@", '\n', '', '')

Вставить и объединить:

:global/^file/put | join
1 голос
/ 14 октября 2019

Моя попытка

В первой строке:

gg0yg_ ................. this will copy the first line without carriage return

Теперь давайте запустим глобальную команду:

:%g/^file_/exec "normal! A \<c-r>0"

Как это работает:

:%g/^file_/exec ................. over the whole file
" ............................... using double quotes we use keystroke notation
normal! ......................... normal command
A ............................... start insert at the end of line and add one space
\<c-r>0 ......................... inserts the copy register

:1,2d ........................... delete the first two lines

Мы даже можем создать функцию со всеми на ней:

fun! CopyToEnd()
    :normal gg0"+yg_
    :1,2d
    :g/file_/exe "normal! A \<c-r>+"
endfun
nnoremap <F5> :call CopyToEnd()<cr>

Затем вы можете скопировать эту функцию в буфер обмена и запустить:

:@+

Теперь просто нажмите <F5>

...