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

时间:2010-02-09 10:37:05

标签: vim editing

当我使用VIM时,我总是可以看到多个窗口。有时我想有一个简单的方法,在那些地方交换那些窗户。有没有插件,宏等,使这更容易?顺便说一句,我使用MiniBufExplorer。

5 个答案:

答案 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,反之亦然,而不改变窗口的位置 “,您可以使用以下键盘序列来交换窗口:

  1. 选择窗口A(使用鼠标或键盘命令)
  2. <c-w>y(缓冲缓冲区编号)
  3. 选择窗口B
  4. <c-w>pp(粘贴缓冲区)
  5. 选择窗口A
  6. <c-w>pp(再次粘贴缓冲区)
  7. 仅适用于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,您只需

  1. <Leader>yw拉开一扇窗户。
  2. 将光标移动到另一个窗口。
  3. <Leader>pw粘贴该窗口,将其与位置交换 第一个。
  4. 按键组合当然可根据您的喜好进行配置。

答案 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将当前窗口移至最右侧