ฉันจะสลับตำแหน่งของไฟล์ที่เปิดสองไฟล์ (เป็น splits) เป็นกลุ่มได้อย่างไร


313

สมมติว่าฉันมีรูปแบบการแยกโดยพลการบางอย่างในกลุ่ม

____________________
| one       | two  |
|           |      |
|           |______|
|           | three|
|           |      |
|___________|______|

มีวิธีการสลับoneและtwoและรักษาเค้าโครงเดียวกันหรือไม่ มันง่ายในตัวอย่างนี้ แต่ฉันกำลังมองหาวิธีแก้ปัญหาที่จะช่วยให้รูปแบบที่ซับซ้อนมากขึ้น

UPDATE:

ฉันคิดว่าฉันควรจะชัดเจนมากขึ้น ตัวอย่างก่อนหน้าของฉันคือการทำให้เป็นจริงของ case-case ด้วยตัวอย่างจริง: ข้อความแสดงแทน

ฉันจะสลับสองตัวแยกเหล่านั้นได้อย่างไรโดยรักษาเลย์เอาต์เดิมไว้

Update! 3 ปีขึ้นไป ...

ฉันใส่โซลูชันของ sgriffin ในปลั๊กอิน Vim ที่คุณสามารถติดตั้งได้อย่างง่ายดาย! ติดตั้งกับผู้จัดการปลั๊กอินที่คุณชื่นชอบและลองใช้: WindowSwap.vim

ตัวอย่างเล็กน้อย


14
หากคุณชอบฉันสองนาทีที่ผ่านมาสงสัยว่า "ฉันจริงๆต้องปลั๊กอินสำหรับเรื่องนี้?" หยุดลังเลและติดตั้ง โดยทั่วไปมีเพียงหนึ่งคำสั่ง <leader> ww ที่คุณกดสองครั้งในแต่ละหน้าต่างเพื่อสลับ นี่ง่ายสุด ๆ และคุณจะใช้งานได้ใน 30 วินาที
mdup

คำตอบ:


227

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

เพียงตบสิ่งเหล่านี้ใน. vimrc ของคุณและแมปฟังก์ชันที่คุณเห็นว่าเหมาะสม:

function! MarkWindowSwap()
    let g:markedWinNum = winnr()
endfunction

function! DoWindowSwap()
    "Mark destination
    let curNum = winnr()
    let curBuf = bufnr( "%" )
    exe g:markedWinNum . "wincmd w"
    "Switch to source and shuffle dest->source
    let markedBuf = bufnr( "%" )
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' curBuf
    "Switch to dest and shuffle source->dest
    exe curNum . "wincmd w"
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' markedBuf 
endfunction

nmap <silent> <leader>mw :call MarkWindowSwap()<CR>
nmap <silent> <leader>pw :call DoWindowSwap()<CR>

วิธีใช้ (สมมติว่าต้นเมเปิ้ลตั้งเป็น \) คุณจะ:

  1. ย้ายไปที่หน้าต่างเพื่อทำเครื่องหมายการแลกเปลี่ยนผ่าน การเคลื่อนไหว ctrl-w
  2. พิมพ์\ mw
  3. ย้ายไปที่หน้าต่างที่คุณต้องการสลับ
  4. พิมพ์\ pw

Voila! เปลี่ยนบัฟเฟอร์โดยไม่ทำให้หน้าจอหน้าต่างของคุณเสียไป!


17
ฉันหวังว่าฉันจะโหวตคุณได้สิบครั้ง! ฉันต้องใช้noremapในการแมปเพื่อให้ทำงานได้ ไม่แน่ใจว่าทำไม แต่หวังว่าจะช่วยทุกคนที่พบสิ่งนี้ในภายหลัง : D
Wes

6
ฉันใส่วิธีการแก้ปัญหาของคุณให้เป็นปลั๊กอินที่เป็นกลุ่มแรกของฉัน: WindowSwap.vim ฉันเชื่อมโยงคำถามนี้และคำตอบของคุณใน README: D
WES

