在 Vim 中快速从垂直拆分切换到水平拆分
Posted
技术标签:
【中文标题】在 Vim 中快速从垂直拆分切换到水平拆分【英文标题】:To switch from vertical split to horizontal split fast in Vim 【发布时间】:2010-11-19 04:03:03 【问题描述】:如何在 Vim 中将当前窗口从水平拆分切换到垂直拆分,反之亦然?
我刚才不小心这样做了,但我再也找不到钥匙了。
【问题讨论】:
也许dwm.vim 插件会有点用 【参考方案1】:Vim mailing list 说(重新格式化以提高可读性):
改变两个垂直分割 水平分割窗口
Ctrl-w t Ctrl-w K
水平到垂直:
Ctrl-w t Ctrl-w H
解释:
Ctrl-w t 使第一个(左上角)窗口成为当前窗口
Ctrl-w K 将当前窗口移动到最顶部的全角
Ctrl-w H将当前窗口移动到最左边的全高
注意t是小写,K和H是大写。
此外,只有两个窗口,您似乎可以删除 Ctrl-w t 部分,因为如果您已经在仅有的两个窗口之一,将其设为最新有什么意义?
【讨论】:
因此,如果您有两个水平拆分的窗口,并且您在较低的窗口中,则只需使用 ^WL。 .... 力量... 今天我的 vim-fu 翻了一番,谢谢。有很多有趣的 ^w 命令(b、w 等) 在使用 NERDTree 插件时这能工作会很好:-) @Eno 对我来说很好。只需在“旋转”拆分之前关闭 NERDTree 面板,然后将其重新打开。 :NERDTreeToggle(为方便起见,我将其映射到功能键)。 我在我的 vim 配置中添加了一些领导者映射::nmap <leader>th <C-w>t<C-w>H
和 :nmap <leader>tk <C-w>t<C-w>K
【参考方案2】:
Ctrl-w 后跟 H、J、K 或 L(大写)将当前窗口分别移动到远处的left
、bottom
、top
或right
,就像普通的光标导航一样。
小写等效项移动焦点而不是移动窗口。
【讨论】:
因为用户使用 hjkl 在缓冲区之间移动所以好多了。 接受的答案很好,但对我来说,这个答案更容易记住。谢谢! 与 nerdtree 一起使用效果更好。 它在 macOS 上通过前缀Ctrl
-w
对我有效(我不知道 ^
在您的示例中是否表示 Ctrl
)。
@GiovanniBenussi 是的,我认为^
的意思是Ctrl
。【参考方案3】:
当您有两个或更多水平或垂直打开的窗口并希望将它们全部切换到另一个方向时,您可以使用以下方法:
(切换到水平)
:windo wincmd K
(切换到垂直)
:windo wincmd H
它有效地单独进入每个窗口并使用 ^WK 或 ^WH。
【讨论】:
【参考方案4】:以下 ex 命令将(重新)分割任意数量的窗口:
要垂直分割(例如,在窗口之间制作垂直分隔线),请输入:vertical ball
要水平拆分,请键入:ball
如果有隐藏缓冲区,发出这些命令也会使隐藏缓冲区可见。
【讨论】:
这应该是接受的答案,因为当前接受的答案仅适用于两个文件。这个答案比较完整。:vert[ical] ball
在文档中,所以:vert ball
也可以并且更短。
:ball
将 3 个垂直窗口减少到 2 个水平窗口,而 :vert ball
正确地将 3 个水平窗口映射到 3 个垂直窗口。
@DrStrangepork,它适用于所有打开的缓冲区,而不是拆分窗口中的内容。例如:认为您正在拆分窗口中查看 10 个打开缓冲区中的 3 个文件。请参阅:ls
了解开放缓冲区。无论如何,我喜欢这个答案以及其他答案。 +1【参考方案5】:
在 VIM 中,查看以下内容以了解您可能已完成的不同替代方案:
:帮助打开窗口
例如:
Ctrl-W sCtrl-W oCtrl-W vCtrl-W oCtrl-W s ...
【讨论】:
【参考方案6】:水平到垂直分割
Ctrl+W为窗口命令,
后跟 Shift+H 或 Shift+L
垂直到水平分割
Ctrl+W为窗口命令,
后跟 Shift+K 或 Shift+J
当只有两个窗口存在时,这两种解决方案都适用。
发出窗口命令Ctrl+W后,基本上就是按照Shift+方向字母指示的方向移动窗口。
默认以垂直拆分方式打开帮助
将这两行添加到.vimrc
:
cabbrev help vert help
cabbrev h vert h
cabbrev
代表命令缩写。
:vert[ical] cmd
总是在垂直分割的窗口中执行cmd
。
【讨论】:
【参考方案7】:受史蒂夫回答的启发,我编写了一个简单的函数,可以在当前选项卡中的所有窗口的垂直和水平拆分之间切换。您可以将其绑定到下面最后一行中的映射。
function! ToggleWindowHorizontalVerticalSplit()
if !exists('t:splitType')
let t:splitType = 'vertical'
endif
if t:splitType == 'vertical' " is vertical switch to horizontal
windo wincmd K
let t:splitType = 'horizontal'
else " is horizontal switch to vertical
windo wincmd H
let t:splitType = 'vertical'
endif
endfunction
nnoremap <silent> <leader>wt :call ToggleWindowHorizontalVerticalSplit()<cr>
【讨论】:
如果我强迫它像if winnr() == 1 windo wincmd J windo wincmd k else windo wincmd J endif
和if winnr() == 1 windo wincmd L windo wincmd h else windo wincmd L endif
那样保持在同一个拆分中,对我来说效果会更好。希望这是有道理的。【参考方案8】:
按照 Mark Rushakoff 的提示 above,这是我的映射:
" vertical to horizontal ( | -> -- )
noremap <c-w>- <c-w>t<c-w>K
" horizontal to vertical ( -- -> | )
noremap <c-w>\| <c-w>t<c-w>H
noremap <c-w>\ <c-w>t<c-w>H
noremap <c-w>/ <c-w>t<c-w>H
编辑: 使用 Ctrl-w r 如果两个窗口的顺序不正确.
【讨论】:
以上是关于在 Vim 中快速从垂直拆分切换到水平拆分的主要内容,如果未能解决你的问题,请参考以下文章