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


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.