Скопіюйте та вставте вміст з одного файлу в інший файл in vi


256

Я працюю з двома файлами, і мені потрібно скопіювати кілька рядків з одного файлу та вставити в інший файл. Я знаю, як скопіювати (yy) та вставити (p) у той самий файл. Але це не працює для різних файлів. Як це робиться?

Також, чи існує спосіб вирізання та вставки? Я спробував googling, але більшість ресурсів говорять лише про copy-paste.


Ви впевнені, що це не працює? Я використовую це досить часто для копіювання рядків між файлами.
sjngm

Ну коли я це роблю, я отримую лише лапки?
мача

4
Команда dd працює як cut.
Мартін Стральберг

Відповіді:


218

Оскільки ви вже знаєте, як вирізати / витягнути текст, ось кілька ідей для вставки його назад в інший файл:

  • Відредагуйте перший файл, поклавши потрібний текст. Потім відкрийте другий файл зсередини vi ( :e /path/to/other/file) та вставте його
  • Відкрийте обидва файли разом у розділеному вікні та перейдіть між ними за допомогою Ctrl+ w, Up/ Downабо:

    • vi -o /path/to/file1 /path/to/file2
    • Зсередини першого файлу Ctrl+ w,s

У мене відкриті два вікни шпаклівки, я роблю спершу v для візуального режиму, а потім виберіть усі рядки і зробіть "y" для янки, не я роблю вкладку alt +, щоб потрапити на інший файл і коли я це роблю "p" для put, він друкує лише лапки.
macha

10
Якщо ви працюєте з двома вікнами шпаклівки, вам доведеться використовувати спосіб копіювання / вклеювання шпаклівки / windows. Це просто. Позначте речі, які ви хочете скопіювати, мишкою (вам більше нічого не потрібно робити; цей позначений текст скопіюється у буфер обміну.) Переключіться на інше вікно шпаклівки. Введіть режим вставки в vim (натисніть i). Натисніть праву кнопку миші - права миша у вікні шпаклівки вставить все, що є в буфер обміну.
Н.З.К.

3
Те, що ви робите, не спрацює: Yanking in vi не помістить текст у буфер обміну Windows, а буфер yank не поділиться між відкритими екземплярами vim.
Адам Баткін

1
Я не розумію , що останній пункт повинен робити: * З в протягом першого файлу, Ctrl+ w, s.
svassr

1
для мене він розділив вікно, але відкрив точно той самий файл. Як ви вибираєте, який файл потім відкрити? Я бачив команду, :sp myfileяка розбивається по горизонталі і відкриває вказаний файл, але як би це зробити, якщо я вважаю за краще розділити вікно вертикально?
svassr

50

Якщо ви використовуєте Vim в Windows, ви можете отримати доступ до буфера обміну (копія та вставка MS) за допомогою:

"*dd - вирізати лінію (або 3dd, щоб вирізати три лінії)

"*yy - скопіюйте рядок (або 3yy, щоб скопіювати три рядки)

"*p - вставити лінії (и) у рядок після курсору

"*P - вставити лінії (и) у рядок перед курсором

Дозволяє вставляти між окремими вікнами Vim або між програмами Vim та ПК ( Блокнот , Microsoft Word тощо).


17
Використовуйте +як міжплатформенний реєстр буфера обміну системи (Windows і Linux) *, який є тільки Windows ( +працює так само, як і в Windows *).
Стівен Свенсен

42

Використовуйте варіанти dяк ddнарізати.

Для запису діапазону рядків до іншого файлу ви можете використовувати:

:<n>,<m> w filename

Де <n>і <m>є числа (або символи), які позначають діапазон ліній.

Для використання буфера обміну робочого столу подивіться на +gкоманди.


Для того, щоб зробити це з допомогою знаків, створити дві мітки (а і б, наприклад) навколо тексту , який ви хотіли б записати в файл: перейти на першу лінію, ma, перехід до останнього рядка mb. Потім додайте 'до літери позначки, коли ви використовуєте вищевказану команду::'a,'b w filename
EchoLynx

чудове рішення для широких ліній!
Ясін Окумуш

29

Ви можете відкрити інший файл і ввести :r file_to_be_copied_from. Або ви можете буферувати. Або перейдіть до першого файлу, перейдіть до рядка, який ви хочете скопіювати, введіть "qY, перейдіть до файла, який потрібно вставити та введіть "qP.

"buffer_name, копії в буфер. Yтягне і Pставиться. Сподіваюся, що це допомагає!


Дякую! Це допомогло мені тонн
Ацусі Ямамото

