当我使用VIM时,我总是可以看到多个窗口。有时我想有一个简单的方法,在那些地方交换那些窗户。有没有插件,宏等,使这更容易?顺便说一句,我使用MiniBufExplorer。
答案 0 :(得分:284)
内置了一些有用的命令可以给你一定程度的控制,但它并不全面。主要是:
Ctrl - W , r (即按住 CTRL ,按 W < / kbd>,释放 CTRL ,按 r ) - 旋转窗口(第一个窗口成为第二个窗口,第二个窗口成为第三个窗口,等等)< / p>
Ctrl - W , x - 将当前窗口与下一个窗口交换
Ctrl - W , Shift - H - 将此窗口移至最左侧< / p>
Ctrl - W , Shift - K - 将此窗口移至顶部
(类似于 Ctrl - W , Shift - J 和 Ctrl - W , Shift - L )。参见:
:help window-moving
了解更多信息。
答案 1 :(得分:6)
我写了并在我的vimrc中使用了以下代码片段 复制粘贴我的Vim窗口。
这定义了以下快捷方式:
<c-w>y
:“拉开窗口”,即存储缓冲区的编号
全局变量中的当前窗口。<c-w>pp
:“将窗口置于当前窗口的位置”,即它读取
先前存储的缓冲区编号,并在当前窗口中打开该缓冲区。
它还存储过去在当前的缓冲区的数量
窗口。如果通过“将这些窗口交换到位”,则表示“打开缓冲区” 窗口B中的窗口A,反之亦然,而不改变窗口的位置 “,您可以使用以下键盘序列来交换窗口:
<c-w>y
(缓冲缓冲区编号)<c-w>pp
(粘贴缓冲区)<c-w>pp
(再次粘贴缓冲区)仅适用于Vim&gt; = 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
答案 2 :(得分:3)
我在同一时间问similar question:我想要一种专门交换窗口而不改变任意复杂布局的方法。我最终用一个建议的解决方案制作了一个vim插件。它被称为WindowSwap.vim;使用您首选的vim插件管理器安装它并给它一个旋转。
使用WindowSwap.vim,您只需
<Leader>yw
拉开一扇窗户。 <Leader>pw
粘贴该窗口,将其与位置交换
第一个。按键组合当然可根据您的喜好进行配置。
答案 3 :(得分:1)
由于<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>
答案 4 :(得分:1)
在我看来,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
将当前窗口移至最右侧