ฉันใส่คำตอบของ sgriffin ลงใน. vimrc ของฉันเมื่อไม่กี่ปีที่ผ่านมาและฉันกำลังทำความสะอาดและตัดสินใจที่จะย้ายมันทั้งหมดไปยังปลั๊กอิน ฉันทำการแยกและเพื่อทดสอบว่ามันยังคงทำงานเป็นกลุ่มฉันแยกหน้าต่างหลาย ๆ ครั้งและวิ่ง0r!figlet one[สองสาม ฯลฯ ] จากนั้นทดสอบออก ก่อนที่จะไปต่อฉันตรวจสอบ Github พบปลั๊กอิน (wes ') ของคุณพร้อมสลับหน้าต่าง figlet เคลื่อนไหวและลิงก์ไปยังคำตอบเดียวกันนี้ (ซึ่งฉันมีความคิดเห็นใน. vimrc ของฉัน) ฉันรู้สึกว่าฉันได้สร้างและอัปโหลดแล้วและลืมมันไป อย่างไรก็ตามงานดี! ช่วยฉันทำงานบางอย่าง :)
แกรี่ Fixler

293

เริ่มต้นด้วยสิ่งนี้:

____________________
| one       | two  |
|           |      |
|           |______|
|           | three|
|           |      |
|___________|______|

ยี่ห้อ 'สาม' หน้าต่างที่ใช้งานแล้วออกคำสั่ง+ctrl w Jสิ่งนี้จะย้ายหน้าต่างปัจจุบันเพื่อเติมด้านล่างของหน้าจอทำให้คุณมี:

____________________
| one       | two  |
|           |      |
|___________|______|
| three            |
|                  |
|__________________|

ตอนนี้ทำอย่างใดอย่างหนึ่ง 'หรือ 'สอง' หน้าต่างที่ใช้งานแล้วออกคำสั่ง+ctrl w rหน้าต่างนี้จะ 'หมุน' ในแถวปัจจุบันทำให้คุณมี:

____________________
| two       | one  |
|           |      |
|___________|______|
| three            |
|                  |
|__________________|

ตอนนี้ทำให้ 'สอง' ที่หน้าต่างที่ใช้งานและออกคำสั่ง+ctrl w Hสิ่งนี้จะย้ายหน้าต่างปัจจุบันเพื่อเติมด้านซ้ายของหน้าจอทำให้คุณ:

____________________
| two       | one  |
|           |      |
|           |______|
|           | three|
|           |      |
|___________|______|

อย่างที่คุณเห็น Manouevre นั้นค่อนข้างจะสับเปลี่ยน ด้วยหน้าต่าง 3 บานมันเหมือนกับเป็นหนึ่งในเกมไขปริศนา ฉันไม่แนะนำและลองใช้สิ่งนี้หากคุณมีหน้าต่าง 4 บานขึ้นไป - คุณควรปิดหน้าต่างเหล่านั้นดีกว่าแล้วเปิดหน้าต่างเหล่านั้นอีกครั้งในตำแหน่งที่ต้องการ

ฉันทำ screencast แสดงให้เห็นถึงวิธีการทำงานกับ Windows แยกในกลุ่ม


2
คุณไปถึงไมล์พิเศษที่สร้าง screencast, nelstrom แต่มันไม่ใช่สิ่งที่ฉันกำลังมองหา ฉันสามารถทำงานกับ splits กับคำสั่งการเคลื่อนไหวพื้นฐานได้ แต่สิ่งที่ฉันอยากรู้คือถ้ามีวิธีในการสลับตำแหน่งแยกในรูปแบบของความซับซ้อนตามอำเภอใจ
WES

95
สำหรับคนที่ชอบฉันแค่ต้องการเรียนรู้วิธีสลับหน้าต่างสองบาน: ctrl-w rทำงานเหมือนมีเสน่ห์ ขอบคุณสำหรับเคล็ดลับ! นี่คือ +1 ของฉัน
ereOn

ฉันยกระดับทั้ง\mw/ \pwและอันนี้และลองใช้ทั้งสองเป็นเวลาหนึ่งสัปดาห์ ฉันพบว่าการใช้โซลูชัน "ดั้งเดิม" นี้ทำงานได้ดีที่สุดเนื่องจากฉันไม่จำเป็นต้องติดตั้งปลั๊กอินข้ามการติดตั้งโหลสิบสิบครั้งที่ฉันมีบนเซิร์ฟเวอร์และเครื่องระยะไกลและเดสก์ท็อปแล็ปท็อปแท็บเล็ตและอุปกรณ์อื่น ๆ ทั้งหมด IOW การเรียนรู้คำสั่งภาษาพื้นเมืองเหล่านี้ (เช่นctrl-w r) เป็นสิ่งที่คุณต้องทำกับกล้ามเนื้อความจำและต้องทำ
eduncan911

96

ลองดูที่และ:h ctrl-w_ctrl-x / หรือ :h ctrl-w_ctrl-rคำสั่งเหล่านี้ช่วยให้คุณสามารถแลกเปลี่ยนหรือหมุน windows ในเค้าโครงปัจจุบัน

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


30

แรนดี้ถูกต้องซึ่งCTRL-W xไม่ต้องการสลับหน้าต่างที่ไม่ได้อยู่ในคอลัมน์ / แถวเดียวกัน

ฉันพบว่าCTRL-W HJKLกุญแจมีประโยชน์มากที่สุดเมื่อจัดการหน้าต่าง พวกเขาจะบังคับให้หน้าต่างปัจจุบันของคุณออกจากตำแหน่งปัจจุบันและบอกให้ใช้ขอบทั้งหมดที่ระบุโดยทิศทางของปุ่มที่คุณกด ดู:help window-movingรายละเอียดเพิ่มเติมได้ที่

สำหรับตัวอย่างข้างต้นหากคุณเริ่มต้นในหน้าต่าง "หนึ่ง" สิ่งนี้จะเป็นสิ่งที่คุณต้องการ:

CTRL-W K   # moves window "one" to be topmost,
           #   stacking "one", "two", "three" top to bottom
CTRL-W j   # moves cursor to window "two"
CTRL-W H   # moves window "two" to be leftmost,
           #   leaving "one" and "three" split at right

เพื่อความสะดวกคุณสามารถกำหนดลำดับที่คุณต้องใช้ในการจับคู่คีย์ (ดู:help mapping)


10

ฉันมีรุ่นที่ได้รับการปรับปรุงเล็กน้อยจากโซลูชันของ sgriffin คุณสามารถสลับหน้าต่างได้โดยไม่ต้องใช้สองคำสั่ง แต่ด้วยคำสั่ง HJKL ที่ใช้งานง่าย

ดังนั้นนี่คือวิธีการ:

function! MarkWindowSwap()
    " marked window number
    let g:markedWinNum = winnr()
    let g:markedBufNum = bufnr("%")
endfunction

function! DoWindowSwap()
    let curWinNum = winnr()
    let curBufNum = bufnr("%")
    " Switch focus to marked window
    exe g:markedWinNum . "wincmd w"

    " Load current buffer on marked window
    exe 'hide buf' curBufNum

    " Switch focus to current window
    exe curWinNum . "wincmd w"

    " Load marked buffer on current window
    exe 'hide buf' g:markedBufNum
endfunction

nnoremap H :call MarkWindowSwap()<CR> <C-w>h :call DoWindowSwap()<CR>
nnoremap J :call MarkWindowSwap()<CR> <C-w>j :call DoWindowSwap()<CR>
nnoremap K :call MarkWindowSwap()<CR> <C-w>k :call DoWindowSwap()<CR>
nnoremap L :call MarkWindowSwap()<CR> <C-w>l :call DoWindowSwap()<CR>

ลองย้ายหน้าต่างของคุณโดยใช้ capital HJKL ในโหนดปกติมันเจ๋งจริงๆ :)


