如何在VIM中的窗口之间交换文件?

当我使用VIM时,我总是可以看到多个窗口。 有时候我想要一个简单的方法,把这些窗口换成地方。 有没有任何插件,macros等,使这更容易? 顺便说一下,我使用MiniBufExplorer。

有一些有用的命令可以给你一些控制,但并不全面。 主要的是:

  • CtrlWr (即按住CTRL ,按下W ,释放CTRL ,按r ) – 旋转窗口(第一个窗口变成第二个,第二个变成第三个,等等)

  • CtrlWx – 将当前窗口与下一个窗口交换

  • CtrlWShiftH – 将此窗口移至最左端

  • CtrlWShiftK – 将此窗口移动到顶部

(对于CtrlWShiftJCtrlWShiftL也是类似的)。 看到:

:help window-moving 

了解更多信息。

我写了,并一直在我的vimrc中使用下面的代码片段来复制粘贴我的Vim窗口。

这例如定义了以下快捷方式:

  • <cw>y :“Yanks the window”,即将当前窗口中缓冲区的编号存储在一个全局variables中。
  • <cw>pp :“将窗口放在当前窗口的位置”,即它读取之前存储的缓冲区号,并在当前窗口中打开该缓冲区。 它还存储了当前窗口中使用的缓冲区的编号。

如果通过“交换这些窗口的位置”,意思是“在窗口B中打开窗口A中的缓冲区,反之亦然,而不改变窗口的位置”,可以使用以下键盘序列交换窗口:

  1. select窗口A(使用鼠标或使用键盘命令)
  2. <cw>y (取消缓冲区编号)
  3. select窗口B.
  4. <cw>pp (粘贴缓冲区)
  5. select窗口A
  6. <cw>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! \<cw>\<cw>" 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 <cw>d :call HDeleteWindow()<cr> noremap <cw>y :call HYankWindow()<cr> noremap <cw>p<up> :call HPasteWindow('up')<cr> noremap <cw>p<down> :call HPasteWindow('down')<cr> noremap <cw>p<left> :call HPasteWindow('left')<cr> noremap <cw>p<right> :call HPasteWindow('right')<cr> noremap <cw>pk :call HPasteWindow('up')<cr> noremap <cw>pj :call HPasteWindow('down')<cr> noremap <cw>ph :call HPasteWindow('left')<cr> noremap <cw>pl :call HPasteWindow('right')<cr> noremap <cw>pp :call HPasteWindow('here')<cr> noremap <cw>P :call HPasteWindow('here')<cr> endif 

我在同一时间问了一个类似的问题 :我想要一种专门交换窗口的方法,而不用改变任何复杂的布局。 最后,我提出了一个解决scheme的vim插件。 它被称为WindowSwap.vim ; 安装它与您首选的vim插件pipe理器,并给它一个旋风。

有了WindowSwap.vim,你只需要

  1. <Leader>yw打开窗户。
  2. 将光标移到另一个窗口。
  3. 粘贴该窗口,将其replace为第一个窗口的位置。

按键组合当然可以根据您的喜好进行configuration。

正如<cw>r<cw>x有一个限制,您不能旋转或交换窗口时混合垂直和水平窗口分裂。 <cw>H可能会使窗口布局变得超出您的期望,尤其是当您有很多窗口时。

所以你可以做一些工作来满足你对窗口/缓冲区切换的特殊需求。 这是我的例子切换当前窗口左上方的窗口(通常我做垂直最大化):

 function! SwitchMainWindow() let l:current_buf = winbufnr(0) exe "buffer" . winbufnr(1) 1wincmd w exe "buffer" . l:current_buf endfunction nnoremap <cw><ce> :call SwitchMainWindow()<cr> 

在我看来, 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将当前窗口移动到最右端