สลับตำแหน่งของหน้าต่างทั้งสอง


29

สมมติว่าสิ่งต่อไปนี้เป็นโครงสร้างปัจจุบันของหน้าต่างของฉัน:

+ ----- + ----------------------------
| |
| A |
| |
+ ----- +
| |
| B |

คำสั่งของ A และ B นั้นค่อนข้างไม่เป็นธรรมชาติ มันจะดีกว่าถ้า B อยู่ด้านบน

อย่างไรก็ตามถ้าฉันไป<C-w>KB จะเป็นหน้าต่างที่ยอดเยี่ยมที่สุดซึ่งไม่ใช่สิ่งที่ฉันต้องการ ฉันจะวาง B ไว้เหนือ A แต่ไม่ได้อยู่เหนือหน้าต่างอื่นที่อยู่เหนือ A ได้อย่างไร

และหากหน้าต่างสองบานถูกแยกในแนวตั้งฉันจะเปลี่ยนหน้าต่างเป็นแนวนอนได้อย่างไร


7
โพสต์นี้จะอธิบายวิธีหมุนหน้าต่าง นี่เป็นเรื่องเกี่ยวกับการสลับการแยกจากแนวตั้งเป็นแนวนอน
lcd047

@ lcd047 คำถามเหล่านี้อยู่นอกไซต์นี้ มันคุ้มไหมที่จะเขียนคำตอบเล็ก ๆ ที่นี่และรวมลิงค์ (ซึ่งมีค่า)?
Bernhard

1
@Bernhard ฉันคิดว่านี่เป็นคำถามที่ดีสำหรับเมตา
lcd047

1
@Bernhard ใช่ ตรวจสอบให้แน่ใจว่าได้เขียนคำตอบที่สมบูรณ์ไม่ใช่ลิงก์เท่านั้น
Gilles 'หยุดชั่วร้าย'

1
จากนั้นโปรดอธิบายสิ่งที่คุณกำลังพยายามทำและทำไมคำตอบทั้งสองที่ฉันแนะนำให้คุณไม่แก้ไขปัญหา
lcd047

คำตอบ:


33

หากต้องการสลับสองส่วนของหน้าต่างแยกให้ทำดังนี้ <C-w> <C-r>


ฉันอาจจะผิด แต่วิธีการแก้ปัญหาของคุณหมุนหน้าต่างดังนั้นด้วยการแยกมากกว่า 2 ผลจะไม่เป็นสิ่งที่ OP กำลังมองหา
statox

คุณพูดถูก OP กำลังมองหา s.th ซับซ้อนกว่า "สลับสองส่วนของหน้าต่างแยก"
modesto

อันที่จริง OP กำลังมองหาคำสั่งเพื่อสลับหน้าต่างสองฝั่งแยก แต่โซลูชันของคุณจะหมุนหน้าต่างแยกปัจจุบันทั้งหมด ดังที่ระบุไว้ใน:h CTRL-W_CTRL-R: The second window becomes the first one, the third one becomes the second one, etc.ดังนั้นหากคุณมีการแยก 3 ครั้งเคอร์เซอร์ที่ด้านล่างและกด<c-w><c-r>หน้าต่างที่ 3 จะอยู่ด้านบนสุดของอีก 2 อันที่ไม่ใช่ OP ที่ขอ:How can I put B above A, but not above any other window that is already above A?
statox

6

เพื่อสลับwindowตำแหน่งเอฟเฟกต์จะเทียบเท่ากับการแลกเปลี่ยนบัฟเฟอร์ที่หน้าต่างทั้งสองแสดง
เช่นหากหน้าต่าง A มีบัฟเฟอร์ 2 และหน้าต่าง B มีบัฟเฟอร์ 8 คุณจะต้องการไปที่หน้าต่าง A เลือกบัฟเฟอร์ 8 จากนั้นไปที่ Window B เลือกบัฟเฟอร์ 2

ความคิดนี้เป็นแรงบันดาลใจให้ฉันเขียนสคริปต์ - และมันมีอยู่ในกล่องเครื่องมือของฉันแล้วเช่นกัน

