Для швидкого переходу від вертикального розбиття до горизонтального розділення у Vim


594

Як ви можете переключити свої поточні вікна з горизонтального розбиття на вертикальне та навпаки у Vim?

Я зробив це хвилину тому випадково, але знову не можу знайти ключ.


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

Відповіді:


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 (для зручності у мене це відображено у функціональній клавіші).
Ламбарт

2
Я додав декілька відображень лідерів до свого vim config: :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.


31

Наступні колишні команди (повторно) розділять будь-яку кількість вікон:

  • Щоб розділити вертикально (наприклад, зробити вертикальні роздільники між вікнами), введіть :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.