¿Por qué "localizar el nombre de archivo | xargs vim "causa un comportamiento terminal extraño?
(2)
Otra alternativa es ejecutar xargs
con la opción -o
. De la página del manual:
-o Reopen stdin as /dev/tty in the child process before executing
the command. This is useful if you want xargs to run an interac-
tive application.
Tenga en cuenta que -o
es una extensión BSD para xargs.
Un medio más portátil para lograr el mismo efecto es:
xargs sh -c ''vim "$@" < /dev/tty'' vim
Cuando "Localizo 50local.policy | xargs vim", aparece el error "Vim: Warnung: Die Eingabe kommt nicht von einem Terminal" (traducción: Vim: Advertencia: La entrada no proviene de un terminal).
Puedo editar exitosamente con vim, pero después de que lo cierre, mi terminal se comporta de manera extraña (no puedo escribir letras y cuando presiono el comando intro, simplemente se repite. Cuando lo hago con "xargs gedit" no crea esos problemas.
Yo uso Ubuntu 11.10 con Gnome 3 y Gnome-Terminal 3.0.1.
Vim espera estar conectado a un terminal real y envía códigos apropiados para eso.
Reinicie el terminal con
reset
La solución más fácil:
locate 50local.policy | xargs gvim
Justificación gui vim no requiere un terminal
De otra manera:
vim $(locate 50local.policy)
La lógica vim se inicia directamente conectada al terminal (en lugar de como un proceso secundario bajo
xargs
que a su vez se ejecuta en una subshell con stdin / stdout conectado a tuberías en lugar de un terminal). Es como decir
vim /usr/some/dir/50local.policy /usr/local/some/dir/50local.policy
Alternativamente
Puede evitar el problema no iniciando vim con los argumentos, ¡sino agregando los argumentos de vim! De hecho, Vim es mucho mejor para ejecutar shells que para ejecutar vim.
Mientras que en vim:
:args `locate 50local.policy`
:rewind
Esto establece la lista de argumentos en los archivos devueltos desde el comando de shell entre las marcas; : rebobinar luego va al primer archivo de esa lista. Si estaba editando varias coincidencias, intente esto:
:w|next
Esta secuencia de comandos (separados por |) escribe el búfer actual en el archivo, luego pasa al siguiente archivo en la lista de argumentos.