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?

Xinus
fonte
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
CMS
fonte
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 .

Torre
fonte
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

Brian
fonte
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

Tordek
fonte
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.

Zack
fonte
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
EmilianoGNFNR
fonte
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

Pham Luan
fonte
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
Ensopado
fonte
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)

Arch Linux Tux
fonte
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).

paxdiablo
fonte
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!

gameboy90
fonte
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".

Abhinav Deshpande
fonte
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.

Ma'moon
fonte
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.
kev
fonte
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
arfo
fonte
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?

rshdev
fonte
ó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>.

go2null
fonte
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
Abdul Basit
fonte
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).

aks
fonte
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 ...

jahroy
fonte
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.

Lefty G Balogh
fonte
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.

SergioAraujo
fonte
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.

Nicolas Pardo
fonte
-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.

Kapeel Kokane
fonte
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.

thewhitetulip
fonte