Как мне поменять местами два открытых файла (в разделениях) в vim? - PullRequest
296 голосов
/ 06 апреля 2010

Предположим, у меня есть произвольная схема разбиения в vim.

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

Есть ли способ поменять местами one и two и сохранить тот же макет?В этом примере все просто, но я ищу решение, которое поможет для более сложных макетов.

ОБНОВЛЕНИЕ:

Думаю, мне нужно быть более ясным.Мой предыдущий пример был упрощением реального варианта использования.С действительным экземпляром: alt text

Как я могу поменять местами любые два из этих разбиений, сохраняя тот же макет?

Обновить!Спустя 3 года ...

Я поместил решение sgriffin в плагин Vim, который вы можете легко установить!Установите его с вашим любимым менеджером плагинов и попробуйте: WindowSwap.vim

a little demo

Ответы [ 12 ]

0 голосов
/ 14 июля 2016

Подобный подход 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>
0 голосов
/ 24 апреля 2013

Вы также можете использовать менеджер окон, например X-monad

...