เมื่อต้องการสลับจากการแบ่งตามแนวตั้งเป็นการแยกแนวนอนอย่างรวดเร็วใน Vim


596

คุณจะสลับหน้าต่างปัจจุบันของคุณจากการแบ่งตามแนวนอนเป็นการแยกในแนวตั้งและในทางกลับกันใน Vim ได้อย่างไร?

เมื่อก่อนผมทำโดยบังเอิญ แต่ไม่สามารถหากุญแจได้อีก


2
บางทีปลั๊กอินdwm.vimจะค่อนข้างมีประโยชน์
ДМИТРИЙМАЛИКОВ

คำตอบ:


894

รายชื่อผู้รับจดหมายเป็นกลุ่มพูดว่า (จัดรูปแบบใหม่เพื่อให้อ่านง่ายขึ้น):

หากต้องการเปลี่ยนหน้าต่างที่แยกในแนวตั้งสองบานเป็นแบ่งเป็นขอบฟ้า

Ctrl- w t Ctrl-w K

แนวนอนถึงแนวตั้ง:

Ctrl- w t Ctrl-w H

คำอธิบาย:

Ctrl- w t ทำให้หน้าต่างแรก (บน) เป็นปัจจุบัน

Ctrl- w K เลื่อนหน้าต่างปัจจุบันไปที่เต็มความกว้างที่ด้านบนสุด

Ctrl- w H เลื่อนหน้าต่างปัจจุบันไปที่ความสูงเต็มด้านซ้ายสุด

โปรดทราบว่า t เป็นตัวพิมพ์เล็กและ K และ H เป็นตัวพิมพ์ใหญ่

ยิ่งไปกว่านั้นด้วยหน้าต่างเพียงสองบานดูเหมือนว่าคุณสามารถดรอปCtrl- w tส่วนหนึ่งได้เพราะถ้าคุณอยู่ในหนึ่งในสองหน้าต่างแล้วประเด็นของการทำให้เป็นปัจจุบันคืออะไร


27
ดังนั้นหากคุณมีหน้าต่างสองบานแยกตามแนวนอนและคุณอยู่ในหน้าต่างด้านล่างคุณเพียงใช้ ^ WL
php มากเกินไป

7
.... พลัง ... เสียงเรียกเข้าของฉันเพิ่มเป็นสองเท่าในวันนี้ขอบคุณ มีคำสั่ง ^ w ที่น่าสนใจมากมาย (b, w, ฯลฯ )
Alex Hart

จะดีไหมนี่ใช้งานได้เมื่อใช้ปลั๊กอิน NERDTree :-)
Eno

3
@Eno ทำงานได้ดีสำหรับฉัน เพียงสลับแผง NERDTree ของคุณปิดก่อนที่จะ 'แยก' การแยกจากนั้นจึงสลับกลับมาเปิดอีกครั้ง : NERDTreeToggle (ฉันได้แมปเข้ากับปุ่มฟังก์ชั่นเพื่อความสะดวก)
Lambart

2
ฉันได้เพิ่มการแมปผู้นำไปยังการกำหนดค่าของฉัน: :nmap <leader>th <C-w>t<C-w>Hและ:nmap <leader>tk <C-w>t<C-w>K
Ian Marcinkowski

324

Ctrl- wตามด้วยH, J, KหรือL(เมืองหลวง) จะย้ายหน้าต่างปัจจุบันไปไกลleft, bottom, topหรือrightตามลำดับเช่นการนำเคอร์เซอร์ปกติ

ตัวพิมพ์เล็กเทียบเท่าขยับโฟกัสแทนการย้ายหน้าต่าง


5
จะดีกว่ามากเนื่องจากผู้ใช้ใช้ hjkl เพื่อย้ายระหว่างบัฟเฟอร์
Afshin Mehrabani

30
คำตอบที่ยอมรับได้เป็นคำตอบที่ดี แต่สำหรับฉันคำตอบนี้ง่ายต่อการจดจำ ขอบคุณ!
Jon Carter

ทำงานได้ดีขึ้นด้วย nerdtree ด้วย
arcseldon

มันทำงานได้สำหรับฉันใน macOS โดยคำนำหน้าCtrl- w(ฉันไม่ทราบ^ว่าCtrlในตัวอย่างของคุณ)
Giovanni Benussi

@GiovanniBenussi ใช่ผมคิดว่าหมายถึง^ Ctrl
ma11hew28

47

เมื่อคุณเปิดหน้าต่างสองบานขึ้นไปในแนวนอนหรือแนวตั้งและต้องการสลับหน้าต่างทั้งหมดเป็นแนวอื่นคุณสามารถใช้สิ่งต่อไปนี้:

