如何在VIM中的窗口之间交换文件?
当我使用VIM时,我总是可以看到多个窗口。 有时候我想要一个简单的方法,把这些窗口换成地方。 有没有任何插件,macros等,使这更容易? 顺便说一下,我使用MiniBufExplorer。
有一些有用的命令可以给你一些控制,但并不全面。 主要的是:
-
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
了解更多信息。
我写了,并一直在我的vimrc中使用下面的代码片段来复制粘贴我的Vim窗口。
这例如定义了以下快捷方式:
-
<cw>y
:“Yanks the window”,即将当前窗口中缓冲区的编号存储在一个全局variables中。 -
<cw>pp
:“将窗口放在当前窗口的位置”,即它读取之前存储的缓冲区号,并在当前窗口中打开该缓冲区。 它还存储了当前窗口中使用的缓冲区的编号。
如果通过“交换这些窗口的位置”,意思是“在窗口B中打开窗口A中的缓冲区,反之亦然,而不改变窗口的位置”,可以使用以下键盘序列交换窗口:
- select窗口A(使用鼠标或使用键盘命令)
- 按
<cw>y
(取消缓冲区编号) - select窗口B.
- 按
<cw>pp
(粘贴缓冲区) - select窗口A
- 按
<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,你只需要
-
<Leader>yw
打开窗户。 - 将光标移到另一个窗口。
- 粘贴该窗口,将其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
将当前窗口移动到最右端