28

Ось один із способів зробити це;

  • Запустіть Vim та відкрийте файл1, який є файлом, над яким ви працюєте.
  • :e file2, який відобразить файл2, файл, з якого потрібно скопіювати рядки.
  • знайдіть рядки, які ви хочете скопіювати. Якщо це три рядки, ти вдариш3yy
  • :b1 це перейде до буфера 1, де file1 є
  • з'ясуйте, куди ви хочете вставити рядки, по яких ви постригли, і натисніть p

Ви могли також бачити обидва файли. Розділіть екран наприклад Ctrl+ w s.

Що стосується різання, dвирізати та помістити вирізані речі в буфер. dd"переріже" лінію.


2
Поза темою: як я можу отримати такі речі, схожі на клавіатуру?
eckes


А що з двома файлами на двох різних серверах ssh, які той самий клієнт ssh'е в двох різних терміналах в Linux / MacOS? Я маю на увазі, ніякої шпаклівки використовувати, і два файли не можна відкрити за один і той же сеанс vi в одному терміналі.
Цянь Сюй

1
Якщо клієнт може запустити два сервери, він також може використовувати scp або sftp для цих двох серверів. Таким чином, найшвидший спосіб - просто скопіювати файл з одного сервера на інший, щоб вони знаходилися на тому ж сервері, відредагувати ці файли, як описано, і скопіювати файл назад на інший сервер, коли потрібно.
нос

16

Це все чудові пропозиції, але якщо ви знаєте розташування тексту в іншому файлі, використовуйте sed з легкістю. :r! sed -n '1,10 p' < input_file.txtЦе дозволить вставити 10 рядків у вже відкритий файл у поточному положенні курсору.


як не дивно, я отримав код виходу 1, коли запускаю це на жаль на os x, не знаю, чому.
jayunit100

1
Дякую за цю пропозицію! Я використовував голову замість sed, тому що я хотів перші 2 рядки::r ! head -n2 file.py
Федеріко Понці

7

Під час редагування файлу робіть позначки там, де ви хочете використовувати його початок і кінець

ma- встановлює aпозначку

mb- встановлює bпозначку

Потім, щоб скопіювати це в інший файл, просто скористайтеся wкомандою:

:'a,'bw /name/of/output/file.txt

7

Оновлення 2017-05:

Щойно я виявив, що якщо ви додасте наступний рядок у свій файл vimrc,

встановити буфер обміну = без назви

то Vim використовує буфер обміну системи.


Щойно я виявив, що шлях не працює на шляху, коли я копіюю вміст між різними вікнами примірника Vim. (Принаймні, це не працює на основі моїх знань Vim. Я не знаю, чи є інший спосіб, щоб він міг працювати).

Шлях yank працює лише в тому випадку, коли згідно з моїм тестом відкриваються кілька файлів в одному вікні.

Якщо ви хочете це зробити, вам краще скористатись операційним способом вирізання копії, наприклад Ctrl+ x, Ctrl+ c(під Windows).


5

Ці ремейки працюють як шарм для мене:

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

Отже, коли я перебуваю у візуальному режимі, я вибираю потрібні лінії та натискаю Ctrl+, cа потім Ctrl+v щоб вставити текст у файл приймача. Ви можете також використовувати "* y", але я думаю, що це важко запам'ятати.

Це також корисно для копіювання тексту з Vim у буфер обміну.

Джерело: Скопіюйте та вставте між сеансами, використовуючи тимчасовий файл


4

Копіювання тексту між двома буферами (== файлами), відкритими в одному екземплярі Vim, не є проблемою:

Просто потягніть в один буфер за допомогою y(припускаючи, що ви позначили область копіювання у візуальному режимі раніше), а потім вставити в інший буфер за допомогоюp . Він також працює з різними вкладками, якщо вони знаходяться в одному екземплярі Vim.

Як відкрити два файли в одному екземплярі Vim, залежить від вашої системи:

  • У програмі Win32 в контекстному меню є параметр із редагуванням з одним vim, якщо ви вибираєте два чи більше файлів
  • Коли ви знаходитесь на консолі, ви можете досягти цього за допомогою vim file1 file2
  • Якщо ви використовуєте Vim як редактор для іншого інструменту, обов'язково вкажіть --remote-silentопцію, щоб гарантувати, що всі файли відкриваються в одному екземплярі

Якщо ви відкрили два файли у двох різних екземплярах Vim, вам доведеться перейти із буфера обміну системи: у першому екземплярі Vim витягніть текст до буфера обміну системою, використовуючи "+y(знову ж таки, позначте область, яку потрібно витягнути у візуальному режимі, перш ніж ), а потім перейти до другого Vim і вставити в буфер обміну є: "+p.


