Copie e cole o conteúdo de um arquivo para outro no vi


256

Estou trabalhando com dois arquivos e preciso copiar algumas linhas de um arquivo e colar em outro arquivo. Eu sei como copiar (aa) e colar (p) no mesmo arquivo. Mas isso não funciona para arquivos diferentes. Como isso é feito?

Além disso, existe uma maneira de colar e colar? Eu tentei pesquisar no Google, mas a maioria dos recursos fala apenas de copiar e colar.


Tem certeza de que isso não funciona? Eu uso isso com bastante frequência para copiar linhas entre arquivos.
Sjngm

Bem, quando estou fazendo isso, recebo apenas aspas?
macha

4
O comando dd funciona como cut.
Martin Stålberg 15/09

Respostas:


218

Como você já sabe como recortar / arrancar o texto, aqui estão algumas idéias para colá-lo novamente em outro arquivo:

  • Edite o primeiro arquivo, puxando o texto que você deseja. Em seguida, abra seu segundo arquivo no vi ( :e /path/to/other/file) e cole-o
  • Abra os dois arquivos juntos em uma janela dividida e navegue entre eles usando Ctrl+ w, Up/ Downou:

    • vi -o /path/to/file1 /path/to/file2
    • De dentro do primeiro arquivo, Ctrl+ w,s

Eu tenho duas janelas de massa abertas, estou fazendo "v para o modo visual primeiro e, em seguida, selecione todas as linhas e faça um" y "para puxar, não estou fazendo uma tecla alt + para acessar o outro arquivo e quando o fizer um "p" para colocar, só imprime uma aspa.
macha

10
Se você estiver trabalhando com 2 janelas putty, precisará usar a maneira putty / windows de copiar / colar. Isso é fácil. Marque as coisas que deseja copiar com o mouse (você não precisa fazer mais nada, o texto marcado agora é copiado para a área de transferência.) Alterne para a outra janela da massa. Entre no modo de inserção no vim (pressione i). Aperte o botão direito do mouse - o mouse direito em uma janela de massa irá colar o que estiver na área de transferência.
nºs

3
O que você está fazendo não funcionará: puxar o vi não colocará o texto na área de transferência do Windows, e o buffer de arranque não será compartilhado entre instâncias abertas do vim.
Adam Batkin

1
Eu não entendo o que o último ponto é suposto fazer: * A partir do primeiro arquivo, Ctrl+ w, s.
svassr

1
para mim, dividiu a janela, mas abriu exatamente o mesmo arquivo. Como você escolhe qual arquivo abrir então? Eu vi o comando :sp myfiledividir horizontalmente e abrir o arquivo especificado, mas como eu faria se preferisse dividir a janela verticalmente?
svassr

50

Se você estiver usando o Vim no Windows, poderá obter acesso à área de transferência (MS copy / paste) usando:

"*dd - cortar uma linha (ou 3dd para cortar três linhas)

"*yy - copiar uma linha (ou 3 anos para copiar três linhas)

"*p - colar linha (s) na linha após o cursor

"*P - colar linha (s) na linha antes do cursor

Permite colar entre janelas separadas do Vim ou entre aplicativos Vim e PC ( bloco de notas , Microsoft Word etc.).


17
Use +como registro da área de transferência do sistema de plataforma cruzada (Windows e Linux) vs. *, que é apenas o Windows ( +funciona da mesma forma no Windows *).
Stephen Swensen

42

Use as variações de dcomodd de cortar.

Para escrever um intervalo de linhas em outro arquivo, você pode usar:

:<n>,<m> w filename

Onde <n>e<m> são números (ou símbolos) que designam um intervalo de linhas.

Para usar a área de transferência da área de trabalho, dê uma olhada nos +gcomandos.


Para fazer isso com marcas, crie duas marcas (aeb, por exemplo) ao redor do texto que você deseja gravar em um arquivo: vá para a primeira linha ma, vá para a última linha mb,. Em seguida, acrescente 'a à letra da marca quando estiver usando o comando acima::'a,'b w filename
EchoLynx 28/04

ótima solução para gamas de linhas largas!
Yasin Okumuş

29

Você pode abrir o outro arquivo e tipo :r file_to_be_copied_from. Ou você pode armazenar em buffer. Ou vá para o primeiro arquivo, vá para a linha que deseja copiar, digite "qY, vá para o arquivo que deseja colar e digitar "qP.

