Copie todas as linhas para a área de transferência


564

Existe alguma maneira de copiar todas as linhas do arquivo aberto para a área de transferência no editor VI. Eu tentei, yGmas não está usando a área de transferência para armazenar essas linhas.

Então é possível?



1
Se você estiver no Windows e o arranque não funcionar, consulte a 17ª resposta do topo: stackoverflow.com/questions/1620018/…
Noumenon

Respostas:


636

Você deve puxar o texto para o *ou + registra :

gg"*yG

Explicação:

  • gg para colocar o cursor no primeiro caractere do arquivo
  • "*ypara iniciar um comando de arranque no registro *da primeira linha, até ...
  • G para ir no final do arquivo

6
Como você marca o texto para que pareça chaves? Ainda não vi isso no SO.
jergason

10
Olá ... os dados da área de transferência não estão funcionando? quando eu digito o cursor gg vai para a primeira linha ... mas quando eu digito "* yG ..cpu emite um sinal sonoro em * ..so é normal ou algum problema com o meu vim? Estou no Ubuntu ..
Xinus

1
Você tem Deadkeys ativado? (por exemplo, quando você pressiona 'a', obtém á). Nesse caso, é necessário pressionar espaço depois ".
Tordek 25/10/09

144
O Vim só pode acessar a área de transferência do sistema se for compilada com o xterm_clipboard ativado. Para descobrir se você possui esse recurso, execute o :versionvim e procure a +xterm_clipboardbandeira. Se for precedido por um sinal de menos, você não terá essa funcionalidade. Se for esse o caso, convém compilar o vim por conta própria ou executar o gvim, que geralmente tem esse recurso ativado.
Nelstrom 26/10/2009

9
O problema com essa abordagem é que ela move o cursor e rola a janela. Duas vezes. A outra resposta tem muito menos batidas de tecla e inconvenientes :)
sehe

696

Usar:

:%y+

arrancar todas as linhas.

Explicação:

  • % para consultar o próximo comando para trabalhar em todas as linhas
  • y arrancar essas linhas
  • + copiar para a área de transferência do sistema

NB : No Windows, +e *são equivalentes, veja esta resposta .


19
Além disso, ele não altera a localização do cursor.
precisa

1
@ guangnan: Esses registros não existem no vi; somente no vim. Tente digitar :helppara garantir que você esteja realmente no vim.
Compilador conspícuo

6
Eu precisava set clipboard=unnamed, mas isso funcionou muito bem!
cdunn2001

