¿Cómo puedo suprimir el mensaje de "lectura de STDIN" desde Vim?


18

Al usar Vim para leer desde stdin, imprime un mensaje informativo:

$ echo foo | vim -
Vim: Reading from stdin...

$

Esto es solo un ejemplo. El uso real no permite construcciones de shell. vim <(echo foo)no es una opinión.

¿Puedo suprimir eso usando solo las opciones de Vim y / o la configuración de vimrc?


En caso de que necesite saber para qué sirve, estoy tratando de usar Vim para leer páginas de manual (conector descarado). GNU man no permite construcciones de shell MANPAGER, y al usar ftplugin/man.vimy otras cosas, he logrado tener una experiencia cómoda usando solo MANPAGER="vim -". La última molestia restante es el mensaje desagradable impreso después de cada página de manual que vi.


¿Utilizando export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'o export MANPAGER="vim -"no veo ningún problema? man lsabre la página de manual como se esperaba.
Martin Tournoij

@Carpetsmoker y después de cerrarlo?
muru

No, no veo nada ...
Martin Tournoij

@Carpetsmoker, ¿qué versión de Vim estás usando? ¿Qué pasaecho foo | vim -Nu NONE -
Muru

En vim, : help lessda información para usarlo como buscapersonas.
mtklr

Respuestas:


8

A partir de Vim 8.0.1308 (noviembre de 2017), puede usar la --not-a-termopción para suprimir este mensaje; por ejemplo con quit:

$ echo hello | vi - --not-a-term -esc '%p|q!'
hello

O con exit:

$ echo hello | vi - --not-a-term -esc 'x!/dev/stdout'
hello

Como es, esto es equivalente a cat, pero aún puede ser útil para aplicar Vimscript a la entrada, por ejemplo, +'runtime! syntax/2html.vim'para exportar texto resaltado como HTML con estilo (suponiendo un tipo de archivo deducido o especificado). Hay algunas opciones diferentes a las mencionadas hasta ahora; lo primero que viene a la mente es usar mktemppara almacenar la salida del comando y usar esto como entrada de Vim. Puede agregar los comandos de redirección y shell de Vim para 'pegar' el resultado del comando en el búfer, pero esto requiere más trabajo. (Los archivos de secuencia de comandos de Vim pueden automatizar largas invocaciones en lugar de usar alias.)
John P

Es posible editar / pegar la salida de un socket, lo que podría ser realmente útil si fuera cierto. Todavía digo que la mejor opción es un archivo temporal, a menos que haya advertencias peores que las de la respuesta aceptada. Sin embargo, para un shell dado, puede haber un alias / builtin / sintaxis existente que simplifique alguna parte de este proceso, como los que se enumeran en la página de manual de zshmisc (redirecciones, etc.) Uno más, tal vez pueda escapar de la entrada y suministrarla. como argumento después de un argumento que ingresa al modo de inserción, por lo que se analiza como si estuviera escrito?
John P

Veo --not-a-termen Vim 7.4.1689 en Ubuntu 16.04 (pero no 7.4.8056 en una Mac), pero no suprime el mensaje.
Pausado hasta nuevo aviso.

@DennisWilliamson Vea el registro de cambios por :help version8.txt. --not-a-termopción sí se añadió en 7.4.1419y su comportamiento se cambió a suprimir también la lectura de la entrada estándar ... mensaje en 8.0.1308. (Por cierto, también se suprimen los N archivos para editar el mensaje 8.1.1258)
ynn

12

La respuesta a tu pregunta exacta :

¿Puedo suprimir eso usando solo las opciones de Vim y / o la configuración de vimrc?

es: no, es que no es posible por lo siguiente parte del código

    if (read_stdin)
    {
#ifndef ALWAYS_USE_GUI
        mch_msg(_("Vim: Reading from stdin...\n"));
#endif

lo que significa que si le das un -argumento a vim, entonces mostrará mecánicamente ese mensaje.

sin embargo, como solución alternativa, si usa una redirección de archivo en lugar del -argumento, se deshará del mensaje:

echo "foo" | vim < /dev/tty

y aquí hay un ejemplo de MANPAGEconfiguración que simplemente funciona ™ (tomado de los intertubos):

export MANPAGER='bash -c "vim -MRn -c \"set ft=man nomod nolist nospell nonu\" -c \"nm q :qa!<CR>\" -c \"nm <end> G\" -c \"nm <home> gg\"</dev/tty <(col -b)"'

2
Cuando se ALWAYS_USE_GUI define, ¿sabes?
muru

2
vea feature.h (se hace cuando ALWAYS_USE_GUI no está definido, así que básicamente para todas las versiones de Unix).
Christian Brabandt

2
No puedo obtener el echo "foo" | vim < /dev/ttytrabajo de solución . Hacerlo da [2]+ Stopped echo "foo" | vim < /dev/tty.
Léo Léopold Hertz 준영

2
Al igual que @ LéoLéopoldHertz 준영, el truco tty no funcionó para mí (gvim da un documento vacío, vim se confunde realmente con las entradas del teclado, pero al menos no recibe un SIGSTOP). He tenido más suerte con echo "foo" | gvim /dev/stdin(aunque el vim no GUI todavía emitirá una queja al respecto:) Vim: Warning: Input is not from a terminal.
Adam Katz

2
Bueno, olvida mi mensaje anterior. El truco en la respuesta es en <(col -b)parte. Esa es esencialmente una versión sofisticada catpara imprimir páginas man, y finalmente puede deshacerse del mensaje de vim conecho test | vim < /dev/tty <(cat>
Alexander Solovets

1

En Vim, este problema se ha solucionado en 234d162commit (> = v8.0.1387).

Solución: No mostrar el mensaje con el que --not-a-termse utilizó.

Por lo tanto, el mensaje solo se muestra cuando el usuario no ha redirigido el stdin.


Se ha abordado un problema similar en la versión reciente de Neovim ( > = v0.2.2-dev ) que podría usar en lugar de Vim.

Una vez que se lanza NVim v0.2.2, debería poder ejecutar:

$ echo foo | nvim -

sin tener el mensaje


0
  1. Con vim de la versión 8.0.1387 y posteriores, puede usar la --not-a-termopción.

  2. Para una versión anterior usa el siguiente truco: $ echo foo | bash -c 'vim < /dev/tty <(cat)'

El primer argumento de /dev/ttyalguna manera engaña a Vim para pensar que la entrada proviene del teclado. Supongo que es porque isatty (3) devuelve True para ese archivo. Y el segundo argumento simplemente pasa de todo, desde su entrada estándar a la entrada estándar de Vim. Finalmente, bash -cse requiere un prefijo para que la construcción especial <(...)funcione si el shell no lo admite. En bash, la solución original se puede simplificar a $ echo foo | vim < /dev/tty <(cat)


Ambos están cubiertos en las respuestas existentes o en la pregunta misma. ¿Qué hay de nuevo aquí?
muru

@muru No se explicó cómo funciona el segundo caso, y la gente se preguntaba por qué solo funcionaba en MANPAGE.
Alexander Solovets
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.