Можно ли определить, находится ли окно снизу или сверху, слева или справа?

13

Я не знаю, есть ли какая-нибудь функция для проверки положения окна, я имею в виду, оно в настоящее время находится внизу или вверху, влево или вправо?

__________________________
|           |            |
|           |            |
|  left     |   right    |
|           |            |
|           |            |
|___________|____________|

__________________________
|                        |
|          top           |
|________________________|
|                        |
|         bottom         |
|_______________________ |
Аарон Шен
источник
Что ты пытаешься сделать? (Проблема XY)
mMontu
Я пытаюсь написать функцию, которая поворачивает оконное разбиение на вертикальное, если текущее расположение горизонтальное, и наоборот, когда есть только два окна. Поэтому мне нужно знать, какова текущая раскладка сплитов и где находится мое текущее окно
Аарон Шен
3
Почему бы просто не использовать ctrl-W_L? (или ctrl-W_R)
Витор
Я хочу, чтобы это была удобная функция переключения, она будет автоматически определять текущую раскладку и делать для меня правильное вращение, вместо этого мне нужно подумать об этом в уме и выбрать правильную команду для использования. Все, что мне нужно сделать, это всегда нажимать одну и ту же комбинацию клавиш.
Аарон Шен
@AaronShen Посмотрите на окно восстановления команд .
Муру

Ответы:

4

Подводя итог комментариям вопроса:

- Я пытаюсь написать функцию для поворота оконных сплитов в вертикальную, если текущая компоновка горизонтальная, и наоборот, когда есть только два окна.

Почему бы просто не использовать Ctrl-W_L? (или ctrl-W_R)

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

Для макетов, содержащих только два окна, должна работать следующая функция:

function! Rotate()
   " save the original position, jump to the first window
   let initial = winnr()
   exe 1 . "wincmd w"

   wincmd l
   if winnr() != 1
      " succeeded moving to the right window
      wincmd J " make it the bot window
   else
      " cannot move to the right, so we are at the top
      wincmd H " make it the left window
   endif

   " restore cursor to the initial window
   exe initial . "wincmd w"
endfunction

nnoremap <F3> :call Rotate()<CR>
mMontu
источник
отличная функция, хотя я не знаю всех скриптов vim, но спасибо, она отлично работает !! Кстати, я добавляю только одну дополнительную проверку, она работает только тогда, когда есть только два окна.
Аарон Шен
6

Я не думаю, что есть способ проверить это, к сожалению.

Может быть способ создать пользовательскую функцию, которая проверяет это: номера окон всегда нумеруются от 1 в левом верхнем углу до n в правом нижнем углу. Возможно , можно использовать это в сочетании с геометрией данных winwidth(), winheight()а значения &linesи &columnsсоздать нужную карту?

Обратите внимание, чтобы быть общим, это должно поддерживать более сложные макеты. Каким должен быть выход, если, например, левая сторона разделена на две части? Возможно, это причина, почему функция не существует в первую очередь ...

Карл Ингве Лерваг
источник