3

สร้างคำตอบที่ @ sgriffin อย่างหนักนี่คือบางสิ่งที่ใกล้เคียงกับสิ่งที่คุณขอ:

function! MarkWindow()
        let g:markedWinNum = winnr()
endfunction

function! SwapBufferWithMarkedWindow()
        " Capture current window and buffer
        let curWinNum = winnr()
        let curBufNum = bufnr("%")

        " Switch to marked window, mark buffer, and open current buffer
        execute g:markedWinNum . "wincmd w"
        let markedBufNum = bufnr("%")
        execute "hide buf" curBufNum

        " Switch back to current window and open marked buffer
        execute curWinNum . "wincmd w"
        execute "hide buf" markedBufNum
endfunction

function! CloseMarkedWindow()
        " Capture current window
        let curWinNum = winnr()

        " Switch to marked window and close it, then switch back to current window
        execute g:markedWinNum . "wincmd w"
        execute "hide close"
        execute "wincmd p"
endfunction

function! MoveWindowLeft()
        call MarkWindow()
        execute "wincmd h"
        if winnr() == g:markedWinNum
                execute "wincmd H"
        else
                let g:markedWinNum += 1
                execute "wincmd s"
                execute g:markedWinNum . "wincmd w"
                execute "wincmd h"
                call SwapBufferWithMarkedWindow()
                call CloseMarkedWindow()
        endif