(เปลี่ยนเป็นแนวนอน)

:windo wincmd K

(เปลี่ยนเป็นแนวตั้ง)

:windo wincmd H

มันได้อย่างมีประสิทธิภาพไปแต่ละหน้าต่างเป็นรายบุคคลและการใช้หรือ^WK^WH


32

คำสั่ง ex ต่อไปนี้จะแยกอีกจำนวนหน้าต่าง:

  • หากต้องการแยกในแนวตั้ง (เช่นทำให้แบ่งแนวตั้งระหว่าง windows) ให้พิมพ์ :vertical ball
  • หากต้องการแยกในแนวนอนให้พิมพ์ :ball

หากมีบัฟเฟอร์ที่ซ่อนอยู่การออกคำสั่งเหล่านี้จะทำให้บัฟเฟอร์ที่ซ่อนอยู่มองเห็นได้เช่นกัน


นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากคำตอบที่ได้รับการยอมรับในปัจจุบันจะใช้ได้กับสองไฟล์เท่านั้น คำตอบนี้สมบูรณ์มากขึ้น
DrStrangepork

:vert[ical] ballในเอกสารดังนั้น:vert ballก็โอเคและสั้นลง
Titou

:ballลด 3 หน้าต่างแนวตั้งเป็น 2 หน้าต่างแนวนอนในขณะที่:vert ball แมป 3 หน้าต่างแนวนอนเป็น 3 หน้าต่างแนวตั้งอย่างถูกต้อง
Titou

27

ใน VIM ให้ดูที่สิ่งต่อไปนี้เพื่อดูทางเลือกอื่นสำหรับสิ่งที่คุณอาจทำ:

: ช่วยเปิดหน้าต่าง

ตัวอย่างเช่น

Ctrl- - W s
Ctrl- W o
Ctrl- W v
Ctrl- W o
Ctrl- W s
...


11

แยกตามแนวนอนและแนวตั้ง

Ctrl+ Wสำหรับคำสั่ง window ตามด้วยShift+ HหรือShift+L


แยกแนวตั้งกับแนวนอน

Ctrl+ Wสำหรับคำสั่ง window ตามด้วยShift+ KหรือShift+J

โซลูชันทั้งสองจะใช้เมื่อมีหน้าต่างสองบานเท่านั้น


เปิดความช่วยเหลือในการแยกตามแนวตั้งโดยค่าเริ่มต้น

เพิ่มทั้งสองบรรทัดเหล่านี้ไปที่.vimrc:

cabbrev help vert help
cabbrev h vert h

:vert[ical] {cmd}เรียกใช้cmdงานหน้าต่างการทำงานในแนวตั้งเสมอ


6

แรงบันดาลใจจากคำตอบของสตีฟฉันเขียนฟังก์ชันง่าย ๆ ที่สลับระหว่างการแยกแนวตั้งและแนวนอนสำหรับหน้าต่างทั้งหมดในแท็บปัจจุบัน คุณสามารถผูกกับการทำแผนที่เหมือนในบรรทัดสุดท้ายด้านล่าง

function! ToggleWindowHorizontalVerticalSplit()
  if !exists('t:splitType')
    let t:splitType = 'vertical'
  endif

  if t:splitType == 'vertical' " is vertical switch to horizontal
    windo wincmd K
    let t:splitType = 'horizontal'

  else " is horizontal switch to vertical
    windo wincmd H
    let t:splitType = 'vertical'
  endif
endfunction

nnoremap <silent> <leader>wt :call ToggleWindowHorizontalVerticalSplit()<cr>

ทำงานได้ดียิ่งขึ้นสำหรับฉันถ้าฉันบังคับให้อยู่ในสปลิตเดียวกันเช่นนั้นif winnr() == 1 windo wincmd J windo wincmd k else windo wincmd J endif และif winnr() == 1 windo wincmd L windo wincmd h else windo wincmd L endifหวังว่าเหมาะสม
mjhoffmann

5

ทำตามเคล็ดลับของ Mark Rushakoff ด้านบนนี่คือแผนที่ของฉัน:

" vertical to horizontal ( | -> -- )
noremap <c-w>-  <c-w>t<c-w>K
" horizontal to vertical ( -- -> | )
noremap <c-w>\|  <c-w>t<c-w>H
noremap <c-w>\  <c-w>t<c-w>H
noremap <c-w>/  <c-w>t<c-w>H

แก้ไข:ใช้Ctrl- w rเพื่อสลับสองหน้าต่างหากไม่อยู่ในลำดับที่ดี

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