235
Vim diz E850: Invalid register name:(
lony

23
Esta solução só funciona se o vim foi compilado com a opção da área de transferência (vim --version mostrará + área de transferência nesse caso). Caso contrário, a solução de Brian (:% w! Pbcopy) é uma solução para Mac. Alternativas estão disponíveis para outros sistemas operacionais (por exemplo, xclip).
yaccob

90

no Mac

  • copiar parte selecionada: selecione visualmente o texto (digite vou Vno modo normal) e digite:w !pbcopy

  • copie o arquivo inteiro :%w !pbcopy

  • passado da área de transferência :r !pbpaste


6
Funciona sem problemas. Uma explicação dos comandos seria muito legal.
Vlad Manuel Mureșan 30/03

5
@Geo pbcopyé um utilitário para Mac. No Linux, xselpode funcionar ou clipno Windows.
David Lord

1
Isso não funcionará se o arquivo for maior que a altura do seu terminal.
Sridhar Sarnobat

1
O @SridharSarnobat :%w !pbcopyainda funcionará se o arquivo for maior que a altura do terminal.
Adrian Schmidt

Ah, desculpe, eu quis dizer sobre ssh, onde o cliente é um Mac e o servidor é Linux (que eu assumi ser o que o OP estava procurando, mas agora que penso nisso, isso é um problema não relacionado). Em minha defesa, eu evitaria o vim por copiar e colar arquivos locais, mas esse é o meu gosto pessoal. Boas dicas.
Sridhar Sarnobat 01/12/19

56

A área de transferência é buffer +. Para copiar para a área de transferência, faça "+ye [movimento].

Então, gg"+yGirá copiar o arquivo inteiro.

Da mesma forma, para colar da área de transferência, "+p


4
Só para adicionar isso (4 anos depois ...), isso tem uma ligeira desvantagem, pois a posição do cursor vai para o topo do arquivo. Para evitar isso (por exemplo, se você estiver mapeando isso para algum atalho no vimrc), você pode fazer algo como: mqgg "+ yG`q
Tom Lord

45

Outra maneira fácil de copiar o arquivo inteiro, se você estiver tendo problemas com o VI, é apenas digitando "cat filename". Ele fará o eco do arquivo para a tela e você poderá simplesmente rolar para cima e para baixo e copiar / colar.


1
E603:: catch sem: try
Paul Chris Jones

2
E se você quiser fazer isso sem sair vim, você pode executar o seguinte comando: :!cat %. E para copiar o conteúdo do arquivo programaticamente para a área de transferência no Mac OS::!cat % | pbcopy
TanguyP

Necessário copiar o arquivo da VM do Ubuntu no Windows para o Debian no GCP aberto na janela do navegador ...: / Variações do vim yanking não funcionavam, isso funcionava para colar no Windows e depois carregar o arquivo no GCP.
frmbelz 7/01

31

Isto é o que eu faço para puxar o arquivo inteiro:

ggVGy

12
Receio que isso não responda à pergunta, pois você está acessando o registro padrão, não a área de transferência.
Compilador conspícuo

2
@ConspicuousCompiler seria se ele tivesse o clipboardconjunto para copiar o texto arrancado +.
precisa saber é o seguinte

O @TankorSmash não é o método mais rápido (:% y) nem o mais puro (pelo menos ggyG é melhor).
pedroapero 28/09

@ConspicuousCompiler qual é a diferença entre o registro padrão e a área de transferência ?
Nilon 19/09/19

16

Você pode usar o comando "cat" para abrir o arquivo e usar o mouse para copiar


5
Mas isso não vai ser o "vi" modo, se o arquivo é grande, então, também será um problema ... Este trabalho poder, mas não de maneira sugeriu ...
Aditya

1
resetantes do terminal, selecione tudo e copie. Isso funciona através da sshsessão.
ARCOL

Maneira mais rápida de arquivos grandes (com menos de 10 mil linhas) em diferentes servidores remotos se xterm_clipboard está indisponível
Matias Haeussler

10

(em resposta a @rshdev e para evitar ter que recompilar o vim com + xterm_clipboard por @nelstrom nos comentários sobre o OP)

existe um programa chamado xclip que funciona como putclip no Ubuntu 11:

:%!xclip -sel clip
u

não está instalado por padrão. para instalar, use:

sudo apt-get install xclip

10

No Ubuntu 12

você pode tentar instalar o vim-gnomepacote:

sudo apt-get install vim-gnome

Eu tentei, porque vim --versionme disse que teria o sinalizador xterm_clipboard desativado (indicado por - ), necessário para usar a funcionalidade da área de transferência.

-> instalar o pacote vim-gnome no Ubuntu 12 também instalou uma versão do vim baseada em console, que tem essa opção ativada (indicada por um + antes do sinalizador xterm_clipboard)

No Arch Linux

você pode instalar vim-clipboardpelo mesmo motivo.

Se você executar o neovim, deverá instalar xclip(conforme explicado em help clipboard-tool)


1
unix.stackexchange.com/questions/25965/… existe alguma outra opção que alguém conheça?
Sandip Pingle

6

Se você estiver usando o Vim no modo visual, as teclas padrão de recortar e colar também se aplicam, pelo menos no Windows.

  • CTRLA significa "Marque o arquivo inteiro.
  • CTRLC significa "Copie a seleção.
  • ESC significa "Desmarque, para que sua próxima pressão de tecla não substitua o arquivo inteiro :-)

No terminal Ubuntu (Gnome), pelo menos, a cópia padrão também funciona ( CTRLSHIFTCembora não pareça haver um atalho de teclado padrão para select all(exceto o ALTEseguido por A).


6
Mas se você não estiver usando o mswin.vim, pressione Ctrl-a para aumentar o próximo número na linha atual.
Mark Rushakoff 25/10/2009

@ Mark, esse comportamento é de uma instalação padrão do Vim, por isso suponho que esse seja o padrão. Todas as apostas estão desativadas se o ambiente estiver configurado de maneira diferente, mas, se esse fosse o caso, suspeito que o OP saberia o que está fazendo :-) Em qualquer um dos casos, o OP declarou em um comentário que estava no Ubuntu, de modo que o Windows faz parte do Windows. minha resposta provavelmente não se aplica. O material terminal do Gnome seria.
22410

5

você pode pressionar gg para localizar seu cursor no início do arquivo e, em seguida, pressionar yG para copiar todo o conteúdo do início ao fim (G localizado) para buffer.good luck!


4

Eu tentei alguns dos comandos que as pessoas mencionaram acima. Nenhum funcionou. Então peguei o mais simples de todos.

Etapa 1: vi <filename>
Etapa 2: Clique com o botão direito do mouse na barra de título da janela Putty
Etapa 3: Selecione "Limpar rolagem" (para evitar copiar o restante da sua sessão SSH)
Etapa 4: Clique com o botão direito novamente e selecione "Copiar tudo para a área de transferência".


1
Para o arquivo de linha 15000, isso não foi fácil. Eu precisava aumentar meu Putty's Window > Settings > lines of scrollbackpara 40000 (também disponível clicando com o botão direito do mouse na barra de título). Também ajuda a usar em catvez do vi, uma vez que percorre todo o texto.
Noumenon 14/10

1
Acabei sempre perdendo linhas da parte superior e inferior do arquivo dessa maneira. O que faço agora é cat, e clique com o botão direito do mouse no início e no final do arquivo para estender a seleção.
Noumenon

Quando eu tentei isso eu só tenho as 111 linhas na tela, mas existem 174 linhas no meu arquivo, assim resposta gato de Noumenon funcionou para mim
seizethecarp

3

:%y aColoca todo o conteúdo no buffer do vim. Pressionar pno modo de comando colará o conteúdo puxado após a linha em que o cursor está atualmente.


3

gVim:

:set go=a

ggVG

Veja :help go-a:

'a' Autoselect:  If present, then whenever VISUAL mode is started,
 or the Visual area extended, Vim tries to become the owner of
 the windowing system's global selection.  This means that the
 Visually highlighted text is available for pasting into other
 applications as well as into Vim itself.  When the Visual mode
 ends, possibly due to an operation on the text, or when an
 application wants to paste the selection, the highlighted text
 is automatically yanked into the "* selection register.
 Thus the selection is still available for pasting into other
 applications after the VISUAL mode has ended.
     If not present, then Vim won't become the owner of the
 windowing system's global selection unless explicitly told to
 by a yank or delete operation for the "* register.
 The same applies to the modeless selection.

3

Bem, todas essas abordagens são interessantes, no entanto, como programador preguiçoso eu uso o yank all line usando a combinação do número + y

por exemplo, você possui um arquivo de código-fonte com um total de 78 linhas, pode fazer o seguinte:

  1. gg para obter o cursor na primeira linha
  2. insira 78 + y -> puxa 78 linhas abaixo do cursor e da linha atual

2

Não havia um conceito de "área de transferência" no vi de Bill Joy, então não acho que exista uma maneira integrada de fazê-lo.

O recurso copiar automaticamente qualquer coisa destacada na área de transferência do gVim é mais fácil ou use um programa externo via:!

Para o vim de Cygwin, eu uso

:%!putclip
u

Talvez o Ubuntu tenha um aplicativo CLI como o putclip?


ótima sugestão, obrigado! existe um programa chamado xclip. para obter detalhes, publiquei uma resposta separada (seria confuso ler de um comentário, sem as novas linhas e a formatação de código).
Stew

2

Se seus dedos estiverem no padrão CTRL-A CTRL-C, tente os mapeamentos de $VIMRUNTIME/mswin.vim.

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y

" CTRL-A is Select all
noremap <C-A> gggH<C-O>G
inoremap <C-A> <C-O>gg<C-O>gH<C-O>G
cnoremap <C-A> <C-C>gggH<C-O>G
onoremap <C-A> <C-C>gggH<C-O>G
snoremap <C-A> <C-C>gggH<C-O>G
xnoremap <C-A> <C-C>ggVG

Eu os tenho mapeados para <Leader><C-a>e <Leader><C-c>.


2

Copie o arquivo inteiro dentro do vim ou de suas guias

y G 

depois vá para uma guia e cole

p

e para cortar o arquivo inteiro, use

d G

2

Eu adicionei a seguinte linha ao meu .vimrc

nnoremap <F5> :%y+<CR>

Isso permite copiar todo o texto do Vim para a área de transferência pressionando F5(no modo de comando).


1

Aqui está um comando de mapa para selecionar tudo na área de transferência usando CTRL+ a:

"
" select all with control-a
"
nnoremap <C-a> ggmqvG"+y'q

Adicione-o ao seu .vimrc e você poderá continuar ...


1

Sei que dez anos deveriam ser resolvidos, mas as duas primeiras respostas não funcionaram para mim, então continuei cavando. Em um Redhat (servidor remoto) - Windows 10 (máquina local), se você não puder selecionar a coisa toda com um mouse, ficará preso porque as cópias habituais não funcionam entre as áreas de transferência da máquina remota e local.

Portanto, para copiar no Linux remoto e colar no Windows local, especifique o buffer primário com o *comando ye faça um belo puxão duplo

Use gg" * yy.


0

Eu criei uma função para executar esta ação, coloque-a no seu ~/.vimrc.

fun! CopyBufferToClipboard()
    %y+
endfun
nnoremap <Leader>y :call CopyBufferToClipboard()<CR>
command! -nargs=0 CopyFile :call CopyBufferToClipboard()

OBS: Se você estiver usando o neovim, também precisará de um gerenciador de área de transferência como o xclip. para mais informações, digite neovim:h checkhealth

Também é importante mencionar que nem sempre um simples yvai copiar para a área de transferência, a fim de tornar cada alimentação cópia +wich é "Clipboard Register" tentar set: :set clipboard=unnamed,unnamedplus. Para mor informações, consulte: :h unnamed.

Aqui mais informações sobre o vim wikia.


0

Você pode usar um atalho, como este:

noremap <F6> :%y+<CR>

Isso significa que, quando você pressiona F6 no modo normal, ele copia o arquivo inteiro e o adiciona à área de transferência. Ou você pode digitar no modo normal :%y+e pressionar Enter.


-1

Clique no botão esquerdo do mouse, arraste pela seção que deseja copiar e liberar. O código é automaticamente copiado para a área de transferência.


3
O arquivo pode ser enorme e arrastar o texto inteiro com o mouse não é produtivo (nem de vijeito nenhum ).
Dr Beco

1
Na verdade, esta é uma boa resposta e funciona para mim. No meu sistema, o ambiente é v restritivo. Eu tenho que ver a saída na tela e, em seguida, usar o mouse para arrastar, selecionar e liberar .. então eu copio para o Windows Notepad ++ .. e funciona muito bem. Nada mais funciona.
Apurva Singh

-1

Não consegui copiar arquivos usando as respostas acima, mas tenho uma massa e encontrei uma solução alternativa no Quora.

  1. Altere as configurações da sua sessão PuTTY, acesse o registro e altere para "caracteres imprimíveis". Defina o arquivo de log
  2. Faça um gato do respectivo arquivo
  3. Vá para o arquivo que você definiu na etapa 1 e você terá seu conteúdo no arquivo de log.

Nota: copia todos os caracteres impressos dessa sessão para o arquivo de log, tornando-se maior eventualmente. Nesse caso, exclua o arquivo de log e escolha o arquivo de destino para que o conteúdo desse arquivo específico seja copiado em sua máquina.

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.