Cómo canalizar el texto seleccionado visualmente a un comando UNIX y agregar la salida al búfer actual en Vim
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.
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.