Dahili vim komutunun çıkışını arabelleğe dökün


18

Dahili bir vim komutunu (shell komutu değil) yeni bir arabelleğe nasıl atabilirim?

Örneğin, içine tüm eklentilerin bir listesini dökümü istiyorum :enewden :scriptnamesbunu arama yapabilmesi.

Yanıtlar:


24

:redirÇıkışı bir değişkene, kayıt defterine veya dosyaya yeniden yönlendirmek için kullanabilirsiniz . Adsız sicile yeniden yönlendirme örneği:

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

Alternatif olarak Tim Pope's scriptease.vim , hızlı düzeltme listesine :Scriptnamesyüklenecek komutu sağlar :scriptnamesve :copen.

Kendinizi birçok komutu yeniden yönlendiriyorsanız bulursanız, bunu bir komutta tamamlamak isteyebilirsiniz:

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

Şimdi :Redirçıktıyı yeni bir arabelleğe yönlendirmek için komutu kullanabilirsiniz . örneğin :Redir scriptnamesveya :Redir ls.

Vim 8+

Vim 8 yeni execute()işlevle geliyor. Eski komut çıktısını yakalamak execute()yerine işlevini kullanabilirsiniz :redir.

 :enew|pu=execute('scriptnames') 

Daha fazla yardım için bkz:

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

Ne anlama ENDgeliyor?
Bryce Guinta

1
Çıktıyı kayıt defterine yönlendirmeyi durdurur, böylece tekrar düzenli çıktı alabilirsiniz.
Tumbler41

1
:redir ENDVim'e mesajları yeniden yönlendirmeyi sona erdirmesini söyler. Bakınız:h :redir
Peter Rincker

Harici bir komut yürütmek ve çıktısını bir Vim değişkeninde yakalamak için system () kullanın. : let hostname = sistem ('hostname')
kullanıcı3751385

2

Bütünlük için , romainl'den topladığım (çaldığım) bu harika fonksiyonları sunmak istiyorum.

" 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>)

Bu normal veya sistem komut çıkışını alır ve yeni bir sekmeye yerleştirir. Satırını değiştirmek için çekinmeyin tabnewiçin vsplitya splitvs.



@DynoFu, yanıtıma link ekledi.
klaus

1

Ayrıca bufferize.vim eklentisi de var:

:Bufferize scriptnames

temel olarak kabul edilen cevabın paketlenmiş bir versiyonu (kullanma :redir) ve bazıları için daha uygun olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.