endfunction

function! MoveWindowDown()
        call MarkWindow()
        execute "wincmd j"
        if winnr() == g:markedWinNum
                execute "wincmd J"
        else
                execute "wincmd v"
                execute g:markedWinNum . "wincmd w"
                execute "wincmd j"
                call SwapBufferWithMarkedWindow()
                call CloseMarkedWindow()
        endif
endfunction

function! MoveWindowUp()
        call MarkWindow()
        execute "wincmd k"
        if winnr() == g:markedWinNum
                execute "wincmd K"
        else
                let g:markedWinNum += 1
                execute "wincmd v"
                execute g:markedWinNum . "wincmd w"
                execute "wincmd k"
                call SwapBufferWithMarkedWindow()
                call CloseMarkedWindow()
        endif
endfunction

function! MoveWindowRight()
        call MarkWindow()
        execute "wincmd l"
        if winnr() == g:markedWinNum
                execute "wincmd L"
        else
                execute "wincmd s"
                execute g:markedWinNum . "wincmd w"
                execute "wincmd l"
                call SwapBufferWithMarkedWindow()
                call CloseMarkedWindow()
        endif
endfunction

nnoremap <silent> <Leader>wm :call MarkWindow()<CR>
nnoremap <silent> <Leader>ws :call SwapBufferWithMarkedWindow()<CR>
nnoremap <silent> <Leader>wh :call MoveWindowLeft()<CR>
nnoremap <silent> <Leader>wj :call MoveWindowDown()<CR>
nnoremap <silent> <Leader>wk :call MoveWindowUp()<CR>
nnoremap <silent> <Leader>wl :call MoveWindowRight()<CR>

โปรดแจ้งให้เราทราบหากพฤติกรรมไม่ตรงกับความคาดหวังของคุณ


2

ขึ้นอยู่กับโซลูชันของ sgriffin ไปที่หน้าต่างที่คุณต้องการสลับกดCTRL-w mไปที่หน้าต่างที่คุณต้องการสลับด้วยแล้วกดCTRL-w mอีกครั้ง

CTRL-w m เป็นตัวเลือกช่วยในการจำที่ไม่ดีดังนั้นหากใครก็ตามที่มีตัวเลือกที่ดีขึ้นโปรดแก้ไขสิ่งนี้

นอกจากนี้ฉันต้องการรับข้อเสนอแนะจากสคริปต์ aka "หน้าต่างที่ทำเครื่องหมายโปรดทำซ้ำตามเป้าหมาย" แต่เป็น vimscript noob ฉันไม่ทราบวิธีการทำเช่นนั้น

ทุกอย่างที่กล่าวว่าสคริปต์ทำงานได้ดีเหมือนที่เป็นอยู่

" <CTRL>-w m : mark first window
" <CTRL>-w m : swap with that window
let s:markedWinNum = -1

function! MarkWindowSwap()
    let s:markedWinNum = winnr()
endfunction

function! DoWindowSwap()
    "Mark destination
    let curNum = winnr()
    let curBuf = bufnr( "%" )
    exe s:markedWinNum . "wincmd w"
    "Switch to source and shuffle dest->source
    let markedBuf = bufnr( "%" )
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' curBuf
    "Switch to dest and shuffle source->dest
    exe curNum . "wincmd w"
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' markedBuf
endfunction

function! WindowSwapping()
    if s:markedWinNum == -1
        call MarkWindowSwap()
    else
        call DoWindowSwap()
        let s:markedWinNum = -1
    endif
endfunction

nnoremap <C-w>m :call WindowSwapping()<CR>

1

วิธีการต่อไปนี้อาจจะสะดวกถ้าฟังก์ชั่นไม่สามารถใช้ได้ด้วยเหตุผลบางอย่าง (เพราะมันไม่ใช่เสียงเรียกเข้าของคุณ)

