จะสลับไฟล์ระหว่าง Windows ใน VIM ได้อย่างไร?


123

เมื่อฉันทำงานกับ VIM ฉันมักจะมองเห็นหลายหน้าต่าง บางครั้งฉันก็อยากจะมีวิธีง่ายๆในการสลับหน้าต่างเหล่านั้นในสถานที่ต่างๆ มี Plugin, Macro และอื่น ๆ ที่ทำให้สิ่งนี้ง่ายขึ้นหรือไม่? BTW ฉันใช้ MiniBufExplorer


2
การ "สลับหน้าต่างเหล่านั้นในตำแหน่ง" คุณหมายถึง "การเปิดบัฟเฟอร์ที่อยู่ในหน้าต่าง A ในหน้าต่าง B หรือในทางกลับกันโดยไม่เปลี่ยนตำแหน่งของหน้าต่าง"
hcs42

1
ใช่นี่คือสิ่งที่ฉันต้องการ
mdrozdziel

คำตอบ:


304

มีคำสั่งที่มีประโยชน์บางอย่างในตัวซึ่งให้การควบคุมระดับหนึ่งแก่คุณ แต่ยังไม่ครอบคลุม หลัก ๆ คือ:

  • Ctrl- W, r(เช่นCTRLกดค้าง, กดW, ปล่อยCTRL, กดr) - ซึ่งจะหมุนหน้าต่าง (หน้าต่างแรกกลายเป็นหน้าต่างที่สองหน้าต่างที่สองกลายเป็นหน้าต่างที่สามเป็นต้น)

  • Ctrl- W, x- สลับหน้าต่างปัจจุบันกับหน้าต่างถัดไป

  • Ctrl- W, Shift- H- เลื่อนหน้าต่างนี้ไปทางซ้ายสุด

  • Ctrl- W, Shift- K- เลื่อนหน้าต่างนี้ไปด้านบน

(และในทำนองเดียวกันสำหรับCtrl- W, Shift- JและCtrl- W, Shift- L) ดู:

:help window-moving

สำหรับข้อมูลเพิ่มเติม.


16
นี่ควรเป็น "คำตอบที่ดีที่สุด" - ฟังก์ชันดั้งเดิมไม่ใช่ Vimscript ที่กำหนดเอง
David Rivers

1
ไม่สมบูรณ์ไม่มี มีกรณีการใช้งานมากมายที่ไม่สามารถทำได้โดยใช้การจัดการหน้าต่างในตัวโดยไม่ทำลายและสร้างหน้าต่างใหม่ สคริปต์บัฟเฟอร์ swap อนุญาตกรณีการใช้งานเหล่านี้
bobpaul

โปรดทราบว่า ctl-w ก็ใช้ได้เช่นกัน ctl-W จะปิดหน้าต่างในตัวเลียนแบบเทอร์มินัลบางตัว
datakid

7

ฉันเขียนและใช้ข้อมูลโค้ดต่อไปนี้ใน vimrc ของฉันเพื่อคัดลอกวางหน้าต่าง Vim ของฉัน

สิ่งนี้กำหนดตัวอย่างทางลัดต่อไปนี้:

  • <c-w>y: "ดึงหน้าต่าง" คือเก็บหมายเลขของบัฟเฟอร์ในหน้าต่างปัจจุบันในตัวแปรส่วนกลาง
  • <c-w>pp: "วางหน้าต่างในตำแหน่งของหน้าต่างปัจจุบัน" กล่าวคืออ่านหมายเลขบัฟเฟอร์ที่เก็บไว้ก่อนหน้านี้และเปิดบัฟเฟอร์นั้นในหน้าต่างปัจจุบัน นอกจากนี้ยังเก็บหมายเลขของบัฟเฟอร์ที่เคยอยู่ในหน้าต่างปัจจุบัน

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

  1. เลือกหน้าต่าง A (ด้วยคำสั่งเมาส์หรือแป้นพิมพ์)
  2. กด<c-w>y(ดึงหมายเลขบัฟเฟอร์)
  3. เลือกหน้าต่าง B
  4. กด<c-w>pp(วางบัฟเฟอร์)
  5. เลือกหน้าต่าง A
  6. กด<c-w>pp(วางบัฟเฟอร์อีกครั้ง)

ใช้งานได้เฉพาะใน Vim> = 7.0

if version >= 700
function! HOpen(dir,what_to_open)

    let [type,name] = a:what_to_open

    if a:dir=='left' || a:dir=='right'
        vsplit
    elseif a:dir=='up' || a:dir=='down'
        split
    end

    if a:dir=='down' || a:dir=='right'
        exec "normal! \<c-w>\<c-w>"
    end

    if type=='buffer'
        exec 'buffer '.name
    else
        exec 'edit '.name
    end
endfunction

function! HYankWindow()
    let g:window = winnr()
    let g:buffer = bufnr('%')
    let g:bufhidden = &bufhidden
endfunction

