在Vim中快速从垂直拆分切换到水平拆分


Answers:


893

Vim邮件列表说(重新格式化以提高可读性):

两个垂直拆分的窗口更改为水平拆分

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部分,因为如果您已经位于仅有的两个窗口之一中,将其设置为当前状态有什么意义?


27
因此,如果您有两个水平分隔的窗口,并且位于下部窗口中,则只需使用^ WL。
太多的PHP

7
....力量...我的vim-fu今天翻了一番,谢谢。有很多有趣的^ w命令(b,w等)
Alex Hart

使用NERDTree插件时可以正常工作是很不错的:-)
Eno

3
@Eno对我来说很好。只需在“旋转”拆分之前将NERDTree面板关闭即可,然后再将其切换回打开状态。:NERDTreeToggle(为方便起见,我已将其映射到功能键)。
Lambart 2014年

2
我在我的vim配置中添加了一些领导者映射: :nmap <leader>th <C-w>t<C-w>H:nmap <leader>tk <C-w>t<C-w>K
Ian Marcinkowski

324

Ctrl- w其次HJKL(大写)将当前窗口移动到远leftbottomtopright分别像正常光标导航。

小写字母等效项将移动焦点而不是移动窗口。


5
由于用户使用hjkl在缓冲区之间移动,因此效果更好。
Afshin Mehrabani 2014年

30
可接受的答案是一个很好的答案,但是对我来说,这个答案更容易记住。谢谢!
乔恩·卡特

nerdtree也可以更好地工作。
arcseldon

它在我的macOS上通过添加前缀Ctrl- w(我不知道您的示例中是否^意味着Ctrl)来工作。
Giovanni Benussi '18年

@GiovanniBenussi是的,我认为^Ctrl
ma11hew28

47

当您有两个或多个水平或垂直打开的窗口并想全部切换时切换为其他方向时,可以使用以下方法:

(切换到水平)

:windo wincmd K

(切换到垂直)

:windo wincmd H

有效地使用^WK或分别转到每个窗口^WH


31

以下ex命令将(重新)拆分任意数量的窗口:

  • 要垂直分割(例如,在窗口之间进行垂直分隔),请键入 :vertical ball
  • 要水平拆分,请键入 :ball

如果存在隐藏缓冲区,则发出这些命令还将使隐藏缓冲区可见。


这应该是可接受的答案,因为当前可接受的答案仅适用于两个文件。这个答案比较完整。
DrStrangepork 2015年

:vert[ical] ball在文档:vert ball中也可以,而且更短。
剔透

:ball将3个垂直窗口缩小为2个水平窗口,同时:vert ball 将3个水平窗口正确映射为3个垂直窗口。
Titou

27

在VIM中,请查看以下内容,以了解可能做过的其他选择:

:帮助打开窗口

例如:

Ctrl- W s
Ctrl- W o
Ctrl- W v
Ctrl- W o
Ctrl- W s
...


11

水平到垂直拆分

Ctrl+ W用于窗口命令,后跟Shift+ HShift+L


垂直至水平分割

Ctrl+ W用于窗口命令,后跟Shift+ KShift+J

当只有两个窗口时,两种解决方案均适用。


默认情况下以垂直拆分方式打开帮助

将这两行都添加到.vimrc

cabbrev help vert help
cabbrev h vert h

:vert[ical] {cmd}总是cmd在垂直分割的窗口中执行。


6

受史蒂夫(Steve)答案的启发,我编写了一个简单的函数,该函数可在当前选项卡中所有窗口的垂直拆分和水平拆分之间切换。您可以将其绑定到映射,如下面的最后一行所示。

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希望保持相同的分裂,对我来说效果更好。
mjhoffmann

5

继马克Rushakoff的尖上面,这里是我的映射:

" 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交换两个窗口,如果它们的顺序不正确。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.