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


29

Скажи следующее это текущая структура моего окна:

+ ----- + ----------------------------
| |
| A |
| |
+ ----- +
| |
| Б |

Порядок A и B не совсем естественен. Было бы лучше, если бы B был на вершине.

Однако, если я уйду <C-w>K, B будет самой верхней частью всех окон, а это не то, что я хочу. Как я могу поставить B над A, но не над любым другим окном, которое уже над A?

И если два окна разделены по вертикали, как я могу изменить их по горизонтали?


7
Этот пост объясняет, как вращать окна. Речь идет о переключении сплитов с вертикального на горизонтальное.
— lcd047

@ lcd047 Это вопросы за пределами этого сайта. Стоит ли писать здесь небольшой ответ и включать ссылки (которые ценны)?
— Бернхард

1
@ Бернхард Я полагаю, это хороший вопрос для мета .
— lcd047

1
@ Бернхард Да . Обязательно напишите полный ответ, а не только ссылки.
— Жиль "ТАК - перестань быть злым"

1
Затем, пожалуйста, объясните, что вы пытаетесь сделать, и почему два ответа, которые я вам указал, не решают проблему.
— lcd047

Ответы:


33

Чтобы поменять местами две части разделенного окна, просто выполните: <C-w> <C-r>


Возможно, я ошибаюсь, но ваше решение вращает окна, поэтому при более чем 2-х разделениях результат не будет таким, как искал ОП.
— statox

Вы абсолютно правы. ОП искал s.th. сложнее, чем «поменять местами две части разделенного окна».
— modesto

На самом деле OP ищет команду для замены двух разделенных окон, но ваше решение вращает все текущие разделенные окна. Как указано в разделе :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-е окно будет поверх двух других, что не соответствует тому, что запрашивал OP: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, с какими из них работать.


Просто для точности, когда вы говорите «выберите окно A, затем B», вы имеете в виду «Сосредоточиться на A, а затем на B, чтобы пометить порядок последних увиденных буферов и окон, чтобы поменять их местами? Или же»? выберите «иметь в виду что-то еще, чем« сосредоточиться »?
— падавин

Да, именно: я использую «выбрать» как «сосредоточиться на».
— Cometsong

6
CTRL-W x меняет текущее окно на окно N
                   (по умолчанию: следующее окно)

( index.txtраздел 2.2, «Команды окна»)

Если A является текущим окном, то следующим будет B, поэтому вам нужно только <C-w> x

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


4

Другой альтернативой замене окон или замене буферов является маркировка позиций (с использованием заглавных букв ) в ваших файлах и открытие этих отметок в окнах по вашему выбору.

Например, если у меня есть два файла, file_A и file_B :

  • Я бы пошел в окно с file_A и пометить его:mA
  • перейдите в окно с file_B и отметьте его:mB
  • Затем извлеките метку file_A в это окно:'A
  • а затем вернуться к первому окну и получать отметку file_B в там: 'B.

Преимущество этого метода состоит в том, что если по какой-то причине вы разбили свою панель более одного раза, и нет четкой логики для их замены, как, например, если вы хотите поменять панели в 12 и 7 часах, вы можете ' просто вращайте окна, но вы можете легко поменять их местами.


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.