รหัสฟังก์ชั่น:

function! WinBufSwap()
  let thiswin = winnr()
  let thisbuf = bufnr("%")
  let lastwin = winnr("#")
  let lastbuf = winbufnr(lastwin)

  exec  lastwin . " wincmd w" ."|".
      \ "buffer ". thisbuf ."|".
      \ thiswin ." wincmd w" ."|".
      \ "buffer ". lastbuf
endfunction

command! Wswap :call WinBufSwap()
map <Leader>bs <C-c>:call WinBufSwap()<CR>
  1. เลือกหน้าต่าง A
  2. เลือกหน้าต่าง B
  3. :call WinBufSwap()
    วิธีนี้จะแลกเปลี่ยนบัฟเฟอร์ในหน้าต่างที่เลือกไว้ล่วงหน้าสองหน้าต่างโดยปล่อยเคอร์เซอร์ไว้ในหน้าต่างเดิม

การเลือกหน้าต่างที่ต้องการสองหน้าต่างที่จะสลับกันก่อนหน้านั้นเป็นรายละเอียดที่สำคัญเนื่องจากจำเป็นต้องระบุถึง Vim ที่จะใช้งานได้


แค่ความแม่นยำเมื่อคุณพูดว่า "เลือกหน้าต่าง A จากนั้น B" คุณหมายถึง "ให้ความสำคัญกับ A จากนั้นใน B เพื่อทำเครื่องหมายคำสั่งของบัฟเฟอร์และหน้าต่างที่เห็นล่าสุดเพื่อสลับอย่างถูกต้องหรือไม่" เลือก "หมายความว่าอย่างอื่น" มุ่งเน้นไปที่ "?
padawin

ใช่แน่นอน: ฉันกำลังใช้ "เลือก" เป็น "มุ่งเน้น"
Cometsong

6
CTRL-W x แลกเปลี่ยนหน้าต่างปัจจุบันด้วยหน้าต่าง N
                   (ค่าเริ่มต้น: หน้าต่างถัดไป)

( index.txtส่วน 2.2, "คำสั่งหน้าต่าง")

ถ้า A คือหน้าต่างปัจจุบันดังนั้นถัดไปจะเป็น B ดังนั้นคุณต้องการเท่านั้น <C-w> x

หาก B เป็นหน้าต่างปัจจุบัน (และมีหน้าต่างด้านล่างมากกว่า) จากนั้นคุณจะต้องไปที่ A ก่อนจากนั้นจึงแลกเปลี่ยน: <C-w> k <C-w> x


4

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

ตัวอย่างเช่นถ้าฉันมีสองไฟล์file_Aและfile_B :

  • ฉันจะไปที่หน้าต่างด้วยfile_Aและทำเครื่องหมาย:mA
  • ไปที่หน้าต่างด้วยfile_Bและทำเครื่องหมาย:mB
  • จากนั้นดึงเครื่องหมายfile_Aลงในหน้าต่างนั้น:'A
  • จากนั้นกลับไปที่หน้าต่างแรกและเรียกเครื่องหมายของfile_B'Bในมี:

ข้อดีของวิธีนี้คือถ้าคุณแยกบานหน้าต่างมากกว่าหนึ่งครั้งด้วยเหตุผลบางอย่างและไม่มีตรรกะที่ชัดเจนในการสลับมันรอบ ๆ เช่นถ้าคุณต้องการสลับบานหน้าต่างที่ 12 นาฬิกาและ 7 นาฬิกาคุณสามารถ ' ไม่เพียงหมุนหน้าต่างไปมา แต่คุณสามารถสลับบัฟเฟอร์ได้อย่างง่ายดาย


0

คุณสามารถสลับบัฟเฟอร์ระหว่างสองหน้าต่างด้วยฟังก์ชันต่อไปนี้:

function! SwitchWindow(count) abort
    let l:current_buf = winbufnr(0)
    exe "buffer" . winbufnr(a:count)
    exe a:count . "wincmd w"
    exe "buffer" . l:current_buf
    wincmd p
endfunction
nnoremap <C-w>x :<C-u>call SwitchWindow(v:count1)<CR>

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

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