内部vimコマンドの出力をバッファーにダンプします


18

シェルコマンドではなく内部vimコマンドを新しいバッファーにダンプするにはどうすればよいですか?

たとえば、私はにすべてのプラグインのリストをダンプしたい:enewから:scriptnames、私はそれを検索できるようにします。

回答:


24

を使用:redirして、出力を変数、レジスタ、またはファイルにリダイレクトできます。名前のないレジスタにリダイレクトする例:

:redir @">|silent scriptnames|redir END|enew|put

あるいは、Tim Popeのscriptease.vimは、クイックフィックスリストとに:Scriptnamesロード:scriptnamesするコマンドを提供します:copen

多くのコマンドをリダイレクトしていることに気付いた場合、これをコマンドにまとめることもできます。

command! -nargs=+ -complete=command Redir let s:reg = @@ | redir @"> | silent execute <q-args> | redir END | new | pu | 1,2d_ | let @@ = s:reg

これで、:Redirコマンドを使用して、出力を新しいバッファーにリダイレクトできます。例:Redir scriptnamesまたは:Redir ls

Vim 8+

Vim 8には新しいexecute()機能が付属しています。元のコマンド出力をキャプチャexecute()する代わりに、関数toを使用でき:redirます。

 :enew|pu=execute('scriptnames') 

詳細については、以下を参照してください。

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()

どういうEND意味ですか?
ブライスギンタ

1
出力をレジスタにリダイレクトするのを停止するので、通常の出力を再び使用できます。
タンブラー41

1
:redir ENDVimにメッセージのリダイレクトを終了するよう指示します。参照:h :redir
ピーターリンカー

外部コマンドを実行し、その出力をVim変数にキャプチャするには、system()を使用します。:let hostname = system( 'hostname')
user3751385

2

完全を期すために、私はromainlから収集した(盗んだ)この素晴らしい機能を紹介したいと思います。

" redirect the output of a Vim or external command into a scratch buffer
function! Redir(cmd)
  if a:cmd =~ '^!'
    execute "let output = system('" . substitute(a:cmd, '^!', '', '') . "')"
  else
    redir => output
    execute a:cmd
    redir END
  endif
  tabnew
  setlocal nobuflisted buftype=nofile bufhidden=wipe noswapfile
  call setline(1, split(output, "\n"))
  put! = a:cmd
  put = '----'
endfunction
command! -nargs=1 Redir silent call Redir(<f-args>)

これにより、通常のコマンド出力またはシステムコマンド出力が取得され、新しいタブに配置されます。行を変更してお気軽tabnewvsplitsplitなど



@DynoFu、私の答えへのリンクを追加しました。
クラウス

1

bufferize.vimプラグインもあります。

:Bufferize scriptnames

これは基本的に受け入れられた回答のパッケージ化されたバージョン(を使用:redir)であり、一部のユーザーにとってはより便利な場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.