เมื่อฉันทำงานกับ VIM ฉันมักจะมองเห็นหลายหน้าต่าง บางครั้งฉันก็อยากจะมีวิธีง่ายๆในการสลับหน้าต่างเหล่านั้นในสถานที่ต่างๆ มี Plugin, Macro และอื่น ๆ ที่ทำให้สิ่งนี้ง่ายขึ้นหรือไม่? BTW ฉันใช้ MiniBufExplorer
เมื่อฉันทำงานกับ VIM ฉันมักจะมองเห็นหลายหน้าต่าง บางครั้งฉันก็อยากจะมีวิธีง่ายๆในการสลับหน้าต่างเหล่านั้นในสถานที่ต่างๆ มี Plugin, Macro และอื่น ๆ ที่ทำให้สิ่งนี้ง่ายขึ้นหรือไม่? BTW ฉันใช้ MiniBufExplorer
คำตอบ:
มีคำสั่งที่มีประโยชน์บางอย่างในตัวซึ่งให้การควบคุมระดับหนึ่งแก่คุณ แต่ยังไม่ครอบคลุม หลัก ๆ คือ:
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
สำหรับข้อมูลเพิ่มเติม.
ฉันเขียนและใช้ข้อมูลโค้ดต่อไปนี้ใน vimrc ของฉันเพื่อคัดลอกวางหน้าต่าง Vim ของฉัน
สิ่งนี้กำหนดตัวอย่างทางลัดต่อไปนี้:
<c-w>y: "ดึงหน้าต่าง" คือเก็บหมายเลขของบัฟเฟอร์ในหน้าต่างปัจจุบันในตัวแปรส่วนกลาง<c-w>pp: "วางหน้าต่างในตำแหน่งของหน้าต่างปัจจุบัน" กล่าวคืออ่านหมายเลขบัฟเฟอร์ที่เก็บไว้ก่อนหน้านี้และเปิดบัฟเฟอร์นั้นในหน้าต่างปัจจุบัน นอกจากนี้ยังเก็บหมายเลขของบัฟเฟอร์ที่เคยอยู่ในหน้าต่างปัจจุบันหาก "สลับหน้าต่างเหล่านั้นในตำแหน่ง" หมายความว่า "เปิดบัฟเฟอร์ในหน้าต่าง A ในหน้าต่าง B และในทางกลับกันโดยไม่เปลี่ยนตำแหน่งของหน้าต่าง" คุณสามารถใช้ลำดับแป้นพิมพ์ต่อไปนี้เพื่อสลับหน้าต่าง:
<c-w>y(ดึงหมายเลขบัฟเฟอร์)<c-w>pp(วางบัฟเฟอร์)<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
              ฉันถามคำถามที่คล้ายกันในเวลาเดียวกัน: ฉันต้องการวิธีการสลับหน้าต่างโดยเฉพาะโดยไม่ต้องเปลี่ยนรูปแบบที่ซับซ้อนโดยพลการ ฉันลงเอยด้วยการสร้างปลั๊กอินเป็นกลุ่มจากหนึ่งในโซลูชันที่แนะนำ เรียกว่าWindowSwap.vim ; ติดตั้งด้วยตัวจัดการปลั๊กอิน vim ที่คุณต้องการและหมุนวน
ด้วย WindowSwap.vim คุณก็ทำได้ง่ายๆ
<Leader>yw เพื่อดึงหน้าต่าง   <Leader>pw เพื่อวางหน้าต่างนั้นโดยสลับกับตำแหน่งของหน้าต่างแรกการผสมคีย์สามารถกำหนดค่าได้ตามความต้องการของคุณ
เป็น<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>
              ในความคิดของฉัน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    ย้ายหน้าต่างปัจจุบันไปทางขวาสุด