ใช้:buffersคำสั่งเพื่อค้นหา id ของบัฟเฟอร์แบบเปิดนำทางไปยังหน้าต่างที่ต้องการและใช้คำสั่งเช่น:b 5เพื่อเปิดบัฟเฟอร์ (หมายเลขบัฟเฟอร์ 5 ในกรณีนี้) ทำซ้ำสองครั้งและเนื้อหาของหน้าต่างจะถูกสลับ

ฉัน "คิดค้น" วิธีนี้หลังจากพยายามหลายครั้งเพื่อจดจำctrl-w-somethingลำดับแม้สำหรับเค้าโครงที่ง่ายมากเช่นหนึ่งในสองในสามของคำถามเดิม


1

เย็นจริงๆ แต่ข้อเสนอของฉันสำหรับการทำแผนที่คือการใช้ ^ W ^ J แทน J (เพราะทุก HJKL แล้วมีความหมาย) แถมยังดึงฉันในบัฟเฟอร์ใหม่เพราะตามเวลาที่คุณต้องการที่จะแลกเปลี่ยนรอบ ๆ ตัวคุณ อาจไม่ต้องการแก้ไขบัฟเฟอร์ที่คุณเปิดอยู่ ไปที่นี่:

function! MarkSwapAway()
    " marked window number
    let g:markedOldWinNum = winnr()
    let g:markedOldBufNum = bufnr("%")
endfunction
function! DoWindowToss()
    let newWinNum = winnr()
    let newBufNum = bufnr("%")
    " Switch focus to marked window
    exe g:markedOldWinNum . "wincmd w"
    " Load current buffer on marked window
    exe 'hide buf' newBufNum
    " Switch focus to current window
    exe newWinNum . "wincmd w"
    " Load marked buffer on current window
    exe 'hide buf' g:markedOldBufNum
    " …and come back to the new one
    exe g:markedOldWinNum . "wincmd w"
endfunction
nnoremap <C-w><C-h> :call MarkSwapAway()<CR> <C-w>h :call DoWindowToss()<CR>
nnoremap <C-w><C-j> :call MarkSwapAway()<CR> <C-w>j :call DoWindowToss()<CR>
nnoremap <C-w><C-k> :call MarkSwapAway()<CR> <C-w>k :call DoWindowToss()<CR>
nnoremap <C-w><C-l> :call MarkSwapAway()<CR> <C-w>l :call DoWindowToss()<CR>

1

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

สารละลาย

ดังนั้นฉันจึงเพิ่มโค้ดพิเศษเพื่อปิดหน้าต่างเหล่านี้ทั้งหมดก่อนที่จะทำการสลับ

exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'

รหัสทั้งหมดดูเหมือนว่า;

" Making swapping windows easy
function! SwapWindowBuffers()
    exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
    if !exists("g:markedWinNum")
        " set window marked for swap
        let g:markedWinNum = winnr()
        :echo "window marked for swap"
    else
        " mark destination
        let curNum = winnr()
        let curBuf = bufnr( "%" )
        if g:markedWinNum == curNum
            :echo "window unmarked for swap"
        else
            exe g:markedWinNum . "wincmd w"
            " switch to source and shuffle dest->source
            let markedBuf = bufnr( "%" )
            " hide and open so that we aren't prompted and keep history
            exe 'hide buf' curBuf
            " switch to dest and shuffle source->dest
            exe curNum . "wincmd w"
            " hide and open so that we aren't prompted and keep history
            exe 'hide buf' markedBuf
            :echo "windows swapped"
        endif
        " unset window marked for swap
        unlet g:markedWinNum
    endif
endfunction

nmap <silent> <leader>mw :call SwapWindowBuffers()<CR>

เครดิตสำหรับฟังก์ชั่นการแลกเปลี่ยนกับBrandon Orther

ทำไมถึงมีความจำเป็น

