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
bash
yreadline
, pero si configura suEDITOR
variable 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
readline
está configurado enemacs
modo. Sireadline
está configurado envim
modo, puede descubrir fácilmente los enlaces relevantes mediante el comando:y buscando
edit-and-execute-command
oshell-expand-line
, que se asociaron respectivamente con los enlaces Ctrl+ x+ ey Meta(Alt/Opt/Esc)+ Ctrl+ e.fuente
set -o vi
para encenderlo. Luego puede usar lav
asignación en modo normal para editar el comando actual en su editor.shell-expand-line
eliminar líneas nuevas del texto expandido e 2.edit-and-execute-command
intentar 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
bash
yzsh
(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)
.:next
y:prev
vuelve 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 lascat
intercalaciones escriben y leen,vim
esperan 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
:new
editar un archivo inexistente):read!cat /etc/hosts
en 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