Как поменять местами файлы между окнами в VIM?
Когда я работаю с VIM, у меня всегда есть несколько видимых окон. Иногда я хотел бы иметь простой способ, чтобы поменять эти окна местами. Есть ли какой-нибудь плагин, макрос и т. д., Чтобы сделать это более легким? Кстати, я использую MiniBufExplorer.
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", вы можете использовать следующую последовательность клавиш для замены окон:
- выберите окно 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
Примерно в то же время я задал аналогичный вопрос: Мне нужен был способ поменять окна местами, не изменяя произвольно сложную компоновку. Я закончил тем, что сделал плагин vim из одного из предложенных решений. Это называется WindowSwap.vim; Установите его с помощью вашего предпочтительного менеджера плагинов vim и дайте ему крутиться.
С Помощью WindowSwap.ВИМ, ты бы Просто
Комбинации клавиш, конечно, настраиваются в соответствии с вашими предпочтениями.
<Leader>yw
чтобы выдернуть окно.- переместите курсор в другое окно.
<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>