Cómo canalizar el texto seleccionado visualmente a un comando UNIX y agregar la salida al búfer actual en Vim

StackOverflow https://stackoverflow.com/questions/230266

  •  04-07-2019
  •  | 
  •  

Pregunta

Utilizando Vim, estoy tratando de canalizar el texto seleccionado en modo visual a un comando UNIX y agregar la salida al final del archivo actual. Por ejemplo, supongamos que tenemos un comando SQL como:

SELECT * FROM mytable;

Quiero hacer algo como lo siguiente:

<ESC>
V                 " select text
:'<,'>!mysql -uuser -ppass mydb

Pero en lugar de que la salida sobrescriba el texto seleccionado actualmente, me gustaría agregar la salida al final del archivo. Probablemente veas a dónde va esto. Estoy trabajando en usar Vim como un simple editor de SQL. De esa manera, no tengo que dejar Vim para editar, ajustar, probar el código SQL.

¿Fue útil?

Solución

¿Qué hay de copiar el texto seleccionado al final del archivo, seleccionar la copia y ejecutar el comando? Si no desea repetir los mismos comandos una y otra vez, puede grabar la secuencia utilizando q o agregar un nuevo comando. He intentado este último de la siguiente manera:

:com -range C <line1>,<line2>yank | $ | put | .,$ !rev

Con él puede seleccionar algunas líneas y luego escribir : C . Esto primero eliminará la selección, luego irá al final del archivo, pegará el texto extraído y ejecutará el comando ( rev en este caso) sobre el nuevo texto.

Otros consejos

Si prefiere un enfoque más programático, puede tener

:call append(line("
func! GetSelectedText()
  normal gv"xy
  let result = getreg("x")
  normal gv
  return result
endfunc
quot;), system("command", GetSelectedText()))

donde GetSelectedText es la función reutilizable:

<*>

Probar

:r | YourCommand

Por ejemplo:

:r ! echo foo

agrega foo a su búfer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top