Как поменять файлы между окнами в VIM?

Когда я работаю с VIM, я всегда вижу несколько окон. Иногда мне хотелось бы иметь простой способ, чтобы поменять местами эти окна. Есть ли плагин, макрос и т.д., Чтобы сделать это проще? Кстати, я использую MiniBufExplorer.

Ответ 1

Существует несколько полезных команд, в которых вы получаете определенное количество контроля, но оно не является полным. Основные из них:

  • 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

для получения дополнительной информации.

Ответ 2

Я написал и использовал следующий фрагмент кода в своем vimrc для скопируйте мои окна Vim.

Это определяет, например, следующие ярлыки:

  • <c-w>y: "Янки окно", т.е. хранит номер буфера в текущее окно в глобальной переменной.
  • <c-w>pp: "Заставляет окно в месте текущего окна", то есть читает буфер, сохраненный ранее, и открывает этот буфер в текущем окне. Он также сохраняет номер буфера, который раньше находился в текущем окно.

Если, "заменяя эти окна в местах", вы имеете в виду "открытие буфера в окна A в окне B и наоборот, не меняя положения windows ", вы можете использовать следующую последовательность клавиш для замены окон:

  • Выберите окно A (либо с помощью мыши, либо с помощью команд клавиатуры)
  • Нажмите <c-w>y (дергая номер буфера)
  • Выберите окно B
  • Нажмите <c-w>pp (вставка буфера)
  • Выберите окно A
  • Нажмите <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

Ответ 3

Я задал аналогичный вопрос примерно в то же время: мне нужен способ обмена окнами, не изменяя произвольно сложный макет. Я закончил создание плагина vim из одного из предложенных решений. Он называется WindowSwap.vim; установите его с помощью своего любимого менеджера плагинов vim и дайте ему завихрение.

С WindowSwap.vim вы просто

  1. <Leader>yw, чтобы вынуть окно.
  2. Переместите курсор в другое окно.
  3. <Leader>pw, чтобы вставить это окно, заменив его на позицию первый.

Комбинации клавиш, конечно, могут быть настроены на ваши предпочтения.

Ответ 4

Поскольку <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>

Ответ 5

По-моему, 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 переместить текущее окно в крайнее правое