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

如何在VIM中的windows之间交换文件?,vim,editing,Vim,Editing,当我使用VIM时,我总是可以看到多个窗口。有时我想有一个简单的方法,在某些地方交换这些窗口。是否有任何插件、宏等使这更容易?顺便说一句,我使用MiniBufExplorer。内置了一些有用的命令,可以为您提供一定程度的控制,但并不全面。主要有: Ctrl-W,r(即按住Ctrl键,按W键,松开Ctrl键,按r键)-旋转窗口(第一个窗口变为第二个窗口,第二个窗口变为第三个窗口,以此类推) Ctrl-W,x-将当前窗口与下一个窗口交换 Ctrl-W,Shift-H-将此窗口移到最左侧 Ctrl-W

当我使用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类似)。见:


更多信息。

我在vimrc中编写并使用了以下代码片段 复制粘贴我的Vim窗口

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

  • y
    :“猛拉窗口”,即将缓冲区的编号存储在 全局变量中的当前窗口
  • pp
    :“将窗口放在当前窗口的位置”,即它读取 以前存储的缓冲区编号,并在当前窗口中打开该缓冲区。 它还存储用于当前缓存的缓冲区编号 窗户
如果“在某些位置交换这些窗口”,您的意思是“在中打开缓冲区” 窗口A位于窗口B中,反之亦然,但不改变 windows”,您可以使用以下键盘顺序交换窗口:

  • 选择窗口A(使用鼠标或键盘命令)
  • y
    (拖动缓冲区编号)
  • 选择窗口B
  • pp
    (粘贴缓冲区)
  • 选择窗口A
  • 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! \<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
    
    如果版本>=700
    功能!霍本(董事,什么是公开的)
    让[type,name]=a:打开什么
    如果a:dir=='left'| | a:dir=='right'
    vsplit
    如果a:dir==“向上”| a:dir==“向下”
    分裂
    结束
    如果a:dir=='down'| a:dir=='right'
    执行“正常!”
    结束
    如果类型=='buffer'
    执行“缓冲区”。名称
    其他的
    exec“编辑”。名称
    结束
    端功能
    功能!HYankWindow()
    设g:window=winnr()
    设g:buffer=bufnr(“%”)
    设g:bufhidden=&bufhidden
    端功能
    功能!HDeleteWindow()
    调用HYankWindow()
    设置bufhidden=hide
    关闭
    端功能
    功能!HPASTE窗口(方向)
    让old_buffer=bufnr(“%”)
    调用HOpen(a:direction,['buffer',g:buffer])
    设g:buffer=old\u buffer
    let&bufhidden=g:bufhidden
    端功能
    noremap d:调用HDeleteWindow()
    noremap y:调用HYankWindow()
    noremap:调用HPASTEVOWN('up'))
    noremap:调用HPasteWindow('down')
    noremap:调用HPasteWindow('左')
    noremap:调用HPasteWindow('右')
    noremap pk:调用HPASTEVOWN('向上')
    noremap pj:调用HPASTEVOWN('down')
    noremap ph:调用HPASTEVOON('左')
    noremap pl:调用HPasteWindow('右')
    noremap pp:调用HPasteWindow('here')
    noremap:调用HPasteWindow('here')
    恩迪夫
    
    由于
    r
    x
    有一个限制,当垂直和水平窗口拆分混合时,您不能旋转或交换窗口。而
    H
    可能会使窗口布局发生超出预期的变化,尤其是当您有许多窗口时

    因此,您可以做一些工作来满足窗口/缓冲区切换的特殊需要。下面是一个用左上角窗口切换当前窗口的示例(通常我使其垂直最大化):

    函数!SwitchMainWindow()
    设l:current_buf=winbufnr(0)
    exe“缓冲区”。温布夫纳(1)
    1wincmd w
    exe“缓冲区”。l:目前的情况
    端功能
    nnoremap:调用SwitchMainWindow()
    
    大约在同一时间,我问了一个问题:我想要一种在不改变任意复杂布局的情况下专门交换窗口的方法。我最终用建议的解决方案之一制作了一个vim插件。它叫,;使用您首选的vim插件管理器安装它,并尝试一下

    使用WindowSwap.vim,您只需

  • yw
    拖动窗口
  • 将光标移动到另一个窗口
  • pw
    粘贴该窗口,将其与 第一个
  • 组合键当然可以根据您的喜好进行配置。

    在我看来,这是一个完美的答案。简言之:

    • ctrl-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
      将当前窗口移到最右侧

    通过“在位置上交换这些窗口”,您的意思是“打开窗口B中窗口A中的缓冲区,反之亦然,而不改变窗口的位置”?是的,这正是我想要的。这应该是“最佳答案”——本机功能,而不是自定义Vimscript。不完全,不可以。如果不销毁和重新创建窗口,使用内置窗口管理就无法完成许多用例。交换缓冲区脚本允许这些用例。请注意,ctl-w也可以工作。ctl-W将关闭一些终端模拟器中的窗口。为什么要添加一个没有给帖子带来新的有用信息的答案?这
    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
    
    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>