Скопируйте и вставьте содержимое из одного файла в другой файл в vi
Я работаю с двумя файлами, мне нужно скопировать несколько строк из одного файла и вставить в другой файл. Я знаю, как копировать (yy) и вставлять (p) в один и тот же файл. Но это не работает для разных файлов, как это делается?
Кроме того, есть ли способ вырезать-вставить? Я пробовал поиск по Google, но большинство ресурсов говорят только о копировании.
Ответы
Ответ 1
Поскольку вы уже знаете, как вырезать/выкладывать текст, вот несколько идей для вставки его обратно в другой файл:
Ответ 2
Если вы используете VIM в Windows, вы можете получить доступ к буферу (MS copy/paste), используя:
" * d d - отрежьте строку (или 3dd, чтобы разрезать 3 строки)
" * y y - скопируйте строку (или 3yy, чтобы скопировать 3 строки)
" * p - вставить строки в строке после курсора
" * p - вставить строки (строки) в строке перед курсором
Позволяет вставлять между отдельными окнами VIM или между приложениями VIM и ПК (блокнот, слово и т.д.).
Ответ 3
Используйте варианты d
как dd
для вырезания.
Чтобы написать ряд строк в другой файл, вы можете использовать:
:<n>,<m> w filename
Где <n>
и <m>
- это числа (или символы), которые обозначают диапазон строк.
Для использования буфера обмена рабочего стола ознакомьтесь с командами +g
.
Ответ 4
Вы можете открыть другой файл и набрать :r file_to_be_copied_from
. Или вы можете буферизировать. Или перейдите к первому файлу, перейдите к строке, которую вы хотите скопировать, введите "qY
, перейдите в файл, который хотите вставить, и введите "qP
.
"
имя_буфера, копирует в буфер. Y
yank и P
. Надеюсь, что это поможет!
Ответ 5
Здесь один из способов сделать это;
- Запустите vim и откройте файл1, который является файлом, над которым вы работаете.
- : e file2, который вызовет файл2, файл, с которого вы хотите скопировать строки.
- найдите строки, которые вы хотите скопировать, если это 3 строки, вы нажмете 3 y y
- : b 1 это переключится на буфер 1, где file1 -
- укажите, где вы хотите вставить строки, которые вы дернули, и нажмите p
Вы могли бы также просматривать оба файла, разделить экран, например. CTRL + w s
Что касается разрезания, d разрезает и помещает разрезанный материал в бункер yank. d d будет "вырезать" строку.
Ответ 6
Это все замечательные предложения, но если вы знаете расположение текста в другом файле, используйте sed с легкостью. :r! sed -n '1,10 p' < input_file.txt
Это добавит 10 строк в уже открытый файл в текущую позицию курсора.
Ответ 7
При редактировании файла создайте метки, в которых вы хотите, чтобы начало и конец использовались
ma
- устанавливает метку a
mb
- устанавливает знак b
Затем, чтобы скопировать это в другой файл, просто используйте команду w
:
:'a,'bw /name/of/output/file.txt
Ответ 8
Копирование текста между двумя буферами (== файлы), которые открываются в одном экземпляре VIM, не представляет проблемы: просто задержите в одном буфере с помощью y (предположим, что раньше вы отмечали область копирования в визуальном режиме), затем вставьте в другой буфер с помощью p. Также работает с разными вкладками, если они находятся в одном экземпляре VIM.
Как открыть два файла в одном экземпляре VIM, зависит от вашей системы:
- В Win32 есть опция в контекстном меню, в которой "Редактировать" с помощью одного vim, если вы выберете два или более файла
- Когда вы на консоли, вы можете достичь этого с помощью
vim file1 file2
- Если вы используете VIM в качестве редактора для другого инструмента, обязательно укажите параметр
--remote-silent
, чтобы все файлы открывались в одном экземпляре
Если вы открыли два файла в двух разных экземплярах VIM, вам нужно пойти с системным буфером обмена: в первом VIM вытащите текст в системный буфер обмена, используя "+y
(еще раз отметьте область, которая будет в начале визуального режима), затем перейдите ко второму VIM и вставьте туда буфер обмена: "+p
.
Ответ 9
В моем сценарии мне нужно было скопировать n число строк в середине, n неизвестно, из файла 1 в файл 2.
:'a,'bw /name/of/output/file.txt
Ответ 10
Эти переделки работают как прелесть для меня:
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 в буфер обмена.
Источник: http://vim.wikia.com/wiki/Copy_and_paste_between_sessions_using_a_temporary_file
Ответ 11
201705 обновление:
Я просто обнаружил, что если вы добавите следующую строку в свой файл vimrc,
установить буфер = неназванный
тогда VIM использует системный буфер обмена
Я только что нашел, что yank-путь не будет работать на том, как я копирую содержимое между различными окнами экземпляра VIM. (По крайней мере, это не работает на основе моих знаний VIM. Я не знаю, есть ли другой способ заставить его работать).
Явный способ работает только в том случае, когда в одном окне открывается несколько файлов в соответствии с моим тестом.
Если вы хотите сделать это, лучше использовать OS cut-copy-past, например ctrl + x, ctrl + c (под Windows).
Ответ 12
Не нашли здесь простого ответа, поэтому я отправляю свои сообщения.
Цель: сохранить часть одного файла в другой файл.
Решение
Ответ 13
Пример: fileA и fileB - начать в файлеA в строке 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
Ответ 14
Этот параметр работает больше всего времени, а также для вставки позже.
"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*'
будут скопированы после текущего курсора pos
Ответ 15
Другим способом может быть открытие двух файлов в двух разделенных буферах и использование следующего "фрагмента" после визуального выбора интересующих строк.
:vnoremap <F4> :y<CR><C-W>Wr<Esc>p
Ответ 16
- Убедитесь, что версия Vim скомпилирована с поддержкой буфера обмена
-
:echo has('clipboard')
должен возвращать 1
- если он возвращает
0
(например, OSX, по крайней мере, El Capitan, Mavericks и Mountain Lion - поставляется с версией Vim, без поддержки буфера обмена), вам нужно установить версию Vim с поддержкой буфера обмена, скажем, через brew install vim
( не забудьте перезагрузить терминал после установки).
- Введите визуальный режим (V - многострочный, V - обычный или Ctrl V - блок-визуальный)
- Выберите строки, которые вы хотите скопировать.
- " * y - для копирования выбранных
- " * p - вставить скопированные
P.S:
- вы можете заменить шаги 2-5 инструкциями ответа JayG, если вам нужно скопировать и вставить одну строку
- Чтобы облегчить выбор строк, вы можете добавить
set mouse+=a
к вашему .vimrc
- это позволит вам выбирать строки в vim с помощью мыши, не выбирая посторонние элементы (например, номера строк и т.д.) УВЕДОМЛЕНИЕ: это будет блокировать возможность копирования выбранного пользователем текста в системный буфер обмена из Vim
Ответ 17
Если вы хотите скопировать часть файла и вставить этот контент в середине другого файла, вы можете сделать это.
: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
Это поможет, если вы хотите скопировать и вставить несколько раз.