function! HDeleteWindow()
    call HYankWindow()
    set bufhidden=hide
    close
endfunction

function! HPasteWindow(direction)
    let old_buffer = bufnr('%')
    call HOpen(a:direction,['buffer',g:buffer])
    let g:buffer = old_buffer
    let &bufhidden = g:bufhidden
endfunction

noremap <c-w>d :call HDeleteWindow()<cr>
noremap <c-w>y :call HYankWindow()<cr>
noremap <c-w>p<up> :call HPasteWindow('up')<cr>
noremap <c-w>p<down> :call HPasteWindow('down')<cr>
noremap <c-w>p<left> :call HPasteWindow('left')<cr>
noremap <c-w>p<right> :call HPasteWindow('right')<cr>
noremap <c-w>pk :call HPasteWindow('up')<cr>
noremap <c-w>pj :call HPasteWindow('down')<cr>
noremap <c-w>ph :call HPasteWindow('left')<cr>
noremap <c-w>pl :call HPasteWindow('right')<cr>
noremap <c-w>pp :call HPasteWindow('here')<cr>
noremap <c-w>P :call HPasteWindow('here')<cr>

endif

4

ฉันถามคำถามที่คล้ายกันในเวลาเดียวกัน: ฉันต้องการวิธีการสลับหน้าต่างโดยเฉพาะโดยไม่ต้องเปลี่ยนรูปแบบที่ซับซ้อนโดยพลการ ฉันลงเอยด้วยการสร้างปลั๊กอินเป็นกลุ่มจากหนึ่งในโซลูชันที่แนะนำ เรียกว่าWindowSwap.vim ; ติดตั้งด้วยตัวจัดการปลั๊กอิน vim ที่คุณต้องการและหมุนวน

ด้วย WindowSwap.vim คุณก็ทำได้ง่ายๆ

  1. <Leader>yw เพื่อดึงหน้าต่าง
  2. ย้ายเคอร์เซอร์ไปที่หน้าต่างอื่น
  3. <Leader>pw เพื่อวางหน้าต่างนั้นโดยสลับกับตำแหน่งของหน้าต่างแรก

การผสมคีย์สามารถกำหนดค่าได้ตามความต้องการของคุณ


1

เป็น<c-w>rหรือ<c-w>xมีข้อ จำกัด ที่คุณไม่สามารถหมุนหรือแลกเปลี่ยนหน้าต่างได้เมื่อการแบ่งหน้าต่างแนวตั้งและแนวนอนผสมกัน และ<c-w>Hอาจทำให้เค้าโครงหน้าต่างเปลี่ยนไปเกินความคาดหมายโดยเฉพาะอย่างยิ่งเมื่อคุณมีหลายหน้าต่าง

ดังนั้นคุณอาจทำงานบางอย่างเพื่อตอบสนองความต้องการเฉพาะของคุณในการสลับหน้าต่าง / บัฟเฟอร์ นี่คือตัวอย่างของการสลับหน้าต่างปัจจุบันด้วยหน้าต่างด้านซ้ายบน (โดยทั่วไปฉันจะขยายให้ใหญ่สุดในแนวตั้ง):

function! SwitchMainWindow()
  let l:current_buf = winbufnr(0)
  exe "buffer" . winbufnr(1)
  1wincmd w
  exe "buffer" . l:current_buf
endfunction
nnoremap <c-w><c-e> :call SwitchMainWindow()<cr>

1

ในความคิดของฉันhttp://vimcasts.org/episodes/working-with-windows/มีคำตอบที่สมบูรณ์แบบสำหรับคำถามนี้ โดยสรุป:

  • ctrl-w w วนไปมาระหว่างหน้าต่างที่เปิดอยู่
  • ctrl-w h โฟกัสหน้าต่างไปทางซ้าย
  • ctrl-w j โฟกัสหน้าต่างไปที่ด้านล่าง
  • ctrl-w k โฟกัสหน้าต่างให้ขึ้น
  • ctrl-w l โฟกัสหน้าต่างไปทางขวา
  • ctrl-w r หมุนหน้าต่างทั้งหมด
  • ctrl-w x แลกเปลี่ยนหน้าต่างปัจจุบันกับเพื่อนบ้าน
  • ctrl-w H ย้ายหน้าต่างปัจจุบันไปทางซ้ายสุด
  • ctrl-w J ย้ายหน้าต่างปัจจุบันไปด้านล่าง
  • ctrl-w K ย้ายหน้าต่างปัจจุบันไปด้านบน
  • ctrl-w L ย้ายหน้าต่างปัจจุบันไปทางขวาสุด

3
อะไรคือเหตุผลในการเพิ่มคำตอบที่ไม่มีข้อมูลใหม่ที่เป็นประโยชน์มาสู่โพสต์ นี่เป็นคำตอบที่สมบูรณ์แบบเมื่อ 6 ปีที่แล้ว คุณกำลังทำแคมเปญโฆษณาสำหรับ vimcasts หรือไม่?
mdrozdziel

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