"buffer_name, copia para o buffer. Yé puxar e Pé colocado. Espero que ajude!


Obrigado! Isso me ajudou muito
Atsushi Yamamoto

28

Aqui está uma maneira de fazer isso;

  • Inicie o Vim e abra o arquivo1, que é o arquivo no qual você está trabalhando.
  • :e file2, que exibirá file2, o arquivo do qual você deseja copiar as linhas.
  • localize as linhas que deseja copiar. Se são três linhas, você pressiona3yy
  • :b1 isso mudará para o buffer 1, onde file1 é
  • descobrir onde você deseja inserir as linhas que você puxou e pressionar p

Você também pode ter os dois arquivos visíveis. Divida a tela com, por exemplo, Ctrl+w s .

Quanto ao corte, dcorta e coloca o material cortado no buffer de arranco. ddirá "cortar" uma linha.


2
off-topic: como faço para obter essas coisas de botão de teclado?
Eckes


E os dois arquivos estão em dois servidores ssh diferentes, nos quais o mesmo cliente se hospeda em dois terminais diferentes no Linux / MacOS? Quero dizer, nenhuma massa para usar, e os dois arquivos não podem ser abertos na mesma sessão vi em um terminal.
Qiang Xu

1
Se o cliente puder conectar-se a dois servidores, também poderá usar scp ou sftp nesses dois servidores. Portanto, a maneira mais rápida é copiar o arquivo de um servidor para outro, para que eles residam no mesmo servidor, edite esses arquivos conforme descrito e copie o arquivo de volta para o outro servidor quando necessário, se necessário.
nºs

16

Todas essas são ótimas sugestões, mas se você souber a localização do texto em outro arquivo, use sed com facilidade. :r! sed -n '1,10 p' < input_file.txtIsso inserirá 10 linhas em um arquivo já aberto na posição atual do cursor.


estranhamente, recebi um código de saída 1 ao executar isso infelizmente no os x, não sei por que.
precisa saber é o seguinte

1
Obrigado por esta sugestão! Eu costumava cabeça em vez de sed porque eu queria que as 2 primeiras linhas::r ! head -n2 file.py
Federico Ponzi

7

Ao editar o arquivo, marque onde deseja que o início e o fim estejam usando

ma- define a amarca

mb - define o bmarca

Em seguida, para copiar isso em outro arquivo, basta usar o wcomando:

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

7

Atualização 2017-05:

Acabei de descobrir que, se você adicionar a seguinte linha ao seu arquivo vimrc,

definir área de transferência = sem nome

então o Vim está usando a área de transferência do sistema.


Acabei de descobrir que o arranco não funcionará no caminho em que copio o conteúdo entre diferentes janelas da instância do Vim. (Pelo menos, não funciona com base no meu conhecimento do Vim. Não sei se existe outra maneira de habilitá-lo para funcionar).

A maneira de arrancar funciona apenas na maneira em que vários arquivos são abertos na mesma janela, de acordo com o meu teste.

Se você quiser fazer isso, é melhor usar a maneira de copiar e colar o SO, como Ctrl+ x, Ctrl+ c(no Windows).


5

Esses remaps funcionam como um encanto para mim:

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

Então, quando estou no modo visual, seleciono as linhas que quero e pressiono Ctrl+ ce depois Ctrl+v para inserir o texto no arquivo receptor. Você também pode usar "* y, mas às vezes é difícil lembrar disso.

Isso também é útil para copiar texto do Vim para a área de transferência.

Origem: Copie e cole entre as sessões usando um arquivo temporário


4

Copiar texto entre dois buffers (== arquivos) abertos na mesma instância do Vim não é problema:

Simplesmente puxe um buffer com y(supondo que você tenha marcado uma área para copiar no modo visual antes) e cole no outro buffer comp . Também funciona com guias diferentes, desde que estejam na mesma instância do Vim.

Como abrir dois arquivos na mesma instância do Vim depende do seu sistema:

  • No Win32, há uma opção no menu de contexto que diz Editar com um vim se você selecionar dois ou mais arquivos
  • Quando você está no console, é possível alcançá-lo com vim file1 file2
  • Se você usar o Vim como editor para outra ferramenta, especifique a --remote-silentopção para garantir que todos os arquivos sejam abertos na mesma instância

