¿Hay alguna forma de copiar un bloque de texto en el portapapeles del sistema, para poder pegarlo en otro programa?
cpip
, cpi{
.
¿Hay alguna forma de copiar un bloque de texto en el portapapeles del sistema, para poder pegarlo en otro programa?
cpip
, cpi{
.
Respuestas:
Para los sistemas basados en X11 (es decir, Linux y la mayoría de los sistemas similares a UNIX ) hay dos portapapeles que son independientes entre sí:
^C
y se pega con ^V
(es como MS Windows).Los sistemas OS X y Windows solo tienen un portapapeles.
Para los sistemas X11 también hay varias herramientas que sincronizan estos portapapeles por usted; así que si parecen ser iguales, puede tener uno de ellos ejecutándose.
Vim tiene dos registros especiales correspondientes a estos portapapeles:
*
utiliza PRIMARIO; mnemónico: S tar es S elect (para copy-on- s elect)+
usa el CLIPBOARD; mnemónico: CTRL PLUS C (para la combinación de teclas común)En Windows y OS X no hay diferencia entre +
y *
, ya que estos sistemas solo tienen un portapapeles único, y ambos registros se refieren a lo mismo (no importa cuál use).
Puede usar estos registros como cualquier registro. Por ejemplo, usando el portapapeles PRIMARIO *
con los comandos y
y p
:
"*yy
"*p
Tal vez podría usar esto como combinaciones de teclas más convenientes:
noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p
Si desea interactuar "automáticamente" con el portapapeles del sistema en lugar de consultarlo manualmente todo el tiempo, puede configurar la clipboard
variable:
unnamed
para usar *
(PRIMARIO, en seleccionar)unnamedplus
para usar +
(CLIPBOARD, ^C
)Ahora, solo usando yy
irá al portapapeles del sistema, en lugar del registro sin nombre de Vim, y p
pegará el portapapeles del sistema.
También puede asignar a estos registros como cualquier registro con let
:
:let @+=42
:let @*=42
La clipboard
configuración tiene algunas opciones más (como excluir filtros); Pero estos son los conceptos básicos. Ver :help 'clipboard'
para la historia completa ;-)
Si usa gVim, puede obtener un comportamiento de copiar al seleccionar cuando lo usa
:set guioptions+=a
.
Esto está habilitado por defecto en los sistemas X11 (copias a PRIMARY), pero no en MS Windows y OSX (ya que seleccionar cualquier texto anularía su portapapeles).
+clipboard
?Vim requiere el +clipboard
indicador de función para que todo esto funcione; se puede comprobar si su Vim tiene esto mediante el uso :echo has('clipboard')
de dentro de Vim (si la salida es 0
, es que no está presente, si es 1
, lo es), o control de la salida de
vim --version
para +clipboard
.
La mayoría de las distribuciones de Linux se entregan con una compilación Vim "mínima" por defecto, que no tiene +clipboard
, pero generalmente puede instalarla:
vim-gtk
o vim-gnome
.vim-X11
y ejecutar en vimx
lugar de vim
( más información ).gvim
(esto habilitará también +clipboard
para normal vim
).También puede usar xclip
, xcopy
o xsel
copiar texto en el portapapeles; vea las siguientes preguntas para soluciones:
También puede usar un portapapeles en máquinas remotas si habilita el reenvío X11 a través de SSH. Esto es especialmente útil con el consejo anterior, ya que puede usarlo
xclip
para acceder al portapapeles de su escritorio. El Vim en la máquina a la que le estás enviando todavía necesitará la +clipboard
función.
Esto requiere la ForwardX11Trusted
configuración, y solo debe hacerse con servidores confiables , ya que esto le da al servidor un control casi completo sobre su sesión X11:
$ ssh -XY myhost
Para que esta configuración sea persistente (para que no necesite agregarla -XY
cada vez), puede hacer algo como esto en su ~/.ssh/config
:
# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
ForwardX11 yes
ForwardX11Trusted yes
Neovim renovó el soporte del portapapeles. La interfaz incorporada fue removido y reemplazado con un sistema que llamar una utilidad externa tal como xclip
, xsel
, o
pbcopy
/ pbpaste
.
Debería recoger automáticamente estas utilidades y usarlas. En OS X pbcopy
y pbpaste
debería estar disponible de forma predeterminada, en Linux probablemente desee instalar xclip
, ya que es el más ampliamente disponible (en realidad, hay dos
versiones xsel
con indicadores incompatibles . Esto es realmente estúpido).
Ver también :help clipboard
en Neovim.
"<Space>
para obtener un "
. Entonces, en ese caso, tendría que presionar "<Space>+y
o "<Space>*y
copiar.
"
puedo seleccionar muchos registros con nombre. "+
No es magia, es solo registrarse +
. Así por ejemplo, si desea copiar tres cosas al mismo tiempo y pegar cada uno de ellos uno por uno, se puede "1y
, "2y
y "3y
y más tarde "1p
, "2p
y "3p
. Esto es realmente poderoso e inexistente en casi cualquier otro editor. Otro uso interesante es mirar las macros almacenadas. Por ejemplo, si graba con qq
, pero se da cuenta de que necesita arreglarlo, puede: en una línea temporal "qp
, arreglarlo y "qd
.
Las otras respuestas cubren cómo copiar texto de su búfer en el portapapeles del sistema. Otra operación común es copiar texto de otro registro al portapapeles. Por ejemplo, si ya ha introducido algo de texto en "
(el registro predeterminado), es posible que desee cargar ese registro en el portapapeles.
Puedes hacer esto con :let
:
let @+=@"
- copia el registro predeterminado en el portapapeleslet @*=@"
- copia el registro predeterminado en la selección primaria X11 ("portapapeles del mouse")let @+=@a
- copiar desde el registro a
al portapapelesTenga en cuenta que esto funciona para los registros en general: las let @a=@b
copias se registran b
para registrarse a
.
Desde http://vim.wikia.com/wiki/Accessing_the_system_clipboard
set clipboard=unnamedplus
Esto cambia el registro Vim predeterminado al +
registro, que está vinculado al portapapeles del sistema. De :h clipboard-unnamedplus
:
clipboard-unnamedplus
unnamedplus A variant of the "unnamed" flag which uses the
clipboard register '+' (quoteplus) instead of
register '*' for all yank, delete, change and put
operations which would normally go to the unnamed
register. When "unnamed" is also included to the
option, yank operations (but not delete, change or
put) will additionally copy the text into register
'*'.
Only available with the +X11 feature.
Availability can be checked with:
if has('unnamedplus')
:version
dentro de Vim para ver si + X11 aparece en la lista de características incluidas. También puede verificar si la función 'unnamedplus' está disponible con :if has('unnamedplus')⏎ echo 'yes'⏎ endif
Si no está en Linux, entonces debería usar unnamed en lugar de unnamedplus.
En las compilaciones que lo admiten, el registro nombrado *
es el portapapeles del sistema. Para copiar texto de Vim al portapapeles del sistema, puede seleccionar el texto usando el modo visual y luego presionar "*ypara copiarlo al portapapeles del sistema.
Por el contrario, use "*ppara pegar texto del portapapeles del sistema en Vim.
Le recomiendo que use Gvim y agregue esto a su .vimrc
:
source $VIMRUNTIME/mswin.vim
behave mswin
Esto habilita el soporte para CtrlC, CtrlX, CtrlVcomo el bloc de notas de Windows.
Tenga en cuenta que esto también agregará algunos otros accesos directos comunes de Windows, como CtrlSfor :w
, CtrlAfor select all, etc.
Cualquier otra respuesta ha cubierto todas las cosas importantes sobre los registros. Me gustaría agregar una cosa más que uso.
Hay una forma en Vim de copiar directamente el texto seleccionado visualmente en el portapapeles. Simplemente ponga esto en su archivo vimrc :
set guioptions+=a
Y, con esto, cada vez que seleccione visualmente algún texto, se copiará en su portapapeles. Para más información sobre esto,:help guioptions
Por cierto, esto es solo para gVim.
guioptions+=a
También se menciona en la respuesta de Carpetsmoker.
También puede usar un comando global para colocar algún patrón específico en el portapapeles. Puede ser útil en situaciones en las que tiene información dispersa en un archivo y la copia manual es propensa a errores y cansancio.
Primero limpie el registro que recibirá la información
:let @a=""
Luego copie todas las líneas que contienen el patrón
:g/pattern/yank A
Finalmente transferir (copiar) la información al portapapeles del sistema
:let @+=@a
si intenta copiar cada línea que contiene un "patrón" directamente en el portapapeles, no funcionará porque el portapapeles no tiene la capacidad de agregar contenido nuevo, por lo tanto, estamos utilizando aquí un registro vim normal para almacenar todas las líneas que contienen el patrón a la vez y luego ponerlo en el portapapeles.
OBS: es necesario clonar el registro antes de usarlo, y el uso de la versión MAYÚSCULAS del registro nos permite agregar contenido, de lo contrario tampoco funcionará.
Si no puede encontrar la manera de llegar +clipboard
al trabajo, lo cual no pude por alguna razón, puede hacerlo.
Suponiendo que solo desea copiar una sección del archivo, hago shift
+ v
para ir al modo visual y solo resaltar las líneas que quiero copiar. Entonces hago esto.
# Linux Wayland
:'<,'>w !wl-copy
# Linux Xorg
:'<,'>w !xclip -selection clipboard
Explicación
'<,'>
- significa que usaste el modo visual para seleccionar un rango (no escribes esto)w !{cmd}
- escriba el rango al stdin de cmd
, vea más en:help w_c
wl-copy
y xclip
son programas a los que puedes canalizar texto y lo agregarán al portapapeles de tu sistemaAdemás, una vez que esté en su historial, no tiene que volver a escribir todo. Simplemente seleccione con el modo visual, escriba y w
luego presione hacia arriba y el comando debería completarse automáticamente. Además, tampoco tiene que usar el modo visual. Puede establecer el rango que desee.