Поміняйте місцями два вікна


29

Скажіть наступне - це поточна структура мого вікна:

+ ----- + ----------------------------
| |
| А |
| |
+ ----- +
| |
| Б |

Порядок A і B не зовсім природний. Було б краще, якби Б був зверху.

Однак, якщо я піду <C-w>K, B буде самою вершиною всіх вікон, а це не те, що я хочу. Як я можу поставити B вище A, але не над будь-яким іншим вікном, яке вже вище A?

І якщо два вікна вертикально розділені, як я можу змінити їх на горизонтальне розщеплення?


7
У цій публікації пояснено, як обертати вікна. Йдеться про перемикання розколи з вертикального на горизонтальне.
lcd047

@ lcd047 Це питання поза цим сайтом. Чи варто написати тут невелику відповідь і включити посилання (які є цінними)?
Бернхард

1
@ Berernhard Я думаю, що це добре питання для мета .
lcd047

1
@ Бернхард Так . Не забудьте написати повну відповідь, а не лише посилання.
Жил 'ТАК - перестань бути злим'

1
Тоді поясніть, що ви намагаєтесь зробити, і чому два відповіді, на які я вказав, не вирішують проблеми.
lcd047

Відповіді:


33

Для заміни двох частин розділеного вікна просто виконайте такі дії: <C-w> <C-r>


Можливо, я помиляюся, але ваше рішення обертає вікна, тому при більш ніж 2 розділених результатах результат не буде тим, що шукав ОП.
statox

Ти абсолютно правий. ОП шукала с.т. складніше, ніж "поміняти дві частини розділеного вікна".
модератор

Насправді ОП шукає команду для заміни двох розділених вікон, але ваше рішення обертає всі поточні розділені вікна. Як зазначено в :h CTRL-W_CTRL-R: The second window becomes the first one, the third one becomes the second one, etc.Таким чином, якщо у вас є 3 розбиття, курсор на нижньому і потрапив <c-w><c-r>у 3-е вікно буде над другими двома, що не те, про що просив ОП:How can I put B above A, but not above any other window that is already above A?
statox

6

Для того, щоб поміняти windowпозиції, ефект еквівалентний заміні буферів, які показують ці два вікна.
Наприклад, якщо у вікні A є буфер 2, а у вікні B є буфер 8, вам потрібно перейти до вікна A, виберіть буфер 8, потім у вікно B, виберіть буфер 2.

Ця ідея надихнула мене на її написання - і вона вже є в моїй власній панелі інструментів

Код функції:

function! WinBufSwap()
  let thiswin = winnr()
  let thisbuf = bufnr("%")
  let lastwin = winnr("#")
  let lastbuf = winbufnr(lastwin)

  exec  lastwin . " wincmd w" ."|".
      \ "buffer ". thisbuf ."|".
      \ thiswin ." wincmd w" ."|".
      \ "buffer ". lastbuf
endfunction

command! Wswap :call WinBufSwap()
map <Leader>bs <C-c>:call WinBufSwap()<CR>
  1. Виберіть вікно A
  2. Виберіть вікно B
  3. :call WinBufSwap()
    Це здійснює заміну буферів у двох попередньо вибраних вікнах, залишаючи курсор у вихідному вікні.

Вибір двох потрібних вікон, які потрібно замінити заздалегідь, є ключовою деталлю, тому що для Vim потрібно вказати, з якими з них працювати.


Просто точність, коли ви говорите "виберіть вікно А, потім В", ви маєте на увазі "Орієнтуйтеся на А, потім на В, щоб позначити порядок останніх бачених буферів і вікон, щоб правильно поміняти місцями? Або так" виберіть "означати щось інше, ніж" зосередити увагу "
padawin

Так саме: я використовую "select" як "фокус на".
Cometsong

6
CTRL-W x обмін поточного вікна з вікном N
                   (за замовчуванням: наступне вікно)

( index.txtрозділ 2.2, "Віконні команди")

Якщо A - поточне вікно, то наступним буде B, тож вам потрібно лише <C-w> x

Якщо B - поточне вікно (а нижче є більше вікон), то спочатку вам доведеться перейти до A, а потім обмінятися: <C-w> k <C-w> x


4

Іншою альтернативою для заміни вікон або заміни буферів є маркування позицій (за допомогою великих знаків) у ваших файлах та відкриття цих міток у вибраному вами вікні.

Наприклад, якщо у мене є два файли, файл_А та файл_В :

  • Я б зайшов у вікно з файлом_A і позначив його:mA
  • перейдіть до вікна з файлом_B і позначте його:mB
  • Потім занесіть позначку file_A до цього вікна:'A
  • а потім повернутися до першого вікна і отримувати позначку file_B в там: 'B.

Перевага цього методу полягає в тому, що якщо ви з якихось причин розділили панель не раз і не існує чіткої логіки їх обміну, наприклад, якщо ви хочете поміняти панелі в 12 годин та 7 годин, ви можете " t просто обертати вікна навколо, але ви можете легко поміняти буфери.


0

Ви можете поміняти буфери між двома вікнами за допомогою наступної функції:

function! SwitchWindow(count) abort
    let l:current_buf = winbufnr(0)
    exe "buffer" . winbufnr(a:count)
    exe a:count . "wincmd w"
    exe "buffer" . l:current_buf
    wincmd p
endfunction
nnoremap <C-w>x :<C-u>call SwitchWindow(v:count1)<CR>

Тепер, найчастіше, заміна буферів буде технічно діяти як обмін вікнами. Оскільки ви не відстежуєте вікна вручну, ви відстежуєте, яке вікно містить який буфер. Отже, наведена вище функція допоможе вам у більшості ситуацій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.