Bagaimana cara membuang perintah vim internal (bukan perintah shell) ke buffer baru?
Misalnya, saya ingin membuang daftar semua plugin :enew
dari :scriptnames
sehingga saya dapat mencarinya.
Bagaimana cara membuang perintah vim internal (bukan perintah shell) ke buffer baru?
Misalnya, saya ingin membuang daftar semua plugin :enew
dari :scriptnames
sehingga saya dapat mencarinya.
Jawaban:
Anda dapat menggunakan :redir
untuk 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 :Scriptnames
perintah yang akan dimuat :scriptnames
ke 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 :Redir
perintah untuk mengarahkan output ke buffer baru. misalnya :Redir scriptnames
atau :Redir ls
.
Vim 8 dikirimkan dengan execute()
fungsi baru . Anda dapat menggunakan execute()
fungsi ini alih-alih :redir
untuk 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()
:redir END
memberitahu Vim untuk mengakhiri mengarahkan pesan. Lihat:h :redir
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 tabnew
ke vsplit
atau split
dll.
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.
END
artinya