代码之家  ›  专栏  ›  技术社区  ›  mdrozdziel

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

  •  115
  • mdrozdziel  · 技术社区  · 15 年前

    当我使用vim时,我总是可以看到多个窗口。有时候我想有一个简单的方法,把那些窗户换个地方。有什么插件、宏等可以让这一切变得更容易吗?顺便说一下,我用Minibufexplorer。

    5 回复  |  直到 9 年前
        1
  •  280
  •   Holger Just    12 年前

    有一些有用的命令内置在其中,给您一定的控制量,但它并不全面。主要有:

    • Ctrl键 - W , R (即保持 CTRL ,按 ,发布 CTRL ,按 R )-旋转窗口(第一个窗口变成第二个窗口,第二个窗口变成第三个窗口,等等)

    • Ctrl键 - , X -将当前窗口与下一个窗口交换

    • Ctrl键 - W , 移位 - H -将此窗口移到最左边

    • Ctrl键 - , 换档 - K -将此窗口移到顶部

    (同样地 Ctrl键 - , 换档 - J Ctrl键 - , 换档 - L )见:

    :help window-moving
    

    更多信息。

        2
  •  6
  •   hcs42    15 年前

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

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

    • <c-w>y :“猛拉窗口”,即在 全局变量中的当前窗口。
    • <c-w>pp :“将窗口放在当前窗口的位置”,即它显示 以前存储的缓冲区编号,并在当前窗口中打开该缓冲区。 它还存储了当前 窗户。

    如果你说的“在某处交换那些窗口”,你的意思是“在 窗口A在窗口B中,反之亦然,不改变 窗口”,您可以使用以下键盘顺序交换窗口:

    1. 选择窗口A(使用鼠标或键盘命令)
    2. 出版社 <C-W>年 (猛拉缓冲区号码)
    3. 选择窗口B
    4. 出版社 <C-W>聚丙烯 (粘贴缓冲区)
    5. 选择窗口A
    6. 出版社 <C-W>聚丙烯 (再次粘贴缓冲区)

    它只在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
    
        3
  •  3
  •   Community CDub    8 年前

    我问了一个 similar question 几乎同时:我想要一种不改变任意复杂布局的方式来交换窗口。最后我用一个建议的解决方案制作了一个vim插件。它叫 WindowSwap.vim ;使用您首选的vim插件管理器安装它,并对其进行旋转。

    使用windowswap.vim,您只需

    1. <Leader>yw 猛拉窗户。
    2. 将光标移到另一个窗口。
    3. <Leader>pw 要粘贴该窗口,请将其与 第一个。

    当然,按键组合可以根据您的喜好进行配置。

        4
  •  2
  •   Aman Dogra    9 年前

    在我看来, 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 将当前窗口移到最右侧
        5
  •  1
  •   Bohr    12 年前

    AS <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>