เหตุผลที่ฟังก์ชั่นการสลับไม่ทำงานอย่างถูกต้องโดยไม่ต้องลบหน้าต่าง QuickFix (QF) และ LocationList (LL) ทั้งหมดเสียก่อนเนื่องจากถ้าพาเรนต์ของบัฟเฟอร์ QF / LL บัฟเฟอร์ของ get ซ่อนอยู่ (และไม่มีที่ไหนปรากฏในหน้าต่าง), QF / LL หน้าต่างคู่กับมันถูกเอาออก นี่ไม่ใช่ปัญหาในตัวเอง แต่เมื่อหน้าต่างซ่อนหมายเลขหน้าต่างทั้งหมดถูกกำหนดใหม่และการแลกเปลี่ยนจะถูกทำให้ยุ่งเหยิงเนื่องจากหมายเลขที่บันทึกไว้ของหน้าต่างที่ทำเครื่องหมายไว้ครั้งแรกนั้นไม่มี (อาจเกิดขึ้น) อีกต่อไป

หากต้องการวางสิ่งที่ไม่คาดคิดนี้:

เครื่องหมายหน้าต่างแรก

____________________
| one              | -> winnr = 1    marked first    g:markedWinNum=1
|                  | -> bufnr = 1
|__________________|
| two (QF window   | -> winnr = 2
| coupled to one   |
|__________________|
| three            | -> winnr = 3
|                  | -> bufnr = 2
|__________________|

เครื่องหมายหน้าต่างที่สอง

____________________
| one              | -> winnr = 1                    g:markedWinNum=1
|                  | -> bufnr = 1
|__________________|
| two (QF window   | -> winnr = 2
| coupled to one)  |
|__________________|
| three            | -> winnr = 3    marked second    curNum=3
|                  | -> bufnr = 2                     curBuf=2
|__________________|

บัฟเฟอร์สวิตช์แรกหน้าต่างหนึ่งจะเต็มไปด้วยบัฟเฟอร์ของหน้าต่างสาม ดังนั้นหน้าต่าง QF จะถูกลบออกเนื่องจากไม่มีหน้าต่างหลักอีกต่อไป สิ่งนี้จะจัดเรียงหมายเลขหน้าต่างใหม่ โปรดทราบว่า curNum (หมายเลขของหน้าต่างที่เลือกอย่างที่สอง) กำลังชี้ไปที่หน้าต่างที่ไม่มีอยู่อีกต่อไป

____________________
| three            | -> winnr = 1                    g:markedWinNum=1
|                  | -> bufnr = 2
|__________________|
| three            | -> winnr = 2                     curNum=3
|                  | -> bufnr = 2                     curBuf=2
|__________________|

ดังนั้นเมื่อสลับบัฟเฟอร์ที่สองมันจะพยายามเลือกหน้าต่าง curNum ซึ่งไม่มีอยู่อีกต่อไป ดังนั้นมันจะสร้างและสลับบัฟเฟอร์ส่งผลให้หน้าต่างที่ไม่ต้องการเปิดอยู่

____________________
| three            | -> winnr = 1                    g:markedWinNum=1
|                  | -> bufnr = 2
|__________________|
| three            | -> winnr = 2
|                  | -> bufnr = 2
|__________________|
| one              | -> winnr = 3                     curNum=3
|                  | -> bufnr = 1                     curBuf=2
|__________________|

0

mark-window-then-swap-buffer ที่คล้ายกัน แต่ยังช่วยให้คุณใช้การแลกเปลี่ยนครั้งสุดท้าย

function! MarkWindowSwap()
    unlet! g:markedWin1
    unlet! g:markedWin2
    let g:markedWin1 = winnr()
endfunction

function! DoWindowSwap()
    if exists('g:markedWin1')
        if !exists('g:markedWin2')
            let g:markedWin2 = winnr()
        endif
        let l:curWin = winnr()
        let l:bufWin1 = winbufnr(g:markedWin1)
        let l:bufWin2 = winbufnr(g:markedWin2)
        exec g:markedWin2 . 'wincmd w'
        exec ':b '.l:bufWin1
        exec g:markedWin1 . 'wincmd w'
        exec ':b '.l:bufWin2
        exec l:curWin . 'wincmd w'
    endif
endfunction

nnoremap ,v :call DoWindowSwap()<CR>
nnoremap ,z :call MarkWindowSwap()<CR>

เนื่องจากฉันมีไฟล์set hidden. vimrc อยู่แล้วจึงไม่จำเป็นต้องซ่อนบัฟเฟอร์ด้วยตนเอง
qeatzy

-5

คุณสามารถใช้ตัวจัดการหน้าต่างแบบเรียงต่อกันเช่น X-monad


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