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

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, с какими из них работать.

Cometsong
источник
Просто для точности, когда вы говорите «выберите окно 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

JigglyNaga
источник
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>

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

клаус
источник