Скопируйте и вставьте содержимое из одного файла в другой файл в vi

256

Я работаю с двумя файлами, и мне нужно скопировать несколько строк из одного файла и вставить в другой файл. Я знаю, как скопировать (yy) и вставить (p) в один файл. Но это не работает для разных файлов. Как это сделать?

Кроме того, есть ли способ вырезать-вставить? Я пробовал поискать в Google, но большинство ресурсов говорят только о копировании-вставке.

Мача
источник
Вы уверены, что это не работает? Я использую это довольно часто для копирования строк между файлами.
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 +, чтобы перейти к другому файлу, и когда я делаю, «р» для пут, он печатает только кавычку
Мача
10
Если вы работаете с двумя окнами-замазками, вы должны использовать способ копирования / вставки через замазку / окна. Это легко. Пометьте материал, который вы хотите скопировать, с помощью мыши (вам больше ничего не нужно делать, этот помеченный текст теперь копируется в буфер обмена). Переключитесь в другое окно замазки. Войдите в режим вставки в vim (нажмите i). Нажмите правую кнопку мыши - правая мышь в окне замазки вставит все, что находится в буфере обмена.
Nos
3
То, что вы делаете, не сработает: янки в vi не помещают текст в буфер обмена Windows, а буфер янки не разделяется между открытыми экземплярами vim.
Адам Баткин
1
Я не понимаю , что последний пункт должен делать: * С в течение первого файла, Ctrl+ w, s.
svassr
1
для меня это разделило окно, но открыло точно такой же файл. Как вы выбираете, какой файл открыть в то время? Я видел команду, :sp myfileкоторая разбивается по горизонтали и открывает указанный файл, но как мне быть, если я предпочел бы разбить окно по вертикали?
svassr
50

Если вы используете Vim в Windows, вы можете получить доступ к буферу обмена (MS copy / paste), используя:

"*dd - вырезать линию (или 3DD, чтобы разрезать три линии)

"*yy - скопировать строку (или 3гг, чтобы скопировать три строки)

"*p - вставить строку (и) в строку после курсора

"*P - вставить строку (и) в строку перед курсором

Позволяет вставлять между отдельными окнами Vim или между приложениями Vim и ПК ( Блокнот , Microsoft Word и т. Д.).

JayG
источник
17
Использовать +как регистр буфера обмена кроссплатформенной системы (Windows и Linux) против* только для Windows (в Windows +работает так же, как *).
Стивен Свенсен
42

Используйте варианты dкакdd вырезать.

Чтобы записать диапазон строк в другой файл, вы можете использовать:

:<n>,<m> w filename

Где <n>и<m> - это числа (или символы), обозначающие диапазон строк.

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

апалала
источник
Для того, чтобы сделать это с помощью знаков, создать две метки (а и б, например) вокруг текста , который вы хотели бы записать в файл: перейти на первую линию, ma, переход к последней строке mb. Затем добавьте a 'к букве метки, когда используете :'a,'b w filename
указанную
отличное решение для широких диапазонов!
Ясин Окумуш
29

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

"имя_буфера, копирует в буфер. Yэто дергает и Pставится. Надеюсь, это поможет!

Win Man
источник
Спасибо! Это мне очень помогло
Ацуши Ямамото
28

Вот один из способов сделать это;

  • Запустите Vim и откройте файл file1, над которым вы работаете.
  • :e file2, который вызовет file2, файл, из которого вы хотите скопировать строки.
  • найдите строки, которые вы хотите скопировать. Если это три строки, вы нажмете3yy
  • :b1 это переключится на буфер 1, где file1
  • выясните, где вы хотите вставить линии, которые вы дернули, и нажмите p

Вы можете иметь оба файла для просмотра тоже. Разделите экран, например, Ctrl+ w s.

Что касается резки, dрежет и помещает вырезанный материал в буфер янки. ddбудет "разрезать" линию.

