当我使用 VIM 时,我总是可以看到多个窗口。有时候,我想有一个简单的方法,交换这些窗口的地方。有没有任何插件,宏等,使这更容易?顺便说一下,我用的是 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 窗口。
例如,它定义了以下捷径:
<c-w>y
<c-w>pp
如果“在某些地方交换这些窗口”的意思是“在 在窗口 B 中的窗口 A,反之亦然,而不改变 视窗」 ,可使用以下键盘序列交换视窗:
它只能在 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
由于 <c-w>r或 <c-w>x有一个限制,当垂直和水平窗口分割混合时,不能旋转或交换窗口。而且 <c-w>H可能会使窗口布局的变化超出您的预期,特别是当您有许多窗口时。
<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>
与此同时,我询问了一个 类似的问题: 我想要一种特别交换窗口的方法,而不需要改变任意复杂的布局。最后,我用其中一个建议的解决方案做了一个 vim 插件。它被称为 WindowSwap.vim; 安装它与您首选的 vim 插件管理器,并给它一个旋转。
使用 WindowSwap.vim,您可以简单地
<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 x
ctrl-w H
ctrl-w L