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

mdr*_*iel 119 vim editing

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

DrA*_*rAl 293

内置了一些有用的命令可以为您提供一定程度的控制,但它并不全面.主要是:

  • Ctrl- W,r(即按住CTRL,按下W,释放CTRL,按下r) - 旋转窗口(第一个窗口成为第二个窗口,第二个窗口成为第三个窗口,等等)

  • Ctrl- W,x- 将当前窗口与下一个窗口交换

  • Ctrl- W,Shift- H- 将此窗口移动到最左侧

  • Ctrl- W,Shift- K- 将此窗口移至顶部

(和Ctrl- W,Shift- JCtrl- W,Shift- 类似L).看到:

:help window-moving
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息.

  • 这应该是"最佳答案" - 本机功能,而不是自定义Vimscript. (16认同)
  • 不完全,不。有很多用例不能使用内置的窗口管理来完成而不破坏和重新创建窗口。交换缓冲区脚本允许这些用例。 (2认同)

hcs*_*s42 7

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

这定义了以下快捷方式:

  • <c-w>y:"Yanks the window",即将当前窗口中缓冲区的编号存储在全局变量中.
  • <c-w>pp:"将窗口置于当前窗口的位置",即它读取先前存储的缓冲区编号,并在当前窗口中打开该缓冲区.它还存储以前在当前窗口中的缓冲区的数量.

如果通过"在某些地方交换窗口",则表示"在窗口B中打开窗口A中的缓冲区,反之亦然,而不更改窗口的位置",您可以使用以下键盘序列来交换窗口:

  1. 选择窗口A(使用鼠标或键盘命令)
  2. <c-w>y(缓冲缓冲区编号)
  3. 选择窗口B.
  4. <c-w>pp(粘贴缓冲区)
  5. 选择窗口A.
  6. <c-w>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
Run Code Online (Sandbox Code Playgroud)


小智 7

在我看来,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 将当前窗口移至最右侧

  • 添加一个没有给帖子带来新的有用信息的答案的原因是什么?这个问题在6年前就得到了完美的回答。你们在为 vimcast 做广告活动吗? (3认同)
  • @mdrozdziel 在 OP 9 年后我很欣赏这个答案。最简洁的答案,只有我想要的信息。 (3认同)