Como posso suprimir a mensagem "lendo do STDIN" no Vim?


18

Ao usar o Vim para ler a partir de stdin, ele imprime uma mensagem informativa:

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

$

Este é apenas um exemplo. O uso real não permite construções de shell. vim <(echo foo)não é uma opção.

Posso suprimir isso usando apenas opções do Vim e / ou configurações do vimrc?


Caso você precise saber para que serve isso, estou tentando usar o Vim para ler páginas de manual (plug descarado). O GNU man não permite construções de shell MANPAGERe, usando ftplugin/man.vime outras coisas, eu consegui ter uma experiência confortável usando apenas MANPAGER="vim -". O último incômodo restante é a mensagem desagradável impressa após cada página de manual que eu vi.


Usando export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'ou export MANPAGER="vim -"não vejo problema? man lsabre a página de manual conforme o esperado.
Martin Tournoij 08/09/2015

@Carpetsmoker e depois de fechá-lo?
muru 8/09/15

Não, não vejo nada ...
Martin Tournoij 08/09/2015

@Carpetsmoker qual versão do Vim você está usando? Que talecho foo | vim -Nu NONE -
Muru

No vim, : help lessfornece algumas informações para usá-lo como pager.
mtklr

Respostas:


8

A partir do Vim 8.0.1308 (novembro de 2017), você pode usar a --not-a-termopção para suprimir esta mensagem; por exemplo com quit:

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

Ou com exit:

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

Como é, isso é equivalente a cat, mas ainda pode ser útil para aplicar o Vimscript à entrada, por exemplo, +'runtime! syntax/2html.vim'para exportar texto destacado como HTML estilizado (assumindo o tipo de arquivo deduzido ou especificado). Existem algumas opções além das mencionadas até agora; o primeiro que vem à mente é usar mktemppara armazenar a saída do comando e usá-la como entrada do Vim. Você pode adicionar os comandos de redirecionamento e shell do Vim para 'colar' o resultado do comando no buffer, mas isso exige mais trabalho. (Arquivos de script Vim pode automatizar invocações longas em vez de usar aliases.)
John P

Talvez seja possível editar / colar a saída de um soquete, o que poderia ser realmente útil se fosse verdade. Eu ainda digo que a melhor opção é um arquivo temporário, a menos que haja advertências piores que as da resposta aceita. Porém, para um determinado shell, pode haver um alias / builtin / sintaxe existente que simplifica parte do processo, como os listados na página de manual do zshmisc (redirecionamentos etc.). Mais um - talvez você possa escapar da entrada e fornecê-la como um argumento após um argumento que entra no modo de inserção, para analisar como se tivesse sido digitado?
John P

Eu vejo --not-a-termno Vim 7.4.1689 no Ubuntu 16.04 (mas não no 7.4.8056 em um Mac), mas não suprime a mensagem.
Pausado até novo aviso.

@DennisWilliamson Veja o changelog de :help version8.txt. --not-a-termA opção em si foi adicionada 7.4.1419e seu comportamento foi alterado para também suprimir a mensagem Reading from stdin ... in 8.0.1308. (A propósito, os N arquivos para editar a mensagem também são suprimidos 8.1.1258)
ynn 20/10

12

A resposta para sua pergunta exata :

Posso suprimir isso usando apenas opções do Vim e / ou configurações do vimrc?

é: não, é não possível devido ao seguinte parte do código

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

o que significa que, se você der -como argumento ao vim, ele mostrará mecanicamente essa mensagem.

no entanto, como solução alternativa, se você usar um redirecionamento de arquivo em vez do -argumento, se livrará da mensagem:

echo "foo" | vim < /dev/tty

e aqui está um exemplo de MANPAGEconfiguração que simplesmente funciona ™ (tirada dos 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
Quando é ALWAYS_USE_GUI definido, você sabe?
muru 9/09/15

2
veja feature.h (é feito quando ALWAYS_USE_GUI não está definido, basicamente para todas as versões unix).
Christian Brabandt 9/09/15

2
Não consigo obter o echo "foo" | vim < /dev/ttytrabalho da solução alternativa . Fazendo isso dá [2]+ Stopped echo "foo" | vim < /dev/tty.
Léo Léopold Hertz #

2
Como o @ LéoLéopoldHertz 준영, o truque tty não funcionou para mim (o gvim fornece um documento vazio, o vim fica realmente confuso com as entradas do teclado, mas pelo menos não recebe um SIGSTOP). Eu tive mais sorte echo "foo" | gvim /dev/stdin(embora o vim que não seja da GUI ainda faça uma reclamação sobre isso Vim: Warning: Input is not from a terminal:).
Adam Katz

2
Bem, esqueça minha mensagem anterior. O truque na resposta é em <(col -b)parte. Isso é essencialmente uma versão sofisticada de catpara imprimir páginas do homem, e você pode finalmente se livrar da mensagem do vim comecho test | vim < /dev/tty <(cat>
Alexander Solovieskj

1

No Vim, esse problema foi resolvido no 234d162commit (> = v8.0.1387).

Solução: Não mostrar a mensagem com --not-a-termfoi usada.

Portanto, a mensagem é exibida apenas quando o usuário não redireciona o stdin.


Problema semelhante foi abordado na versão recente do Neovim ( > = v0.2.2-dev ) que você pode usar em vez do Vim.

Depois que o NVim v0.2.2 for lançado, você poderá executar:

$ echo foo | nvim -

sem ter a mensagem.


0
  1. Com o vim da versão 8.0.1387 e mais recente, você pode usar a --not-a-termopção

  2. Para uma versão mais antiga, use o seguinte truque: $ echo foo | bash -c 'vim < /dev/tty <(cat)'

O primeiro argumento, de /dev/ttyalguma forma, engana o Vim a pensar que a entrada vem do teclado. Eu acho que é porque isatty (3) retorna True para esse arquivo. E o segundo argumento simplesmente repassa tudo, desde a entrada padrão até a entrada padrão do Vim. Finalmente, o bash -cprefixo é necessário para que a construção especial <(...)funcione se o shell não a suportar. No bash, a solução original pode ser simplificada para $ echo foo | vim < /dev/tty <(cat)


Ambos são abordados nas respostas existentes ou na própria pergunta. O que há de novo aqui?
Muru

@muru Não foi explicado como o segundo caso funciona, e as pessoas estavam se perguntando por que ele só funcionava no MANPAGE.
Alexander Solovets
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.