Как поменять файлы между окнами в VIM? - PullRequest
118 голосов
/ 09 февраля 2010

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

Ответы [ 5 ]

286 голосов
/ 09 февраля 2010

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

  • 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

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

6 голосов
/ 09 февраля 2010

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

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

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

Если под «заменой этих окон местами» вы подразумеваете «открытие буфера в окно A в окне B, и наоборот, без изменения положения 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
3 голосов
/ 12 декабря 2013

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

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

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

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

1 голос
/ 18 декабря 2015

На мой взгляд, 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 переместить текущее окно в крайнее правое положение
1 голос
/ 11 января 2013

Как <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>
...