Copia todas las líneas al portapapeles

565

¿Hay alguna forma de copiar todas las líneas del archivo abierto al portapapeles en el editor de VI? Lo intenté yGpero no está usando el portapapeles para almacenar esas líneas.

Entonces, ¿es posible?

Xinus
fuente
1
Si estás en Windows y tirar no funciona, mira la respuesta número 17 desde arriba: stackoverflow.com/questions/1620018/…
Noumenon

Respuestas:

636

Debe tirar el texto a los registros* o :+

gg"*yG

Explicación:

  • gg para llevar el cursor al primer caracter del archivo
  • "*ypara iniciar un comando de extracción al registro *desde la primera línea, hasta ...
  • G ir al final del archivo
CMS
fuente
66
¿Cómo se marca el texto para que se vea como teclas? Todavía no lo he visto en SO.
jergason
10
Hola ... no funciona? Los datos del portapapeles permanecen inalterados. cuando escribo el cursor gg va a la primera línea ... pero cuando escribo "* yG .. la CPU emite un pitido en * ... ¿es normal o hay algún problema con mi vim? Estoy en Ubuntu ..
Xinus
1
¿Tienes Deadkeys habilitado? (por ejemplo, cuando presionas 'a obtienes á) Si es así, debes presionar la barra espaciadora después ".
Tordek el
144
Vim solo puede acceder al portapapeles del sistema si está compilado con xterm_clipboard habilitado. Para saber si tiene esta característica, ejecute :versionen vim y busque la +xterm_clipboardbandera. Si está precedido por un signo menos, entonces no tendrá esta funcionalidad. Si este es el caso, es posible que desee compilar vim usted mismo o ejecutar gvim, que generalmente tiene esta característica habilitada.
nelstrom
99
El problema con este enfoque es que mueve el cursor y desplaza la ventana. Dos veces. La otra respuesta tiene muchas menos pulsaciones de teclas e inconvenientes :)
sehe
696

Utilizar:

:%y+

para tirar de todas las líneas.

Explicación:

  • % para referir el siguiente comando para trabajar en todas las líneas
  • y para tirar de esas líneas
  • + copiar al portapapeles del sistema

NB : en Windows, +y *son equivalentes ver esta respuesta .

