Wie kann ich die Meldung "Lesen von STDIN" in Vim unterdrücken?


18

Wenn Vim zum Lesen von stdin verwendet wird, wird eine informative Nachricht ausgegeben:

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

$

Dies ist nur ein Beispiel. Die tatsächliche Verwendung erlaubt keine Shell-Konstrukte. vim <(echo foo)ist keine Option.

Kann ich das unterdrücken, indem ich nur Vim-Optionen und / oder Vimrc-Einstellungen verwende?


Für den Fall, dass Sie wissen müssen, wofür dies ist, versuche ich, Vim zum Lesen von Manpages (schamloser Plug) zu verwenden. GNU Man lässt keine Shell-Konstrukte zu MANPAGER, und durch die Verwendung ftplugin/man.vimund anderer Dinge habe ich es erfolgreich geschafft, eine komfortable Erfahrung mit nur zu haben MANPAGER="vim -". Der letzte verbleibende Ärger ist die unansehnliche Nachricht, die nach jeder von mir betrachteten Manpage gedruckt wird.


Mit export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'oder export MANPAGER="vim -"sehe ich kein Problem? man lsÖffnet die Manpage wie erwartet.
Martin Tournoij

@Carpetsmoker und nachdem Sie es geschlossen haben?
muru

Nein, nichts sehen ...
Martin Tournoij

@Carpetsmoker welche Version von Vim benutzt du? Was ist mitecho foo | vim -Nu NONE -
muru

Gibt in vim : help lesseinige Informationen zur Verwendung als Pager.
MTKLR

Antworten:


8

Ab Vim 8.0.1308 (Nov 2017) können Sie --not-a-termdiese Meldung mit der Option unterdrücken. zum Beispiel mit quit:

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

Oder mit exit:

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

Dies entspricht, catkann aber dennoch nützlich sein, um Vimscript auf die Eingabe anzuwenden, z. B. +'runtime! syntax/2html.vim'um hervorgehobenen Text als formatiertes HTML zu exportieren (vorausgesetzt, es handelt sich um einen abgeleiteten oder angegebenen Dateityp). Es gibt einige andere als die bisher genannten Optionen. Das erste, was mir in den Sinn kommt, ist, mktempdie Ausgabe des Befehls zu speichern und diese als Eingabe von Vim zu verwenden. Sie können die Umleitungs- und Shell-Befehle von Vim hinzufügen, um das Befehlsergebnis in den Puffer einzufügen. Dies erfordert jedoch etwas mehr Arbeit. (Vim-Skriptdateien können längere Aufrufe automatisieren, anstatt Aliase zu verwenden.)
John P

Es könnte möglich sein, Ausgaben von einem Socket zu bearbeiten / einzufügen, was wirklich nützlich sein könnte, wenn es wahr wäre. Ich sage immer noch, dass die beste Option eine temporäre Datei ist, es sei denn, es gibt Vorbehalte, die schlimmer sind als die für die akzeptierte Antwort. Für eine bestimmte Shell gibt es jedoch möglicherweise einen vorhandenen Alias ​​/ Builtin / -Syntax, der einen Teil dieses Prozesses vereinfacht, z. B. die in der Manpage für zshmisc aufgelisteten (Umleitungen usw.) als Argument nach einem Argument, das in den Einfügemodus wechselt, so dass es wie eingegeben analysiert wird?
John P

Ich sehe --not-a-termin Vim 7.4.1689 in Ubuntu 16.04 (aber nicht 7.4.8056 auf einem Mac), aber es unterdrückt die Nachricht nicht.
Bis auf weiteres angehalten.

@DennisWilliamson Siehe das Changelog von :help version8.txt. --not-a-termDie Option selbst wurde hinzugefügt 7.4.1419und ihr Verhalten wurde geändert, um auch das Einlesen der Nachricht von stdin ... in zu unterdrücken 8.0.1308. (By the way, die N - Dateien zu bearbeiten Nachricht wird auch von unterdrückt werden 8.1.1258)
YNN

