เมื่อฉันทำงานกับ 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
ย้ายหน้าต่างปัจจุบันไปทางขวาสุด