आंतरिक vim कमांड के आउटपुट को बफर में डंप करें


18

मैं एक आंतरिक vim कमांड (शेल कमांड नहीं) को एक नए बफर में कैसे डंप करूं?

उदाहरण के लिए, मैं में सभी प्लग-इन की एक सूची डंप करना चाहते :enewसे :scriptnamesइतना है कि मैं इसे खोज सकते हैं।

जवाबों:


24

आप :redirआउटपुट को चर, रजिस्टर या फ़ाइल में पुनर्निर्देशित कर सकते हैं । अनाम रजिस्टर पर पुनर्निर्देशित करने का उदाहरण:

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

वैकल्पिक रूप से टिम पोप की 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।

विम 8+

नए execute()समारोह के साथ 8 जहाजों को विम करें । आप पूर्व-कमांड आउटपुट को कैप्चर execute()करने के बजाय फ़ंक्शन का उपयोग कर सकते हैं :redir।

 :enew|pu=execute('scriptnames') 

अधिक मदद के लिए देखें:

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

क्या ENDमतलब है?
— ब्राइस गुइंटा

1
यह आउटपुट को रजिस्टर पर पुनर्निर्देशित करना बंद कर देता है ताकि आप फिर से नियमित उत्पादन कर सकें।
— तुम्बलर 41

1
:redir ENDसंदेशों को पुनर्निर्देशित करने के लिए विम को बताता है। देखें:h :redir
— बजे पीटर रिंकेर

किसी बाहरी कमांड को निष्पादित करने और उसके आउटपुट को Vim वैरिएबल में कैप्चर करने के लिए, सिस्टम () का उपयोग करें। : let hostname = system ('hostname')
— user3751385

2

पूर्णता के लिए, मैं इस भयानक कार्य को प्रस्तुत करना चाहता हूं जिसे मैंने रोमेल से एकत्र किया (चुराया था)

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

यह सामान्य या सिस्टम कमांड आउटपुट लेगा और एक नए टैब में डाल देगा। लाइन बदलने के लिए स्वतंत्र महसूस tabnewकरने के लिए vsplitया splitआदि


@ romainl के सार के लिए लिंक gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7
— Dyno फू

@DynoFu, मेरे जवाब के लिए लिंक जोड़ा गया।
— klaus

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.