Come posso sopprimere il messaggio "lettura da STDIN" dall'interno di Vim?


18

Quando si utilizza Vim per leggere da stdin, stampa un messaggio informativo:

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

$

Questo è solo un esempio. L'uso effettivo non consente costrutti di shell. vim <(echo foo)non è un'opzione.

Posso sopprimerlo utilizzando solo le opzioni di Vim e / o le impostazioni di Vimrc?


Nel caso tu abbia bisogno di sapere a cosa serve, sto cercando di usare Vim per leggere le manpage (spina spudorata). GNU man non ammette i costrutti di shell MANPAGERe, usando ftplugin/man.vime altre cose, sono riuscito con successo a fare un'esperienza confortevole usando solo MANPAGER="vim -". L'ultimo fastidio rimasto è il messaggio sgradevole stampato dopo ogni manpage che ho visto.


Usando export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'o export MANPAGER="vim -"non vedo alcun problema? man lsapre la manpage come previsto.
Martin Tournoij,

@Carpetsmoker e dopo averlo chiuso?
Muru,

No, non vedo niente ...
Martin Tournoij,

@Carpetsmoker quale versione di Vim stai usando? Che direecho foo | vim -Nu NONE -
Muru,

In vim, : help lessfornisce alcune informazioni per usarlo come un cercapersone.
mtklr,

Risposte:


8

A partire da Vim 8.0.1308 (novembre 2017), è possibile utilizzare l' --not-a-termopzione per sopprimere questo messaggio; ad esempio 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

Come è, questo equivale a cat, ma può ancora essere utile per applicare Vimscript all'input, ad esempio +'runtime! syntax/2html.vim'per esportare il testo evidenziato come HTML con stile (assumendo il tipo di file dedotto o specificato). Ci sono alcune opzioni diverse da quelle menzionate finora; il primo che viene in mente è usare mktempper memorizzare l'output del comando e usarlo come input di Vim. È possibile aggiungere i comandi di reindirizzamento e shell di Vim per "incollare" il risultato del comando nel buffer, ma ciò richiede un po 'più di lavoro. (I file di script Vim possono automatizzare lunghe invocazioni invece di utilizzare gli alias.)
John P

Potrebbe essere possibile modificare / incollare l'output da un socket, il che potrebbe essere davvero utile se fosse vero. Dico ancora che l'opzione migliore è un file temporaneo, a meno che non ci siano avvertenze peggiori di quelle per la risposta accettata. Per una determinata shell, tuttavia, potrebbe esserci un alias / builtin / sintassi esistente che semplifica una parte di questo processo, come quelli elencati nella manpage di zshmisc (reindirizzamenti, ecc.) Ancora uno - forse puoi sfuggire all'input e fornirlo come argomento dopo un argomento che entra nella modalità di inserimento, quindi analizza come se fosse digitato?
Giovanni P

Vedo --not-a-termin Vim 1689/07/04 in Ubuntu 16.04 (ma non 7.4.8056 su un Mac), ma non sopprime il messaggio.
In pausa fino a nuovo avviso.

@DennisWilliamson Guarda il log delle modifiche di :help version8.txt. --not-a-termè stata aggiunta l'opzione stessa 7.4.1419e il suo comportamento è stato modificato per eliminare anche il messaggio Lettura da stdin ... in 8.0.1308. (A proposito, anche gli N file per modificare il messaggio possono essere soppressi 8.1.1258)
ynn

12

La risposta alla tua domanda esatta :

Posso sopprimerlo utilizzando solo le opzioni di Vim e / o le impostazioni di Vimrc?

è: no, non è possibile a causa della seguente parte del codice

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

il che significa che se dai -come argomento a Vim, allora mostrerà meccanicamente quel messaggio.

tuttavia, come soluzione, se usi un reindirizzamento dei file anziché l' -argomento ti libererai del messaggio:

echo "foo" | vim < /dev/tty

ed ecco un esempio di MANPAGEimpostazione che funziona semplicemente ™ (presa dagli intertubes):

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 definito, lo sai?
Muru,

2
vedi feature.h (è fatto quando ALWAYS_USE_GUI non è definito, quindi sostanzialmente per tutte le versioni di unix).
Christian Brabandt,

2
Non riesco a far funzionare la soluzione alternativa echo "foo" | vim < /dev/tty. Farlo dà [2]+ Stopped echo "foo" | vim < /dev/tty.
Léo Léopold Hertz 준영 1o16

2
Come @ LéoLéopoldHertz 준영, il trucco di tty non ha funzionato per me (gvim dà un documento vuoto, vim si confonde davvero con gli input da tastiera, ma almeno non riceve un SIGSTOP). Ho avuto più fortuna con echo "foo" | gvim /dev/stdin(anche se il vim non-GUI emetterà comunque un reclamo al riguardo:) Vim: Warning: Input is not from a terminal.
Adam Katz,

2
Bene, dimentica il mio messaggio precedente. Il trucco nella risposta è in <(col -b)parte. Questo è in sostanza una versione sofisticata di catper la stampa di pagine man, e si può finalmente sbarazzarsi di messaggio del vim conecho test | vim < /dev/tty <(cat>
Alexander Solovets

1

In Vim, questo problema è stato risolto in 234d162commit (> = v8.0.1387).

Soluzione: non mostrare il messaggio con è --not-a-termstato utilizzato.

Quindi il messaggio viene visualizzato solo quando l'utente non ha reindirizzato lo stdin.


Problema simile è stato risolto nella recente versione di Neovim ( > = v0.2.2-dev ) che è possibile utilizzare al posto di Vim.

Una volta rilasciato NVim v0.2.2, dovresti essere in grado di eseguire:

$ echo foo | nvim -

senza avere il messaggio.


0
  1. Con vim della versione 8.0.1387 e successive è possibile utilizzare l' --not-a-termopzione.

  2. Per la versione precedente utilizzare il seguente trucco: $ echo foo | bash -c 'vim < /dev/tty <(cat)'

Il primo argomento in /dev/ttyqualche modo induce Vim a pensare che l'input provenga dalla tastiera. Immagino che sia perché isatty (3) restituisce True per quel file. E il secondo argomento passa semplicemente attraverso tutto, dal suo input standard all'input standard di Vim. Infine, bash -cè necessario il prefisso affinché il costrutto speciale <(...)funzioni se la shell non lo supporta. In bash la soluzione originale può essere semplificata $ echo foo | vim < /dev/tty <(cat)


Entrambi sono trattati nelle risposte esistenti o nella domanda stessa. Cosa c'è di nuovo qui?
muru,

@muru Non è stato spiegato come funziona il secondo caso e la gente si chiedeva perché funzionasse solo in MANPAGE.
Alexander Solovets,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.