Insertar la salida de un comando del sistema en la ubicación actual en vim

33

En vim, cuando uso

:r !ls somefilename

inserta la salida de ese comando en una nueva línea debajo de la línea actual.

Si lo hago

let @a = system("ls")

y después

"ap

todavía inserta la salida en una nueva línea debajo de la línea actual.

¿Hay alguna manera de hacer que vim insert output en la ubicación actual?

deshmukh
fuente
Consulte esta útil respuesta Ejecutar la línea actual en bash desde vim
Rohan Ghige

Respuestas:

14

Puede pegar el contenido del búfer del portapapeles entre caracteres con Ctrl-R * en modo de inserción (y un enfoque similar para otros búferes). Entonces, si puede obtener el comando del sistema en un búfer, debería estar configurado. (Fuente: https://stackoverflow.com/questions/1491135/paste-multi-line-string-into-gvim-at-cursor-position ).

:let @a=system("ls -l")pondrá la salida de ls -len registro a. Luego puede pegarlo (en modo de inserción) con ^R-a.

Steve Kroon
fuente
Además, en la mayoría de las plataformas, el portapapeles se sincroniza con un registro (por lo general *), por lo que si canaliza la salida de comandos al portapapeles, estará listo "*para su uso.
Bruno Bronosky
39
:r !command 

leerá el resultado del comando y lo insertará en la línea debajo de la línea actual. Así es como se programa vi, no puede cambiar el comportamiento.

Pero diga si está en la línea número 3. Si lo intenta :r !date. Insertará el valor de la fecha en la línea número 4.

Si desea que aparezca el valor de la fecha en la línea número 3, intente :2r !dateinsertar el valor de la fecha en la línea número 3.

devav2
fuente
44
Eso se inserta en una línea diferente, pero aún en una línea propia. ¡Quiero insertarlo en la ubicación actual!
deshmukh
13

Aquí hay una forma alternativa de pegar la salida del comando externo antes del cursor:

:exe 'norm i' . system("ls -l")

o use la expresión register ( :help @=):

"=system('ls -la')

luego golpear P. O camino más corto por:

<CTRL-R>=system('ls -la')<CR>
kenorb
fuente
44
Esta es la respuesta.
Jacob
1
¡Convenido! Esta realmente debería ser la respuesta correcta, ya que incluye una solución más programática (con :exe) que se puede incluir en los comandos.
metasoarous