Torre
fuente
19
Además, no cambiará la ubicación del cursor.
nperson325681
1
@ guangnan: estos registros no existen en vi; solo en vim. Intenta escribir :helppara asegurarte de que estás realmente en vim.
Compilador conspicuo
66
Necesitaba hacerlo set clipboard=unnamed, ¡pero esto funcionó muy bien!
cdunn2001
235
Vim dice E850: Invalid register name:(
lony
23
Esta solución solo funciona si vim se compiló con la opción del portapapeles (vim --version mostrará + portapapeles en ese caso). Si no fuera así, la solución de Brian (:% w! Pbcopy) es una solución para Mac. Hay alternativas disponibles para otros sistemas operativos (por ejemplo, xclip).
yaccob
90

en Mac

  • copiar parte seleccionada: seleccionar visualmente el texto (escribir vo Ven modo normal) y escribir:w !pbcopy

  • copia todo el archivo :%w !pbcopy

  • pasado del portapapeles :r !pbpaste

Brian
fuente
66
Funciona sin problemas. Una explicación de los comandos sería realmente agradable.
Vlad Manuel Mureșan
55
@Geo pbcopyes una utilidad para Mac. En Linux, xselpodría funcionar en su lugar, o clipen Windows.
David Lord
1
Esto no funcionará si el archivo es más largo que la altura de su terminal.
Sridhar Sarnobat
1
@SridharSarnobat :%w !pbcopyaún funciona si el archivo es más largo que la altura del terminal.
Adrian Schmidt
Oh, lo siento, quise decir sobre ssh donde el cliente es una Mac y el servidor es Linux (que supuse era lo que estaba buscando el OP, pero ahora que lo pienso, ese es un problema no relacionado). En mi defensa, evitaría vim por copiar y pegar archivos locales, pero ese es mi gusto personal. Buenos consejos.
Sridhar Sarnobat
56

El portapapeles es buffer +. Para copiar al portapapeles, haz "+yy [movimiento].

Entonces, gg"+yGcopiará todo el archivo.

Del mismo modo, para pegar desde el portapapeles, "+p

Tordek
fuente
44
Solo para agregar a esto (4 años después ...), esto tiene un pequeño inconveniente en que la posición del cursor saltará a la parte superior del archivo. Para evitar esto (por ejemplo, si está asignando esto a algún acceso directo en su vimrc), puede hacer algo como: mqgg "+ yG`q
Tom Lord
46

Otra forma fácil de copiar todo el archivo si tiene problemas para usar VI, es simplemente escribiendo "cat filename". Hará eco del archivo en la pantalla y luego puede desplazarse hacia arriba y hacia abajo y copiar / pegar.

Zack
fuente
1
E603:: atrapar sin: intentar
Paul Chris Jones
2
Y si quieres hacer eso sin salir de vim, puede ejecutar el siguiente comando: :!cat %. Y para copiar el contenido del archivo mediante programación al portapapeles en Mac OS::!cat % | pbcopy
TanguyP
Necesario para copiar el archivo de Ubuntu VM en Windows a Debian en GCP abierto en la ventana del navegador ...: / Las variaciones de vim yanking no funcionaron, esto funcionó para pegar en Windows y luego cargar el archivo en GCP.
Frmbelz
31

Esto es lo que hago para tirar todo el archivo:

ggVGy
EmilianoGNFNR
fuente
12
Me temo que esto no responde a la pregunta, ya que está tirando al registro predeterminado, no al portapapeles.
Compilador conspicuo el
2
Sin embargo, @ConspicuousCompiler lo haría si tuviera el clipboardconjunto para copiar el texto arrancado +.
TankorSmash
@TankorSmash no es el método más rápido (:% y) ni el más limpio (al menos ggyG es mejor).
pedroapero
@ConspicuousCompiler ¿cuál es la diferencia entre el registro predeterminado y el portapapeles ?
nilon
17

Puede usar el comando "cat" para abrir el archivo y usar el mouse para copiar

Pham Luan
fuente
55
Pero esa no será la forma "vi", si el archivo es enorme, entonces también será un problema ... Esto podría funcionar, pero no una forma sugerida ...
Aditya
1
resetel terminal de antemano, luego seleccione todo y copie. Esto funciona a través de la sshsesión.
arcol
La forma más rápida para archivos grandes (menos de 10 mil líneas) en diferentes servidores remotos si xterm_clipboard no está disponible
Matias Haeussler
10

(en respuesta a @rshdev, y para evitar tener que volver a compilar vim con + xterm_clipboard por @nelstrom en los comentarios sobre OP)

hay un programa llamado xclip que funciona como putclip en Ubuntu 11:

:%!xclip -sel clip
u

No está instalado por defecto. para instalar, use:

sudo apt-get install xclip
Estofado
fuente
10

En Ubuntu 12

puede intentar instalar el vim-gnomepaquete:

sudo apt-get install vim-gnome

Lo probé porque vim --versionme dijo que tendría la bandera xterm_clipboard desactivada (indicada por - ), que es necesario para usar la funcionalidad del portapapeles.

-> la instalación del paquete vim-gnome en Ubuntu 12 también instaló una versión basada en consola de vim, que tiene esta opción habilitada (indicada por un + antes del indicador xterm_clipboard)

En Arch Linux

Puedes instalarlo vim-clipboardpor el mismo motivo.

Si ejecuta neovim, entonces debe instalar xclip(como se explica en help clipboard-tool)

Arch Linux Tux
fuente
1
unix.stackexchange.com/questions/25965/… ¿hay alguna otra opción que alguien conozca?
Sandip Pingle
6

Si está utilizando Vim en modo visual, también se aplican las teclas estándar de cortar y pegar, al menos con Windows.

  • CTRLA significa "Marcar todo el archivo.
  • CTRLC significa "Copiar la selección.
  • ESC significa "Deseleccionar, para que la próxima vez que presione la tecla no reemplace todo el archivo :-)

Al menos en la terminal de Ubuntu (Gnome), la copia estándar también funciona ( CTRLSHIFTCaunque no parece haber un método abreviado de teclado estándar para select all(aparte del ALTEseguido por A).

paxdiablo
fuente
66
Pero si no está usando mswin.vim, entonces ctrl-a incrementa el siguiente número en la línea actual.
Mark Rushakoff,
@ Mark, este comportamiento es de una instalación estándar de Vim, así que supongo que ese es el valor predeterminado. Todas las apuestas están desactivadas si el entorno está configurado de manera diferente, aunque si ese fuera el caso, sospecho que el OP sabría lo que están haciendo :-) En cualquier caso, OP declaró en un comentario que estaban en Ubuntu, por lo que Windows forma parte de mi respuesta probablemente no se aplica. Las cosas del terminal Gnome lo harían.
paxdiablo
5

puedes presionar gg para ubicar tu cursor al inicio del archivo, luego presionar yG para copiar todo el contenido de principio a fin (G ubicado) al búfer. ¡Buena suerte!

gameboy90
fuente
4

Probé algunos de los comandos que la gente ha mencionado anteriormente. Ninguno funcionó. Entonces conseguí el más simple de todos.

Paso 1: vi <filename>
Paso 2: haga clic con el botón derecho en la barra de título de la ventana Putty.
Paso 3: seleccione "Borrar el desplazamiento hacia atrás" (para evitar copiar el resto de su sesión SSH).
Paso 4: haga clic derecho nuevamente y seleccione "Copiar todo al portapapeles".

Abhinav Deshpande
fuente
1
Para el archivo de 15000 líneas, esto no lo agarró todo. Necesitaba aumentar mi Masilla Window > Settings > lines of scrollbacka 40000 (también disponible haciendo clic derecho en la barra de título). También ayuda usar en catlugar de vi, ya que se desplaza por todo el texto.
Noumenon
1
Terminé siempre perdiendo líneas desde la parte superior e inferior del archivo de esta manera. Lo que hago ahora es cat, luego hago clic con el botón central al inicio y al final del archivo para ampliar la selección.
Noumenon
Cuando intenté esto, solo obtuve las 111 líneas en la pantalla, pero hay 174 líneas en mi archivo, por lo que la respuesta del gato de
Noumenon
3

:%y aTira todo el contenido al búfer de vim, al presionar pen modo comando pegará el contenido arrancado después de la línea en la que se encuentra actualmente el cursor.

Ma'moon
fuente
3

gVim:

:set go=a

ggVG

Ver :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
fuente
3

Bueno, todos estos enfoques son interesantes, sin embargo, como programador perezoso, utilizo tirar de todas las líneas mediante la combinación de número + y

por ejemplo, tiene un archivo de código fuente con un total de 78 líneas, puede hacer lo siguiente:

  1. gg para obtener el cursor en la primera línea
  2. inserte 78 + y -> tira 78 líneas debajo de su cursor y la línea actual
arfo
fuente
2

No había un concepto de "portapapeles" en el vi de Bill Joy, así que no creo que haya una forma integrada de hacerlo.

La función de copia automática de todo lo resaltado en el portapapeles de gVim es más fácil o utiliza un programa externo a través de:!

Para vim de Cygwin uso

:%!putclip
u

¿Quizás Ubuntu tiene una aplicación CLI como putclip?

rshdev
fuente
gran sugerencia, gracias! existe un programa llamado xclip. para más detalles, publiqué una respuesta por separado (habría sido demasiado confuso leer un comentario, sin las nuevas líneas adicionales y el formato del código).
Stew
2

Si sus dedos están predeterminados en CTRL-A CTRL-C, intente las asignaciones desde $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

Los tengo asignados a <Leader><C-a>y <Leader><C-c>.

go2null
fuente
2

Copie todo el archivo dentro del vim o sus pestañas

y G 

luego pasar a una pestaña y pegar

p

y para cortar todo el archivo use

d G
Abdul Basit
fuente
2

He agregado la siguiente línea a mi .vimrc

nnoremap <F5> :%y+<CR>

Esto me permite copiar todo el texto en Vim al portapapeles presionando F5(en modo comando).

aks
fuente
1

Aquí hay un comando de mapa para seleccionar todo al portapapeles usando CTRL+ a:

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

Añádelo a tu .vimrc y listo ...

jahroy
fuente
1

Sé que diez años en esto deberían resolverse, pero las dos primeras respuestas no funcionaron para mí, así que seguí investigando. En un Redhat (servidor remoto) - Windows 10 (máquina local), si no puede seleccionar todo con un mouse, está atascado porque las copias habituales no funcionan entre el portapapeles de la máquina remota y local.

Entonces, para copiar en el Linux remoto y pegar en el Windows local, especifique el búfer primario con el * y haga un buen doble tirón

Uso gg" * yy.

Zurdo G Balogh
fuente
0

He creado una función para realizar esta acción, colóquela en su ~/.vimrc.

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

OBS: Si está utilizando neovim, también necesita un administrador de portapapeles como xclip. para más información escriba en neovim:h checkhealth

También es importante mencionar que no siempre un simple ycopiará en el portapapeles, con el fin de hacer que cada copia de alimentación +cual es "portapapeles Registro" tratar de establecer: :set clipboard=unnamed,unnamedplus. Para más información ver::h unnamed .

Aquí más información sobre vim wikia.

SergioAraujo
fuente
0

Puedes usar un shortcur, como este:

noremap <F6> :%y+<CR>

Significa que cuando presiona F6 en modo normal, copiará todo el archivo y lo agregará al portapapeles. O simplemente puede escribir en modo normal :%y+y luego presionar Enter.

Nicolas Pardo
fuente
-1

Haga clic con el botón izquierdo del mouse, arrastre por la sección que desea copiar y suelte. El código se copia automáticamente en el portapapeles.

Kapeel Kokane
fuente
3
El archivo podría ser enorme, y arrastrar todo el texto con el mouse no es productivo (ni vimucho menos).
Dr Beco
1
En realidad, esta es una buena respuesta y funciona para mí. En mi sistema, el entorno es muy restrictivo. Tengo que capturar la salida en la pantalla, y luego usar el mouse para arrastrar, seleccionar y soltar ... luego copio a Windows Notepad ++ ... y funciona muy bien. Nada más funciona.
Apurva Singh
-1

No pude copiar archivos usando las respuestas anteriores, pero tengo masilla y encontré una solución en Quora.

  1. Cambie la configuración de su sesión PuTTY, vaya al registro y cámbiela a "caracteres imprimibles". Establecer el archivo de registro
  2. Hacer un gato del archivo respectivo
  3. Vaya al archivo que configuró en el paso 1 y tendrá su contenido en el archivo de registro.

Nota: copia todos los caracteres impresos de esa sesión en el archivo de registro, por lo que eventualmente se hará grande. En ese caso, elimine el archivo de registro y seleccione el archivo de destino para que se copie el contenido de ese archivo en particular en su máquina.

thewhitetulip
fuente