Quiero ejecutar el siguiente shell.
wea-this is the end of the second word | vim j
exit 0
Lo que esperaba que canalizara las pulsaciones de teclas w
(avanzar una palabra) luego e
(final de la palabra) luego a
(agregar) luego -this is the end of the second word
(texto) al documento Vim nombrado j
que ya tiene palabras.
El siguiente error ocurrió cuando ejecuté el script de shell.
/root/bin/tt.sh: line 1: wea-this: command not found
Vim: Warning: Input is not from a terminal
Estoy ejecutando Ubuntu 14.04. Se apreciarán dos tipos de respuestas:
- Cómo usar tuberías para lograr este resultado deseado.
- Otro método por el cual puedo usar "comandos Vim" (no comandos ed o sed) para editar un documento de texto desde un script de shell.
invocation
Jason Basanese
fuente
fuente
|
personaje canaliza la salida de un comando a otro.wea-this
No es un comando. La tubería tampoco se puede utilizar para lograr lo que está buscando hacer; hará que el stdin de Vim sea la aplicación de la mano izquierda, no el teclado. Si usted desea conseguir la entrada estándar en un búfer en vim, comenzar con un signo menos para el nombre del archivo:echo Hello, world! | vim -
.Respuestas:
Para insertar la cadena
"hello"
en la primera línea del archivoj
, puede escribir en su shell el siguiente comando:vim +"1 | put! ='hello'" j
:1
mueve el cursor a la primera línea del búfer:put! ='hello'
pega la cadena "hola" sobre la línea actualPara insertar la cadena
"hello"
y luego guardar y salir del archivo:vim +"1 | put! ='hello' | x" j
Lo mismo que antes, acabamos de agregar el comando Ex
:x
que guarda y cierra.De manera más general, puede ejecutar cualquier secuencia de comandos Ex en un archivo, desde un shell interactivo o desde un script bash, como este:
vim +'Ex command1 | Ex command2 | ...' file
Si tiene muchos comandos Ex, puede escribirlos todos dentro de un archivo dedicado (llamado, por ejemplo
myExCommands.vim
), un comando por línea y luego desde el shell o un script puede obtenerlo (con el comando Ex:source
o la versión corta:so
) Me gusta esto:Editar
Veo que has editado tu pregunta.
Creo que la respuesta anterior aún se aplica, porque puedes ejecutar cualquier comando normal desde el modo Ex con los comandos Ex
:normal
y:execute
.Por ejemplo, digamos que quieres:
1G
)_
)w
)e
)a
)hello
:x
)Para hacer esto en el archivo
j
, escriba desde el shell:Para más información, ver:
fuente
:normal
y:execute
hago lo que quieres?Aquí hay una forma en que puede usar comandos en modo normal, en lugar de solo comandos ex, para editar una secuencia presentada a Vim desde stdin. Este no es un ejemplo muy útil, pero ilustra las técnicas involucradas. Se supone que su caparazón es bash.
Al
-
final le dice a Vim que lea el texto (no los comandos) de stdin. El-s
le dice a Vim que ejecute las pulsaciones del archivo especificado. En este caso, el archivo es el resultado de una sustitución de proceso bash. El<(...)
se reemplaza por el nombre de una tubería con nombre. La salida de la tubería es la salida del comando entre paréntesis. Elwcwred\e
mueve el cursor una palabra y cambia la siguiente palabra ared
. El:wq! foo\n
guarda el resultado en el archivofoo
incluso si ese archivo ya existe. El resultado final es un archivo llamado quefoo
contiene el textoThe red fox jumped.
Para obtener más información sobre algunos de esos temas, consulte
Consulte también la
Process Substitution
sección de labash(1)
página del manual.fuente
vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }
. Ahora lo que puedavimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat foo
. ¡Ordenado!He encontrado que el método de tomar la salida de un programa como redirigido desde sub-shell es muy fácil:
Ejemplo:
fuente
Tenía exactamente el mismo deseo que tú: quería escribir comandos vim normales y hacer que editaran un flujo de canalización. Me decepcionó la dificultad de usar vim normal de esta manera (¡tantas banderas!), Como lo proporcionan las opciones de vim predeterminadas.
Por lo tanto, escribí un pequeño contenedor en vim para hacerlo: https://github.com/MilesCranmer/vim-stream/ . Se llama
vims
.El corazón del contenedor es el siguiente comando:
Usando esto, con la generación de comandos que hago, resulta ser bastante conciso, y debido a que vim es un editor modal, hice
vims
un editor de flujo modal. Hay tres modos principales que son útiles para la mentalidad de edición de canalización:Ver este:
Entonces,
e
va al final deHello
, luegoa
comienza a agregarAlgo más elegante, en modo exe, para comentar líneas que contienen
my_bad_var
y eliminar la línea anterior.Lo que se traduce en
vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'
: elI
ser el comando para comenzar a insertar al comienzo de la línea y//
la secuencia de comentarios.\<esc>kdd
presiona la tecla de escape, sube una línea y luego la borra.Tengo 11 ejemplos totales en el repositorio, te animo a que los revises. Una vez más, esto se ejecuta sobre vim, es solo una forma de hacer que vim se parezca más a sed para la entrada de flujo (¡pero preservando todas sus queridas macros vim!)
fuente
Esta es una pregunta bastante antigua, pero sentí que valía la pena contribuir a que si su distribución / SO dada tiene acceso
moreutils
, entonces puede instalarla y simplemente usarlavipe
como una adición estándar avim
:moreutils
¡también es muy útil para sus otras herramientas, y las recomiendo si eres un usuario serio de la línea de comandos! :) Eche un vistazo a la introducción del autor (enlace anterior) para obtener más detalles.moreutils
debería estar generalmente disponible para la mayoría de las distribuciones * nix-like a través de un administrador de paquetes y a través de Homebrew en Mac . Por ejemplo...moreutils
también es parte del repositorio de paquetes MSYS2 , por lo que técnicamente también puede usarlo en Windows. :)fuente