Для быстрого переключения с вертикального разделения на горизонтальное разделение в Vim


596

Как вы можете переключить ваши текущие окна с горизонтального разделения на вертикальное и наоборот в Vim?

Я сделал это минуту назад случайно, но больше не могу найти ключ.


2
возможно плагин dwm.vim будет своего рода полезным
ДМИТРИЙ МАЛИКОВ

Ответы:


894

Список рассылки Vim говорит (переформатирован для лучшей читаемости):

Чтобы изменить два вертикально разделенных окна на горизонтальное разделение

Ctrl- w t Ctrl-w K

По горизонтали к вертикали:

Ctrl- w t Ctrl-w H

Пояснения:

Ctrl- w t делает первое (topleft) окно текущим

Ctrl- w K перемещает текущее окно на полную ширину в самом верху

Ctrl- w H перемещает текущее окно на полную высоту слева

Обратите внимание, что t строчные, а K и H прописные.

Кроме того , только два окна, кажется , что вы можете уронить Ctrl- w tотчасти потому , что , если вы уже в одном из только два окна, в чем смысл сделать его текущим?


27
Так что, если у вас два окна разделены по горизонтали, и вы находитесь в нижнем окне, вы просто используете ^ WL.
слишком много php

7
.... Сила ... Мой vim-fu сегодня удвоился, спасибо. Есть масса интересных ^ ^ команд (b, w и т. Д.)
Алекс Харт

Было бы хорошо, если бы это работало при использовании плагина NERDTree :-)
Ино

3
@Eno отлично работает для меня. Просто закройте панель NERDTree, прежде чем «вращать» сплит, затем снова откройте ее. : NERDTreeToggle (для удобства он сопоставлен с функциональной клавишей).
Ламбарт

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затем H, J, Kили L(капитала) будет переместить текущее окно в далекую left, bottom, topили , rightсоответственно , как нормальный курсор навигации.

Эквиваленты в нижнем регистре перемещают фокус вместо перемещения окна.


5
это намного лучше, так как пользователи используют hjkl для перемещения между буферами.
Афшин Мехрабани

30
Принятый ответ хороший, но для меня этот ответ легче запомнить. Спасибо!
Джон Картер

Лучше работает с nerdtree тоже.
arcseldon

Это работает для меня на macOS с помощью префикса Ctrl- w(я не знаю, ^означает ли это Ctrlв вашем примере).
Джованни Бенусси

@GiovanniBenussi да, я думаю, что ^значит Ctrl.
ma11hew28

47

Если у вас есть два или более окон, открытых горизонтально или вертикально, и вы хотите переключить их все в другую ориентацию, вы можете использовать следующее:

(переключиться в горизонтальное положение)

:windo wincmd K

(переключиться в вертикальное положение)

:windo wincmd H

Он эффективно подходит к каждому окну индивидуально и использует ^WKили ^WH.


32

Следующие команды ex будут (повторно) разбивать любое количество окон:

  • Чтобы разделить вертикально (например, сделать вертикальные разделители между окнами), введите :vertical ball
  • Чтобы разделить по горизонтали, введите :ball

Если есть скрытые буферы, выполнение этих команд также сделает скрытые буферы видимыми.


Это должен быть принятый ответ, так как текущий принятый ответ будет работать только для двух файлов. Этот ответ является более полным.
DrStrangepork

:vert[ical] ballв док :vert ballтоже так ок и короче.
Титу

:ballуменьшает 3 вертикальных окна до 2 горизонтальных, в то время как :vert ball правильно отображает 3 горизонтальных окна на 3 вертикальных.
Титу,

27

В VIM взгляните на следующее, чтобы увидеть различные варианты того, что вы могли бы сделать:

: помочь открыть окно

Например:

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


11

Горизонтальное разделение на вертикальное

Ctrl+ Wдля команды окна, сопровождаемый Shift+ Hили Shift+L


Вертикальное разделение на горизонтальное

Ctrl+ Wдля команды окна, сопровождаемый Shift+ Kили Shift+J

Оба решения применяются, когда существуют только два окна.


Открыть справку по вертикали по умолчанию

Добавьте обе эти строки в .vimrc:

cabbrev help vert help
cabbrev h vert h

:vert[ical] {cmd}всегда выполняет cmdв вертикально разделенном окне.


6

Вдохновленный ответом Стива, я написал простую функцию, которая переключается между вертикальным и горизонтальным разделением для всех окон в текущей вкладке. Вы можете привязать его к отображению, как в последней строке ниже.

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

Следуя совету Марка Рушакова выше , вот мое отображение:

" 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чтобы поменять местами два окна, если они не в порядке.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.