vimコマンドの結果をシェルに出力する方法


11

シェル(bash:scriptnamesにいて、出力を確認したいが、vimを起動したくない、または別のファイルにエコーしたいとします。

だから私は実行します

vim +scriptnames

すべてのスクリプトが表示されますが、それをシェルの標準出力にエコーするにはどうすればよいですか?

回答:


10

これは通常、Vimが代替画面に切り替えてそこで機能するためです。終了すると、Vimは元に戻り、Vimセッションから何も表示されませんが、Vimを起動する前に実行されたコマンドの結果が表示されます。

この機能は(リンク)で説明されています:h xterm-screens

つまり、基本的にはそれを望まないので、それを無効にしたいのです。:set t_ti= t_te=これを行うには、これを実行する端末コードを空に設定します。

すべてをまとめると、次のようにVimを起動したいと思うでしょう。

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

'more'オプションをリセットしているため、hit-enter-promptは表示されません。


1
これはすごいです、どうもありがとう!これが可能かどうか実際に疑った。
hgiesel

これにより、VimLをstdout(特にマゾヒスティック)に書き込むことで、本格的なシステムスクリプト言語として使用できるようになりますか?
シャドウトーカー2016

1
この問題の1つは、端末をスクロールできないことです。(テキストが端末の高さよりも長い場合、上部が見えません)vimを開いて終了すると、テキストも消えます。
FDinoff

@FDinoffこれがポケットベルのようなlessものです。あまりパイプに接続しないでくださいvim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less。最初はレイアウトがおかしくなっているかもしれません(私の端末にあります)。
hgiesel

を実行しても出力が表示されません。vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'「クイックフラッシュ」しかありません。コマンドはコード0で終了し、出力はありません。何か不足していますか?
TrungDQ 2017

3

:redirコマンドを使用して、vimコマンドの結果をファイルにリダイレクトすることもできます

例えば、

vim -c "redir! > vimout | scriptnames | redir END | q"

これscriptnamesは、ファイル「vimout」に出力をリダイレクトします


1

クリスチャンブラバンドからの回答に感謝しますが、別の-cコマンドを使用してquitコマンドを区切ると、次のようになります。

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

この方法を使用すると、さまざまなコマンドをつなぎ合わせて、最後の「q!」を使用できます。vimを終了します。


0

手動で開始した場合のように、vimを完全にロードする必要がある状況では、これは機能します。

vim -c "autocmd! CursorHold * <commands to run>"

たとえば、出力を:mapシェルからファイルにリダイレクトしたかったのですが、vim-airlineがタブライン(すべてのバッファー名が開いていることを示す最上部の行)が表示された後でのみ作成されるマッピングをキャプチャしたいと思いました。これは非同期で-c、ファイルへのリダイレクトを実行するだけでは、マッピングを作成する時間を与えられませんでした。より良い方法があるかもしれませんが、これは私にとってはうまくいきます。特に、(0.1秒)にすでにupdatetime設定しているため100CursorHoldイベントが発生するまでの時間に影響します。デフォルトでは、vimは4秒に設定します。

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.