12

Die Antwort auf Ihre genaue Frage:

Kann ich das unterdrücken, indem ich nur Vim-Optionen und / oder Vimrc-Einstellungen verwende?

ist: nein, es ist wegen des folgenden Teils des Codes nicht möglich

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

Dies bedeutet, dass, wenn Sie -vim als Argument angeben, diese Meldung automatisch angezeigt wird.

Wenn Sie jedoch eine Dateiumleitung anstelle des -Arguments verwenden, wird die folgende Meldung entfernt:

echo "foo" | vim < /dev/tty

und hier ist ein Beispiel für eine MANPAGEEinstellung, die gerade funktioniert ™ (aus den Zwischenrohren):

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
Wann ist ALWAYS_USE_GUI definiert, wissen Sie?
muru

2
Siehe feature.h (wird ausgeführt, wenn ALWAYS_USE_GUI nicht definiert ist, also grundsätzlich für alle Unix-Versionen).
Christian Brabandt

2
Ich kann die Workaround- echo "foo" | vim < /dev/ttyArbeit nicht bekommen . Es zu tun gibt [2]+ Stopped echo "foo" | vim < /dev/tty.
Léo Léopold Hertz 준영

2
Wie bei @ LéoLéopoldHertz 준영 hat der Tty-Trick bei mir nicht funktioniert (gvim gibt ein leeres Dokument aus, vim ist wirklich verwirrt mit den Tastatureingaben, erhält aber zumindest kein SIGSTOP). Ich hatte mehr Glück damit echo "foo" | gvim /dev/stdin(obwohl das Nicht-GUI-Vim immer noch eine Beschwerde darüber ausstellen wird:) Vim: Warning: Input is not from a terminal.
Adam Katz

2
Nun, vergiss meine vorherige Nachricht. Der Trick in der Antwort ist zum <(col -b)Teil. Das ist im Wesentlichen eine raffinierte Version catfür das Drucken von Manpages, und Sie können die Nachricht des Vims mitecho test | vim < /dev/tty <(cat>
Alexander Solovets

1

In Vim wurde dieses Problem in 234d162commit (> = v8.0.1387) behoben.

Lösung: Zeigen Sie nicht, dass die Nachricht mit --not-a-termverwendet wurde.

Daher wird die Nachricht nur angezeigt, wenn der Benutzer die Standardeingabe nicht umgeleitet hat.


Ähnliches Problem wurde angesprochen in der jüngsten Version von Neovim ( > = v0.2.2-dev ) , die Sie anstelle von Vim benutzen konnten.

Nach der Veröffentlichung von NVim v0.2.2 sollten Sie in der Lage sein, Folgendes auszuführen:

$ echo foo | nvim -

ohne die Nachricht zu haben.


0
  1. Ab Version 8.0.1387 können Sie die --not-a-termOption verwenden.

  2. Verwenden Sie für ältere Versionen den folgenden Trick: $ echo foo | bash -c 'vim < /dev/tty <(cat)'

Das erste Argument /dev/ttytäuscht Vim irgendwie vor, dass die Eingabe von der Tastatur kommt. Ich denke, das liegt daran, dass isatty (3) für diese Datei True zurückgibt. Und das zweite Argument durchläuft einfach alles von der Standardeingabe bis zur Standardeingabe von Vim. Schließlich ist ein bash -cPräfix erforderlich, damit das spezielle Konstrukt <(...)funktioniert, wenn die Shell es nicht unterstützt. In Bash kann die ursprüngliche Lösung vereinfacht werden $ echo foo | vim < /dev/tty <(cat)


Beides wird in vorhandenen Antworten oder in der Frage selbst behandelt. Was ist neu hier?
Muru

@muru Es wurde nicht erklärt, wie der zweite Fall funktioniert, und die Leute fragten sich, warum es nur in MANPAGE funktioniert.
Alexander Solovets
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.