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:
:files
enumera correctamente todos los.java
archivos 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
xargs
usa un muñecostdin
que 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/null
por lo que elreset
comando en este caso ayuda. Esto se explica bien por la gravedad en el superusuario .Si está utilizando
find
para pasar nombres de archivos para editar, no necesitaxargs
, solo use-exec
, por ejemplo:Si desea usar
xargs
, en Unix / macOS debe usar-o
parámetros, como:o:
Nota: El uso de
-print0
/-0
admitirá nombres de archivo con espacios en blanco.find
+ BSDxargs
En 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
parallel
lugar dexargs
forzar la asignación de tty, por ejemplo:Nota:
parallel
en 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
-t
enssh
), así que busca ayuda.Otra sugerencia sería usar:
ex
editor 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 vim
genera una advertencia, ¿por qué? [dup] en unix SEfuente
xargs
no 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 **/*.java
comando rellenará la lista de argumentos de Vim con todos los archivos java encontrados dentro del directorio actual de forma recursiva. Luego puede usar:next
y:prev
para 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-context
para 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
reset
que también debería hacerlo.La razón es que se
xargs
establecestdin
en/dev/null
, mientras quevim
necesitastdin
ser/dev/tty
.xargs
Solución BSD (por ejemplo, Mac):-o
establece elstdin
proceso hijo de xarg (vim
en este caso) endev/tty
.xargs
Solución GNU (por ejemplo, Linux):GNU
xargs
no tiene la-o
opción. En su lugar, deberá utilizar una solución alternativa más complicada. (Nota: es muy importante tener lazero
cadena 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.
xargs
simplemente agrega elstdin
al final de la cadena, porxargs
lo que se ejecutará esto:2. El formato para
bash -c
esbash -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 -c
ejecutará el COMMAND_STRING:</dev/tty
configura elstdin
a/dev/tty
para quevim
pueda funcionar en modo interactivo.fuente
$0
marcador 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
find
conxargs
ygrep
, pero la sintaxis me resulta molesta. Y como un programador diario que usavim
y 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 mySearchTerm
combinarlos 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í )