vim terminal xargs

¿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.