シェルコマンド(!)の出力をVimの新しいバッファーにパイプします。


回答:


27

シェルコマンドの出力を新しいバッファーを作成するコマンドにパイプすることはできませんが、新しいバッファーを作成し、Vimのコマンドラインの1つのエントリでそのバッファーにシェルコマンドの出力を読み込むことができます。あなたの例の作業バージョンは

:tabnew | r !echo <c-r>=bufname("#")<cr>

この場合のパイプ記号は、シェルのパイプではなく、Vim exコマンド間のセパレーターであることに注意してください。こちらもご覧ください

:help :tabnew
:help :r!
:help :bar

それは私が必要とするものとほぼ正確で、現在のバッファのファイル名にアクセスできるようにするための逆の方法です。注:希望する最終結果を明確にするために質問を更新しました。
リッチーマルケス

@Richard Marquez:この回答を更新しました。「古い」ファイル名で新しいタブが開かれるため、:!echo%
akira

ただし:r!echo、バッファを変更しない限りではありません。
リュックエルミット

2
@ garyjohn、akira:助けてくれてありがとう。「<cr> = ...」の部分はVimのエラーを吐き出しましたが、「:tabnew | r!echo#」で動作させることができました。
リッチーマルケス

1
また、これを.vimrcのキーにマッピングする場合は、|を置き換える必要があることに注意してください。<bar>付きの文字。
リッチーマルケス

16

これが私がやることです。上記の回答のコメントで暗示されています。

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)

例1:すべてのテキストファイルを検索する/tmp

:new | r ! find /tmp -name '*.txt'

例2:ファイルfoo.txtを編集してls -la foo.txtおり、実行してバッファで出力を取得します。

:new | r ! ls -la #

#あなたがしている編集元のバッファのファイル名に置き換えられます。これは、特にアドホックソース管理コマンドに役立ちます。

:new | r ! hg annotate -un #

:new水平分割を作成します。:vnew代わりに垂直分割が必要な場合、および:tabnew新しいタブに使用します。


ここでもこの質問に答えることができますか?%E499以外の次のバッファーに現在のバッファーを使用しようとしています。
hhh


2

結果を新しいバッファーに保存する必要があるが、古い現在のバッファーからの情報が必要な場合は、次のいずれかを使用できますsystem()

:let res = system('echo '.expand('%'))
:tabnew
:put=res

または、後で使用するため現在のバッファ名を保存します。

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>

他の答えを参照してください、あなたは変数に名前を保存せずにそれを行うことができます。とにかく良い答え。
アキラ

確かに。私はタブを使用したことがないとして-私は確かに「#」のような場合には、予想される結果を与えるではなかった
リュックHermitte
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.