¿Hay un objeto de texto para todo el búfer?


28

A menudo me encuentro escribiendo comandos como gg"+yGo ggdGy me gustaría una forma más eficiente de hacerlo sin tener que mover el cursor dos veces. ¿Hay algún comando que pueda usar, por ejemplo, y[movement]para copiar todo el búfer sin mover el cursor?

Respuestas:


36

Dado que vim usa el signo de porcentaje para hacer referencia al búfer actual, puede usarlo para obtener todo rápidamente.

:%ytirará de todo el búfer al :%y+depósito +(y presumiblemente al portapapeles, siempre que vim haya sido compilado con las opciones adecuadas).

:%dy :%d+hará lo mismo para la eliminación.

En cada uno de estos casos, el cursor permanece en su lugar.


Wow, todo este tiempo estaba usando mmgg"+yG`my nunca pensé en esto. Gracias, esto va bien en el .vimrc.
Pomo de la puerta

@Doorknob en lugar de establecer y usar marcas que podría usar C-odos veces para regresar.
Ruslan

10

Otra solución es usar un complemento llamado vim-textobj-Entire . Por defecto, este complemento proporciona el objeto de texto aepara todo el búfer, iepara todo el búfer, excepto las líneas vacías iniciales y finales.

Este complemento depende de vim-textobj-user del mismo autor, lo que permite a los usuarios definir cualquier objeto de texto cómodamente. Hay muchos complementos que hacen un buen uso de esto.


8

No hay ningún objeto de texto para todo el archivo de forma predeterminada, pero es posible crearlos usando omap. En este caso, se vería así:

onoremap f :<c-u>normal! mzggVG<cr>`z

Aquí hay un desglose de cómo funciona:

onoremap f " make 'f' the text object name
:<c-u> " use <c-u> to prevent vim from inserting visual selection marker at the beginning of the command automatically.
normal! " use normal to make key presses ignoring any user mappings
mzggVG<cr>`z " make a marker in register z, select the entire file in visual line mode and enter the normal command, and go back to the z marker

Notas:

Ctrluse puede usar en el modo de línea de comando para eliminar todo a la izquierda de la posición del cursor. La razón por la que se hace esto es porque si ingresa la línea de comando directamente desde el modo visual, se insertará automáticamente '<,'>en la línea de comando, y eso no es lo que queremos. También te sugiero que uses algo diferente f, porque fnormalmente se usa para pasar al siguiente personaje buscado en la línea. Por ejemplo, fiirá al siguiente ien la línea actual.

Temas de ayuda relevantes:

:help omap-info
:help :normal
:help c_CTRL-U
:help v_:

¿Hay alguna manera de hacer esto dejando el cursor solo?
Random832

@ Random832 Agregar un ``al final devolverá el cursor a la ubicación anterior.
SnoringFrog

Me preocupa que esto haga que no se aplique la selección al comando yank. Experimentaré algo hoy.
Random832

1
Agregué un comando marcador al mapeo, debería dejar el cursor donde está ahora.
EvergreenTree

2

Aquí hay algunas asignaciones rápidas y sucias para realizar la tarea:

nnoremap yY :%yank <c-r>=v:register<cr><cr>
nnoremap dD :%delete <c-r>=v:register<cr><cr>

Ahora puede usar yYy dDpara tirar / eliminar respectivamente. No es tan bueno como usar un objeto de texto completo, pero a veces las soluciones más simples son las mejores.

Para más ayuda ver:

:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.