: ім'я файлу tabedit можна використовувати для відкриття цільового файлу, а потім просто p, щоб вставити рядки. Я думаю, що це швидше.
jabalv

4

Мета : зберегти фрагмент одного файлу в інший файл.

Рішення :

  1. Виберіть текст, який потрібно зберегти:
    • Розташуйте курсор там, де ви хочете розпочати вибір
    • Натисніть, vщоб вибрати символи АБО великі регістри, Vщоб вибрати цілі рядки
    • Перемістіть курсор до кінця того, що ви хочете вибрати
  2. Збережіть вибраний текст у новому файлі. Введіть :wSpaceі ім'я нового файлу. Насправді ви побачите

    :'<,'>w new.txt

    Потім натисніть Enter


Як вставити назад з темп-файлу.?
Vineet

3

Мій сценарій полягав у тому, що мені потрібно скопіювати n кількість рядків посередині, n невідомо, з файлу 1 у файл 2.

:'a,'bw /name/of/output/file.txt

2
  1. Переконайтеся, що у вас версія Vim складена з підтримкою буфера обміну
    • :echo has('clipboard') повинен повернутися 1
    • якщо він повертається 0(наприклад, Mac OS X, принаймні v10.11 (El Capitan), v10.9 (Mavericks) і v10.8 (Mountain Lion) - постачається з версією Vim, у якій відсутня підтримка буфера обміну), ви повинні встановити Версія Vim з підтримкою буфера обміну, скажімо через brew install vim(не забудьте перезапустити свій термінал після встановлення)
  2. Введіть візуальний режим ( V- багаторядковий, v- звичайний або Ctrlv- блок-візуальний)
  3. Виберіть рядки, які потрібно скопіювати
  4. "*y - для копіювання вибраного
  5. "*p - вставити скопійовано

PS:

  • ви можете замінити кроки 2-5 з інструкціями від відповіді на JayG , якщо вам потрібно скопіювати і вставити один рядок
  • для полегшення вибору ліній, ви можете додати set mouse+=aдо вашого .vimrc- це дозволить вам вибрати рядки в Vim з допомогою миші, а не вибір сторонніх елементів (наприклад , номери рядків і т.д.) ПРИМІТКА: він буде блокувати можливість копіювання миші обраного тексту до системного буфера обміну від Vim .

1

Приклад: fileA та fileB - запустіть у fileA з рядка 25, скопіюйте 50 рядків та вставте у fileB

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp

1

Наведений нижче варіант працює більшу частину часу, а також для вставки пізніше.

 "xnyy
x - buffer name
n - number of line to Yank - optional

Рядки, пострижені, зберігатимуться в буфері 'x'. Його можна використовувати в будь-якому місці редагування.

Щоб вставити рядки в інший файл,

:e filename&location

Приклад: Введіть команду нижче в поточному редагуванні

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

Повна операція

відкрити файл 1:

vi Test1.sh

a10yy

-Yanked 10 lines

-відкрийте другий файл із поточної редагування

*:e /u/test/Test2.sh*

-перевести курсор до рядка, куди потрібно вставити

*"ap*

- Рядки з буфера '*a*'будуть скопійовані після поточної позиції курсору


1

Якщо ви хочете скопіювати частину файлу та вставити цей вміст посередині іншого файлу, ви можете це зробити.

:linenumber,linenumber write newfile

Приклад:

:2,34 write temp1

Або

:'mark, 'mark write newfile

Приклад:

:'a,'b write temp1

Тепер рядки копіюються в інший файл. Якщо ви хочете видалити ці рядки після копіювання, можете зробити це

:linenumber1,linenumber2 d

Або

:'mark1,'mark2 d

Тепер перейдіть до іншого файлу. Потім тримайте курсор у тій лінії, куди ви хотіли вставити.

Тип

:r!cat temp1

Тепер сюди вставляється вміст тимчасового файлу. Ви можете видалити тимчасовий файл із самого командного рядка після вставки вмісту.

:!rm temp1

Це допоможе, якщо ви хотіли скопіювати та вставити кілька разів.


0

Іншим способом може бути відкриття двох файлів у двох розділених буферах та використання наступного "фрагмента" після візуального вибору рядків, що цікавлять.

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

0

Введіть командний режим і запустіть

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

Наприклад, для вилучення рядків 20-30із filenameвідкритого файлу, який наразі відкривається

:r! sed -n '20, 30p' filename
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.