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 jque 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-thisNo 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:1mueve 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" jLo mismo que antes, acabamos de agregar el comando Ex
:xque 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 | ...' fileSi 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:sourceo 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
:normaly: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
:normaly:executehago 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-sle 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\emueve el cursor una palabra y cambia la siguiente palabra ared. El:wq! foo\nguarda el resultado en el archivofooincluso si ese archivo ya existe. El resultado final es un archivo llamado quefoocontiene el textoThe red fox jumped.Para obtener más información sobre algunos de esos temas, consulte
Consulte también la
Process Substitutionsecció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
vimsun editor de flujo modal. Hay tres modos principales que son útiles para la mentalidad de edición de canalización:Ver este:
Entonces,
eva al final deHello, luegoacomienza a agregarAlgo más elegante, en modo exe, para comentar líneas que contienen
my_bad_vary eliminar la línea anterior.Lo que se traduce en
vims '%g/my_bad_var/exe "norm I//\<esc>kdd"': elIser el comando para comenzar a insertar al comienzo de la línea y//la secuencia de comentarios.\<esc>kddpresiona 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 usarlavipecomo 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.moreutilsdeberí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...moreutilstambién es parte del repositorio de paquetes MSYS2 , por lo que técnicamente también puede usarlo en Windows. :)fuente