Se você abriu os dois arquivos em duas instâncias diferentes do Vim, precisará ir com a área de transferência do sistema: na primeira instância do Vim, puxe o texto para a área de transferência do sistema usando "+y(novamente, marque a área a ser puxada no modo visual antes ), então vá para o segundo Vim e colar a área de transferência aí: "+p.


: nome do arquivo tabedit pode ser usado para abrir o arquivo de destino e, em seguida, basta p para colar suas linhas. Eu acho que é mais rápido.
jabalv

4

Objetivo : salvar uma parte de um arquivo em outro arquivo.

Solução :

  1. Selecione o texto que você deseja salvar:
    • Posicione o cursor onde deseja iniciar a seleção
    • Pressione vpara selecionar caracteres OU maiúsculas Vpara selecionar linhas inteiras
    • Mova o cursor para o final do que você deseja selecionar
  2. Salve o texto selecionado no novo arquivo. Digite :wSpacee o nome do novo arquivo. Na verdade você verá

    :'<,'>w new.txt

    Então aperte Enter


Como colar de volta do arquivo temp.?
Vineet

3

Meu cenário era que eu precisava copiar n número de linhas no meio, n desconhecido, do arquivo 1 para o arquivo 2.

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

2
  1. Verifique se a versão do Vim foi compilada com o suporte da área de transferência
    • :echo has('clipboard') deve retornar 1
    • se retornar 0(por exemplo, Mac OS X, pelo menos v10.11 (El Capitan), v10.9 (Mavericks) e v10.8 (Mountain Lion) - vem com uma versão do Vim sem suporte para a área de transferência), é necessário instalar um Versão Vim com suporte à área de transferência, digamos via brew install vim(não se esqueça de reiniciar o (s) seu (s) terminal (ais) após a instalação)
  2. Entre no modo visual ( V- multilinha, v- comum ouCtrlv - visual de bloco)
  3. Selecione as linhas que você deseja copiar
  4. "*y - para copiar selecionado
  5. "*p - para colar copiado

PS:

  • você pode substituir as etapas 2 a 5 pelas instruções da resposta de JayG , se precisar copiar e colar uma única linha
  • para facilitar a seleção de linhas, você pode adicionar set mouse+=aao seu .vimrc- ele permitirá que você selecione linhas no Vim usando o mouse, sem selecionar elementos estranhos (como números de linhas, etc.) AVISO: ele bloqueará a capacidade de copiar o texto selecionado pelo mouse para a área de transferência do sistema do Vim .

1

Exemplo: arquivoA e arquivoB - inicie no arquivoA na linha 25, copie 50 linhas e cole no arquivoB

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

A opção abaixo funciona na maioria das vezes e também para colar posteriormente.

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

As linhas arrancadas serão armazenadas no buffer 'x' . Pode ser usado em qualquer lugar da edição.

Para colar linhas no outro arquivo,

:e filename&location

Exemplo: Digite o comando abaixo na edição atual

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

Operação completa

abrir arquivo 1:

vi Test1.sh

a10yy

-Yanked 10 lines

Agora, abra o segundo arquivo da edição atual

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

- mova o cursor para a linha em que você deve colar

*"ap*

- As linhas do buffer '*a*'serão copiadas após a posição atual do cursor


1

Se você deseja copiar uma parte de um arquivo e colar esse conteúdo no meio de outro arquivo, é possível fazer isso.

:linenumber,linenumber write newfile

Exemplo:

:2,34 write temp1

Ou

:'mark, 'mark write newfile

Exemplo:

:'a,'b write temp1

Agora as linhas são copiadas para outro arquivo. Se você deseja excluir essas linhas após a cópia, pode fazer

:linenumber1,linenumber2 d

Ou

:'mark1,'mark2 d

Agora, vá para outro arquivo. Em seguida, mantenha o cursor na linha em que você deseja colar.

Tipo

:r!cat temp1

Agora, o conteúdo do arquivo temporário é colado aqui. Você pode excluir o arquivo temporário da própria linha de comando, após colar o conteúdo.

:!rm temp1

Isso ajudaria se você quisesse copiar e colar várias vezes.


0

Outra maneira poderia ser abrir os dois arquivos em dois buffers divididos e usar o seguinte "snippet" após a seleção visual das linhas de interesse.

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

0

Entre no modo de comando e execute

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

Por exemplo, para extrair linhas 20-30do filenamearquivo aberto no momento

:r! sed -n '20, 30p' filename
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.