ดัมพ์เอาต์พุตของคำสั่ง vim ภายในลงในบัฟเฟอร์


18

ฉันจะดัมพ์คำสั่ง vim ภายใน (ไม่ใช่คำสั่งเชลล์) ลงในบัฟเฟอร์ใหม่ได้อย่างไร?

ตัวอย่างเช่นฉันต้องการถ่ายโอนรายชื่อของปลั๊กอินทั้งหมด:enewจาก:scriptnamesเพื่อให้ฉันสามารถค้นหาได้

คำตอบ:


24

คุณสามารถใช้:redirเพื่อเปลี่ยนเส้นทางเอาต์พุตไปยังตัวแปรรีจิสเตอร์หรือไฟล์ ตัวอย่างการเปลี่ยนเส้นทางไปยังการลงทะเบียนที่ไม่มีชื่อ:

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

อีกวิธีหนึ่งคือทิมสมเด็จพระสันตะปาปาscriptease.vimให้:Scriptnamesคำสั่งซึ่งจะโหลด:scriptnamesลงในรายการ QuickFIX :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+

Vim 8 มาพร้อมกับexecute()ฟังก์ชั่นใหม่ คุณสามารถใช้execute()ฟังก์ชันแทน:redirการจับภาพเอาต์พุตคำสั่ง ex

 :enew|pu=execute('scriptnames') 

สำหรับความช่วยเหลือเพิ่มเติมดู:

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

อะไรENDหมายถึง?
Bryce Guinta

1
มันหยุดการเปลี่ยนทิศทางเอาต์พุตไปยังรีจิสเตอร์เพื่อให้คุณสามารถมีเอาต์พุตปกติอีกครั้ง
Tumbler41

1
:redir ENDบอกให้ Vim สิ้นสุดการเปลี่ยนเส้นทางข้อความ ดู:h :redir
Peter Rincker

เพื่อรันคำสั่งภายนอกและจับเอาท์พุทของมันในตัวแปร Vim ให้ใช้ system () : let hostname = system ('hostname')
user3751385

2

เพื่อความสมบูรณ์ฉันต้องการนำเสนอฟังก์ชั่นที่ยอดเยี่ยมที่ฉันรวบรวม (stole) จาก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>)

นี่จะใช้เอาต์พุตปกติหรือคำสั่งระบบและวางไว้ในแท็บใหม่ อย่าลังเลที่จะเปลี่ยนสายtabnewเป็นvsplitหรือsplitอื่น ๆ


ลิงค์ไปยังส่วนสำคัญของ @ romainl gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7
Dyno Fu

@DynoFu เพิ่มลิงค์ไปยังคำตอบของฉัน
klaus

1

นอกจากนี้ยังมีปลั๊กอินbufferize.vim :

:Bufferize scriptnames

ซึ่งเป็นรุ่นที่บรรจุของคำตอบที่ยอมรับ (ใช้:redir) และอาจสะดวกกว่าสำหรับบางคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.