Me gustaría editar contenido en vim que se generó dinámicamente desde la línea de comandos sin tener el archivo todavía.
Por ejemplo:
$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin
pero está fallando con los errores:
Vim: Advertencia: la entrada no proviene de un terminal
Vim: Error al leer la entrada, saliendo ...
¿Es posible lograr eso?
command-line
invocation
unix
kenorb
fuente
fuente

:help stdin... Es sorprendente lo rápido que uno puede encontrar las respuestas haciendo su pregunta sobre la documentación incorporada.Respuestas:
Debe usar
-en lugar del nombre del archivo en la línea de comando:El comando anterior abrirá un búfer sin nombre lleno del texto leído desde la entrada estándar.
fuente
-for stdin es bastante estándar para las herramientas de línea de comandos;Esto es principalmente una nota divertida sobre
bashyreadline, pero si configura suEDITORvariable de entorno envim, presionar Ctrl+ x+ eabrirá la línea actualvim. Además, si escribe Meta(Alt/Opt/Esc)+ Ctrl+ e, bash realizará una expansión en el lugar en la línea de comando actual, es decir:con Meta(Alt/Opt/Esc)+ Ctrl+ ese convertiría
con Ctrl+ x+ ese convertiría
Tenga en cuenta que al salir de vim, el contenido del búfer vim se ejecuta en la línea de comando.
Estas características se vuelven muy útiles para mí cuando quiero hacer comandos de varias líneas en bash, como para bucles o programas que requieren declaraciones aquí, y proporciona una forma interesante de guardar un poco del historial de la línea de comandos para archivarlo para su uso posterior.
Entonces, para responder la pregunta original, también puedes escribir,
y luego presione Ctrl+ x+ epara cargarlo
vim. También podrías tener,y haga Meta(Alt/Opt/Esc)+ Ctrl+ eluego Ctrl+ x+ e, lo que colocaría todos los archivos hosts en una línea y lo cargaría
vim(probablemente no sea el mejor uso de estas características; sin embargo, la utilidad de estos métodos se puede extrapolar de los pocos ejemplos discutidos aquí).Tenga en cuenta que supongo que su
readlineestá configurado enemacsmodo. Sireadlineestá configurado envimmodo, puede descubrir fácilmente los enlaces relevantes mediante el comando:y buscando
edit-and-execute-commandoshell-expand-line, que se asociaron respectivamente con los enlaces Ctrl+ x+ ey Meta(Alt/Opt/Esc)+ Ctrl+ e.fuente
set -o vipara encenderlo. Luego puede usar lavasignación en modo normal para editar el comando actual en su editor.shell-expand-lineeliminar líneas nuevas del texto expandido e 2.edit-and-execute-commandintentar ejecutar el comando escrito en el búfer , se guarde o no, cuando salga de vi.En bash, me pareció útil usar la sustitución de procesos usando la
<(command)sintaxis, por ejemplo:Ver también:
fuente
bashyzsh(y nosh,ksh,dash,fish,csh,tcsh, etc.)/proc/PID/fd/FD. Si escribe el búfer y sale, Vim no se queja, pero el sistema operativo eliminará el archivo en el que ha escrito. Al usar-como nombre de archivo, el búfer abierto no tiene ningún archivo asociado, por lo que si intenta salir sin guardar (Vim, le avisará), siempre y cuando no use un comando de explosión o similar.vimdiff <(echo foo) <(echo bar).:nexty:prevvuelve a leer la transmisión y no obtiene nada. También vale la pena mencionar que los procesos no son paralelos entre sí, por ejemplo, secat <(sleep 3; echo a) <(echo b)imprime en orden, y mientras lascatintercalaciones escriben y leen,vimesperan en el archivo para "terminar de leer" antes de mostrar todo menos el marco exterior.Si el uso de una canalización a un nuevo Vim no es un requisito, puede usar la capacidad de Vim para extraer la salida de comandos en el búfer actual, junto con tener un búfer sin respaldo de archivo (como
:neweditar un archivo inexistente):read!cat /etc/hostsen modo comando colocará la salida en su búfer actual debajo de la posición actual del cursor.Además de tener que eliminar la primera línea vacía que queda cuando esto se hace en un búfer vacío, esto funciona bien y es especialmente conveniente si Vim ya se está ejecutando.
fuente