Vim内からの「STDINからの読み取り」メッセージを抑制するにはどうすればよいですか?


18

Vimを使用してstdinから読み取ると、情報メッセージが出力されます。

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

$

これは単なる例です。実際の使用では、シェル構造は許可されていません。 vim <(echo foo)オプションではありません。

Vimオプションやvimrc設定のみを使用してそれを抑制できますか?


これが何であるかを知る必要がある場合は、マンページ(恥知らずのプラグ)を読むためにVimを使用しようとしています。GNUの男は、シェル構造を許可していないMANPAGER、と使用することによりftplugin/man.vim、および他のもの、私は正常にだけ使用して快適な経験を持っているために管理していますMANPAGER="vim -"。最後に残った迷惑は、私が見たすべてのマンページの後に印刷された見苦しいメッセージです。


使用するexport MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'か、export MANPAGER="vim -"私には何の問題を見ていませんか?man ls期待どおりにマンページを開きます。
マーティントゥルノイ

@Carpetsmokerと閉じた後は?
ムル

いや、何も表示されません...
マーティンTournoij

@CarpetsmokerどのバージョンのVimを使用していますか?何についてecho foo | vim -Nu NONE -
muru

vimで: help less、ページャーとして使用するための情報を提供します。
mtklr

回答:


8

以降ではVimの8.0.1308(2017年11月)は、使用することができます--not-a-term。このメッセージを抑制するためのオプションを。例えばquit

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

またはexit

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

catそのままで、これはに相当しますが、Vimscriptを入力に適用するのに役立ちます。たとえば+'runtime! syntax/2html.vim'、強調表示されたテキストをスタイル付きHTMLとしてエクスポートする(推定または指定されたファイルタイプを想定)。これまでに述べたもの以外のいくつかのオプションがあります。最初に思い浮かぶのはmktemp、コマンドの出力を保存するために使用し、これをVimの入力として使用することです。Vimのリダイレクトとシェルコマンドを追加して、コマンドの結果をバッファーに「貼り付ける」ことができますが、これにはさらに作業が必要です。(Vimスクリプトファイルは、エイリアスを使用する代わりに、長時間の呼び出しを自動化できます。)
ジョンP

ソケットからの出力を編集/貼り付けできる場合がありますが、それが本当である場合は非常に便利です。受け入れられた回答に対する警告よりも悪い警告がない限り、最良のオプションは一時ファイルであるといわれています。ただし、特定のシェルには、zshmiscのマンページにリストされているもの(リダイレクトなど)のように、このプロセスの一部を単純化する既存のエイリアス/ビルトイン/構文がある場合があります。挿入モードに入る引数の後の引数として、入力されたかのように解析しますか?
ジョンP

私が見る--not-a-termのUbuntu 16.04(Mac上ではなく7.4.8056)でVimの1689年7月4日に、それはメッセージを抑止しません。
追って通知があるまで一時停止します。

@DennisWilliamsonのchangelogを参照してください:help version8.txt--not-a-termオプション自体が追加され7.4.1419、その動作が変更され、標準入力から読み取り...メッセージも抑制されました8.0.1308。(ちなみに、メッセージを編集するN個のファイルもから抑制されています8.1.1258
ynn

12

あなたの正確な質問への答え:

Vimオプションやvimrc設定のみを使用してそれを抑制できますか?

です:いいえ、それはだではないので、次の一部の可能コード

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

つまり、-vimの引数として指定すると、そのメッセージが機械的に表示されます。

ただし、回避策として、-引数の代わりにファイルリダイレクトを使用すると、メッセージは削除されます。

echo "foo" | vim < /dev/tty

そして、これはMANPAGEちょうど動作する™の設定例です(インターチューブから取得):

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
ときにされて ALWAYS_USE_GUI定義され、あなたは知っていますか?
ムル

2
feature.hを参照してください(ALWAYS_USE_GUIが定義されていないため、基本的にすべてのUNIXバージョンで実行されます)。
クリスチャンブラバンド

2
回避策を得ることができませんecho "foo" | vim < /dev/tty。それを行うことはでき[2]+ Stopped echo "foo" | vim < /dev/ttyます。
レオレオポルトヘルツ준영

2
@LéoLéopoldHertz준영のように、ttyトリックはうまくいきませんでした(gvimは空のドキュメントを提供し、vimはキーボード入力と本当に混乱しますが、少なくともSIGSTOPを受け取りません)。私はさらに幸運に恵まれましたecho "foo" | gvim /dev/stdin(ただし、GUI以外のvimはそれについて苦情を出します:)Vim: Warning: Input is not from a terminal
アダム・カッツ

2
さて、私の前のメッセージを忘れてください。答えの秘trickの<(col -b)一部です。それは本質的にcatmanページを印刷するための洗練されたバージョンであり、最終的にvimのメッセージを取り除くことができますecho test | vim < /dev/tty <(cat>
Alexander

1

Vimでは、この問題234d162コミット(> = v8.0.1387)で対処されています。

解決策:--not-a-term使用されたメッセージを表示しないでください。

したがって、メッセージは、ユーザーが標準入力をリダイレクトしていない場合にのみ表示されます。


同様の問題は、Vimの代わりに使用できるNeovimの最近のバージョン(> = v0.2.2-dev)で解決されています

NVim v0.2.2がリリースされると、次を実行できるはずです。

$ echo foo | nvim -

メッセージがありません。


0
  1. バージョン8.0.1387以降のvimでは、--not-a-termオプションを使用できます。

  2. 古いバージョンの場合、次のトリックを使用します。 $ echo foo | bash -c 'vim < /dev/tty <(cat)'

最初の引数/dev/ttyは、入力がキーボードから来たと考えるようにVimを何らかの形でだまします。それは、そのファイルに対してisatty(3)がTrueを返すためだと思います。そして、2番目の引数は、標準入力からVimの標準入力まですべてを単純に通過させます。最後に、シェルがサポートしていない場合、bash -c特別な構造が機能するためにプレフィックスが必要です<(...)bashの元の解決策は、に簡略化することができます $ echo foo | vim < /dev/tty <(cat)


これらの両方は、既存の回答または質問自体でカバーされています。ここで何が新しくなったのですか?
ムル

@muru 2番目のケースがどのように機能するかは説明されていませんでしたが、なぜMANPAGEでしか機能しないのか疑問に思っていました。
アレクサンダーソロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.