н.у.к.
источник
2
не по теме: как мне получить эти кнопки, похожие на кнопки?
Eckes
Как насчет двух файлов на двух разных ssh-серверах, на которые один и тот же клиент ssh'а входит в два разных терминала в Linux / MacOS? Я имею в виду, никакой замазки для использования, и два файла не могут быть открыты в одном сеансе vi в одном терминале.
Цян Сюй
1
Если клиент может подключиться через ssh к двум серверам, он также может использовать scp или sftp для этих двух серверов. Таким образом, самый быстрый способ - просто скопировать файл с одного сервера на другой, чтобы они находились на одном сервере, отредактировать эти файлы, как описано, и скопировать файл на другой сервер, когда вам это понадобится.
16

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

Malik
источник
странно, я получил код выхода 1 при запуске этого, к сожалению, на ОС х, не знаю, почему.
jayunit100
1
Спасибо за это предложение! Я использовал голову вместо sed, потому что хотел первые 2 строки::r ! head -n2 file.py
Федерико Понци
7

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

ma- устанавливает aоценку

mb- устанавливает bоценку

Затем, чтобы скопировать это в другой файл, просто используйте wкоманду:

:'a,'bw /name/of/output/file.txt
VMan
источник
7

Обновление 2017-05:

Я только что обнаружил, что если вы добавите следующую строку в ваш файл vimrc,

установить буфер обмена = безымянный

затем Vim использует системный буфер обмена.


Я только что обнаружил, что янки не будут работать на пути, где я копирую содержимое между разными окнами экземпляра Vim. (По крайней мере, это не работает, основываясь на моих знаниях Vim. Я не знаю, есть ли другой способ включить его).

Путь «янки» работает только в том случае, если в моем окне открыто несколько файлов в одном окне.

Если вы хотите это сделать, вам лучше использовать способ вырезания-копирования ОС, например Ctrl+ x, Ctrl+ c(под Windows).

Lichader
источник
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 в буфер обмена.

Источник: копирование и вставка между сеансами с использованием временного файла.

rovitulli
источник
4

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

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

Как открыть два файла в одном экземпляре Vim, зависит от вашей системы:

  • На Win32 есть опция в контекстном меню, которая гласит: Редактировать с одним vim, если вы выбираете два или более файлов.
  • Когда вы находитесь на консоли, вы можете достичь этого с vim file1 file2
  • Если вы используете Vim в качестве редактора для другого инструмента, обязательно укажите --remote-silentопцию, чтобы все файлы открывались в одном экземпляре.

Если вы открыли два файла в двух разных экземплярах Vim, то вам нужно перейти к системному буферу обмена: в первом экземпляре Vim скопируйте текст в системный буфер обмена, используя "+y(опять же, отметьте область, которую нужно восстановить в визуальном режиме, прежде чем ), а затем перейти ко второму Vim и вставить в буфер обмена есть: "+p.

Экес
источник
: tabedit filename может использоваться для открытия целевого файла, а затем просто p, чтобы вставить ваши строки. Я думаю, что это быстрее.
Джабалв
4

Цель : сохранить часть одного файла в другой файл.

Решение :

  1. Выберите текст, который вы хотите сохранить:
    • Поместите курсор туда, где вы хотите начать выделение
    • Нажмите, vчтобы выбрать символы ИЛИ заглавные буквы, Vчтобы выделить целые строки
    • Переместите курсор в конец того, что вы хотите выбрать
  2. Сохранить выделенный текст в новый файл. Введите :wSpaceи имя нового файла. На самом деле вы увидите

    :'<,'>w new.txt

    Затем нажмите Enter

Lu55
источник
Как вставить обратно из временного файла.?
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 строк и вставить в файл B

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*'будут скопированы после текущей позиции курсора

Raams
источник
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

Это поможет, если вы хотите скопировать и вставить несколько раз.

SibiCoder
источник
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
Энтони Оулей
источник