Dump output dari perintah vim internal ke buffer

18

Bagaimana cara membuang perintah vim internal (bukan perintah shell) ke buffer baru?

Misalnya, saya ingin membuang daftar semua plugin :enewdari :scriptnamessehingga saya dapat mencarinya.

Bryce Guinta
sumber

Jawaban:

24

Anda dapat menggunakan :rediruntuk mengarahkan output ke variabel, daftar, atau file. Contoh pengalihan ke register yang tidak disebutkan namanya:

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

Sebagai alternatif, scriptease.vim Tim Pope menyediakan :Scriptnamesperintah yang akan dimuat :scriptnameske dalam daftar perbaikan cepat dan :copen.

Jika Anda menemukan diri Anda mengarahkan ulang banyak perintah, Anda mungkin ingin menyelesaikan ini dalam sebuah perintah:

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

Sekarang Anda dapat menggunakan :Redirperintah untuk mengarahkan output ke buffer baru. misalnya :Redir scriptnamesatau :Redir ls.

Vim 8+

Vim 8 dikirimkan dengan execute()fungsi baru . Anda dapat menggunakan execute()fungsi ini alih-alih :rediruntuk menangkap keluaran perintah sebelumnya.

 :enew|pu=execute('scriptnames') 

Untuk bantuan lebih lanjut lihat:

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()
Peter Rincker
sumber
Apa ENDartinya
Bryce Guinta
1
Itu berhenti mengarahkan output ke register sehingga Anda dapat memiliki output reguler lagi.
Tumbler41
1
:redir ENDmemberitahu Vim untuk mengakhiri mengarahkan pesan. Lihat:h :redir
Peter Rincker
Untuk menjalankan perintah eksternal dan menangkap outputnya dalam variabel Vim, gunakan sistem (). : let hostname = system ('hostname')
user3751385
2

Untuk kelengkapan, saya ingin mempresentasikan fungsi luar biasa yang saya kumpulkan (mencuri) dari 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>)

Ini akan mengambil output perintah sistem atau normal dan meletakkannya di tab baru. Jangan ragu untuk mengubah jalur tabnewke vsplitatau splitdll.

klaus
sumber
@DynoFu, menambahkan tautan ke jawaban saya.
klaus
1

Ada juga plugin bufferize.vim :

:Bufferize scriptnames

yang pada dasarnya merupakan versi paket dari jawaban yang diterima (menggunakan :redir) dan mungkin lebih nyaman bagi sebagian orang.

Marius Gedminas
sumber