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


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

5 111

5 ответов:

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

  • Ctrl-W, r (то есть удерживайте CTRL , Нажмите W, отпустите CTRL , Нажмите r ) - который вращает окна (первое окно становится вторым, второе-третьим и т. д.)

  • Ctrl-W, x - поменять текущее окно местами с следующий

  • Ctrl-W, сдвиг-H - переместите это окно в крайний левый угол

  • Ctrl-W, сдвиг-K - переместить это окно наверх

(и аналогично для Ctrl-W, сдвиг-J и Ctrl-W, сдвиг-L ). Смотрите:

:help window-moving

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

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

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

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

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

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

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

С Помощью WindowSwap.ВИМ, ты бы Просто

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

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

As <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>