A veces he intentado invocar a Vim usando xargs, así:
find . -name '*.java' | xargs vim
... qué tipo de obras:
Cuando se inicia Vim, veo brevemente la siguiente advertencia:
Vim: Warning: Input is not from a terminal- La edición funciona:
:filesenumera correctamente todos los.javaarchivos como se esperaba. - Puedo ahorrar y dejar de fumar.
Sin embargo, después de salir de Vim, mi terminal se borked:
- Lo que escriba en el indicador de comandos de la shell no tiene eco.
- Los retornos de carro no aparecen en absoluto, y los avances de línea solo aparecen a veces.
Esto continúa hasta que emito un reset(1)comando para reiniciar la terminal.
¿Es esto un error de Vim, o hay una explicación más satisfactoria de por qué interactúa así con el terminal? Lo he visto suceder en Vim hasta la versión 7.3 (la versión no parece importar) en Linux y varios Unices.
Soy consciente de una solución alternativa, a saber vim $(find . -name '*.java'). Serían bienvenidas otras soluciones, aunque esa no es mi pregunta principal.
terminal
invocation
unix
quit
200_success
fuente
fuente

xargsusa un muñecostdinque Vim no puede usar y se rompe todo despuésRespuestas:
Esto sucede cuando se invoca vim y se conecta a la salida de la canalización anterior, en lugar del terminal y recibe una entrada inesperada diferente (como NUL). Lo mismo sucede cuando ejecuta:
vim < /dev/nullpor lo que elresetcomando en este caso ayuda. Esto se explica bien por la gravedad en el superusuario .Si está utilizando
findpara pasar nombres de archivos para editar, no necesitaxargs, solo use-exec, por ejemplo:Si desea usar
xargs, en Unix / macOS debe usar-oparámetros, como:o:
Nota: El uso de
-print0/-0admitirá nombres de archivo con espacios en blanco.find+ BSDxargsEn Unix / macOS puede probar la siguiente solución:
También puede usar la sintaxis de sustitución de comandos, por ejemplo:
Alternativamente, use GNU en
parallellugar dexargsforzar la asignación de tty, por ejemplo:Nota:
parallelen Unix / OSX no funcionará ya que tiene diferentes parámetros y no es compatible con tty.Muchos otros comandos populares también proporcionan asignación de pseudo-tty (como
-tenssh), así que busca ayuda.Otra sugerencia sería usar:
exeditor de línea de comandos para analizar los datos o usar el modo Ex, para más detalles ver:¿Cómo editar archivos de forma no interactiva (p. Ej. En canalización)?
vipe(una tubería de comando Vim)use el siguiente script simple:
Relacionado:
grep -l .. | xargs vimgenera una advertencia, ¿por qué? [dup] en unix SEfuente
xargsno tiene-J. Esa parece ser una opción de MacOS (BSD) que no está presente en la versión de GNU.Sugerencia de solución alternativa: use un búfer como navegador del sistema de archivos
Use el
vim -comando para leer una lista de rutas desde stdin. Vim:help --explica esto: 1Luego puede usar gfo Ctrl-wCtrl-fpara navegar al archivo en el mismo búfer o en una nueva ventana dividida respectivamente.
Sugerencia de solución alternativa: lista de argumentos
Otra gran manera es usar la lista de argumentos de Vim. El
:argadd **/*.javacomando rellenará la lista de argumentos de Vim con todos los archivos java encontrados dentro del directorio actual de forma recursiva. Luego puede usar:nexty:prevpara moverse entre los archivos.1 El primero
-le dice a Vim que desea buscar en la ayuda una opción de línea de comando, el segundo es en realidad el indicador de línea de comando que está buscando. Lea:help help-contextpara más trucos como este.fuente
Además
reset, puedes probar:lo que también debería hacer que su terminal sea utilizable nuevamente.
Ver aquí para explicaciones. Y de alguna manera esto puede considerarse un mal comportamiento vim, al menos Neovim no tiene este problema en este momento.
fuente
resetque también debería hacerlo.La razón es que se
xargsestablecestdinen/dev/null, mientras quevimnecesitastdinser/dev/tty.xargsSolución BSD (por ejemplo, Mac):-oestablece elstdinproceso hijo de xarg (vimen este caso) endev/tty.xargsSolución GNU (por ejemplo, Linux):GNU
xargsno tiene la-oopción. En su lugar, deberá utilizar una solución alternativa más complicada. (Nota: es muy importante tener lazerocadena final , no lo olvide).También puedes convertirlo en un alias:
Explicación detallada de la solución GNU xargs
Desglosemos paso a paso:
1.
xargssimplemente agrega elstdinal final de la cadena, porxargslo que se ejecutará esto:2. El formato para
bash -cesbash -c 'COMMAND_STRING' $0 $1 $2 etc."$@"se expande a los parámetros posicionales"$1", "$2", etc. No incluye "$ 0" porque es un parámetro especial para el nombre del script, no un parámetro posicional. Es por eso que necesitamos agregar la cadena ficticiazero(puede ser cualquier cadena) para tomar el lugar$0. De lo contrario, perderá el primer archivo.Entonces, después de expandirse
"$@", terminas con:3.
bash -cejecutará el COMMAND_STRING:</dev/ttyconfigura elstdina/dev/ttypara quevimpueda funcionar en modo interactivo.fuente
$0marcador de posición (aquí "cero") es la clave.He encontrado que faltan todas estas respuestas. Después de luchar por el problema de xargs, la forma más simple, para mí, de hacer estas búsquedas y aperturas en un cuadro genérico es la siguiente:
No tengo problemas para usar
findconxargsygrep, pero la sintaxis me resulta molesta. Y como un programador diario que usavimy el terminal como su IDE, y busca archivos en busca de propiedades constantemente, esto es lo que he estado usando.Hay un momento y un lugar para
find . -path ./node_modules -prune -o -name '*.js' | xargs grep -i mySearchTermcombinarlos con la apertura de archivos a través de vim y otros métodos. Para mí, eso es raramente.Espero que esto ayude a alguien.
fuente
$(...)en su lugar. No es tan importante en su línea de comando como en un script, pero creo que aún es mejor usar eso en sus respuestas :) (referencias aquí y aquí )