如何在vim中翻转窗口?

149

切换缓冲区?还是窗口 - johnsyweb
1
@Johnsyweb 切换缓冲区,旋转窗口。但我搞定了... - Arnis Lapsa
4个回答

299

如果您将它们垂直分割,使用C-wJ可以将一个窗口移动到底部

如果您将它们水平分割,使用C-wL可以将一个窗口向右移动

要在拆分窗口的“列”或“行”中进行旋转,使用C-wC-r

以下命令可用于更改窗口布局。例如,在有两个垂直分割的窗口中,CTRL-W K会将其更改为水平分割窗口。CTRL-W H则反之。


13
我终于开始“感觉”了。不可思议,我在没有这些指令的情况下存活了这么久。 - Arnis Lapsa
23
旋转分割窗口,我认为只需要使用“C-w r”,而不是“C-w C-r”。 - Tom Lord
4
@TomLord 这也可以。尽管这并不需要“更少”,只是不同而已。而且我认为“C-w r”有点笨拙(特别是重复使用时)。 - sehe
1
@AmagicalFishy 这只是带有光标键助记符的 wincmd:http://vimdoc.sourceforge.net/htmldoc/windows.html#:wincmd - sehe
无法正确处理打开4个窗口的情况 - 它不会像垂直或水平翻转窗口一样,而是将窗口推到另一个方向的单独级别。对于2个窗口,“C-w x”就足够了。 - arcseldon
阅读 :help CTRL-W_K 帮助我在阅读键绑定的描述后记住了这些键绑定的作用。 - Dylan Landry

104

按下Ctrl-w H或输入:wincmd H,可以从水平布局转换为垂直布局

按下Ctrl-w J或输入:wincmd J,可以从垂直布局转换为水平布局

按下Ctrl-w r或输入:wincmd r,可以交换两个缓冲区但保持窗口布局不变。

按下Ctrl-w w或输入:wincmd w,可以在两个窗口/缓冲区之间移动光标

您可能希望绑定其中一个或多个序列,以使输入更快。我将其放入我的.vimrc文件中,这样,l就可以将光标移到当前选项卡中的下一个缓冲区。

let mapleader = ","
nmap <Leader>l <C-w>w

1
@Nick 前两个回答了问题,后两个则超出了预期,非常有用!“交换”函数对我来说特别有用,因为在翻译文件时,我更喜欢将源语言始终放在特定的一侧,而我并不总是按照相同的顺序打开它们 :) - Jonathan Komar
2
Ctrl-w r 是最好的! - gabe
非常尊重您展示了正确重新映射的实际命令。 - Martin Braun

18

CTRL-W SHIFT-H将旋转窗口方向,CTRL-W H将移动到左侧窗口,CTRL-W L将移动到右侧窗口,请参见:

:help split

:help ^w

获取更多信息。


那个是用于切换缓冲区的。如何改变窗口的方向? - Arnis Lapsa
1
@Arnis ^wH 会改变窗口布局的方向。^wh 可以移动到左边的窗口。这些操作区分大小写。 - William Pursell
太棒了!我喜欢它 <C-w>H 和 <C-w>L - Developer

10

如果您只打开两个窗口,则当前的回答都非常有效。如果您打开的窗口超过两个,则移动窗口的逻辑可能会变得复杂。

我在我的 .vimrc 文件中使用以下内容,可以让我将一个缓冲区“复制”或“删除”,然后将其粘贴到当前缓冲区上方的窗口或作为[v]split分屏窗口。

fu! PasteWindow(direction) "{{{
    if exists("g:yanked_buffer")
        if a:direction == 'edit'
            let temp_buffer = bufnr('%')
        endif

        exec a:direction . " +buffer" . g:yanked_buffer

        if a:direction == 'edit'
            let g:yanked_buffer = temp_buffer
        endif
    endif
endf "}}}

"yank/paste buffers
:nmap <silent> <leader>wy  :let g:yanked_buffer=bufnr('%')<cr>
:nmap <silent> <leader>wd  :let g:yanked_buffer=bufnr('%')<cr>:q<cr>
:nmap <silent> <leader>wp :call PasteWindow('edit')<cr>
:nmap <silent> <leader>ws :call PasteWindow('split')<cr>
:nmap <silent> <leader>wv :call PasteWindow('vsplit')<cr>
:nmap <silent> <leader>wt :call PasteWindow('tabnew')<cr>

不确定你的函数是如何工作的 - 可以添加一个简单的可视化示例。 - serup
1
这太棒了。比C-W J和其他命令好多了。我会用<leader>wP扩展到top split,并用<leader>wV扩展到:set nosplitright \| call PasteWindow('vsplit') \| set splitright<cr>。而且<leader>wr<leader>we更有意义('replace')。 - zelk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接