Как сделать, чтобы оконные расщепления поддерживали постоянный размер с текущим большим и другими маленькими - PullRequest
0 голосов
/ 16 апреля 2020

Идея состоит в том, чтобы сделать нечто похожее на то, что делает Golden Ratio (плагин vim). Но вместо определения размера «золотого сечения» я хочу установить указанный c размер невыбранным windows.

Пример:

# Window 1 selected
----------------------
|        |   |   |   |
|        |   |   |   |
|   1    | 2 | 3 | 4 |
|        |   |   |   |
|        |   |   |   |
----------------------

# Window 3 selected
----------------------
|   |   |        |   |
|   |   |        |   |
| 1 | 2 |    3   | 4 |
|   |   |        |   |
|   |   |        |   |
----------------------

Вот что я написано до сих пор (это просто WIP):

function g:ResizeWindow()
  let tabs = gettabinfo()
  let current_tabnr = tabpagenr()
  let current_window = win_getid()

  let tab = filter(tabs, 'v:val.tabnr == current_tabnr')[0]

  for window in tab.windows
    if window != current_window
      call win_gotoid(window)
      exe 'vertical resize' 20
    endif
  endfor

  call win_gotoid(current_window)
  let current_window_size = &columns - ((len(tab.windows) - 1) * 20)
  exe 'vertical resize' current_window_size
endfunction

autocmd WinNew,WinEnter * :call g:ResizeWindow()

Чтобы проверить, вы можете открыть один буфер и просто :vsp несколько раз. Затем, когда вы перемещаетесь по windows, кажется, что он работает в большинстве случаев, но иногда один из windows падает непоследовательным образом. Это намного меньше, чем остальные. Обычно это происходит, когда я перемещаюсь слева направо ... и сзади справа налево.

Есть идеи, что с этим не так и как это исправить?

1 Ответ

1 голос
/ 17 апреля 2020

супер интересная функция!

Вот рабочая версия:

function g:ResizeWindow()
  let tabs = gettabinfo()
  let current_tabnr = tabpagenr()
  let current_window = win_getid()

  let tab = filter(tabs, 'v:val.tabnr == current_tabnr')[0]

  let small_size = 5

  for window in tab.windows
    if window == current_window
      let size = &columns - ((len(tab.windows) - 1) * small_size) - (len(tab.windows) - 1)
    else
      let size = small_size
    endif
    noautocmd call win_gotoid(window)
    exe 'noautocmd vertical resize ' . size
  endfor

  call win_gotoid(current_window)
endfunction

set winwidth=1
set winminwidth=1
autocmd WinNew,WinEnter * :call g:ResizeWindow()

Объяснение

Я внес несколько изменений в ваш первоначальный WIP, вот Основные проблемы, с которыми столкнулся ваш код:

  • Функция была вызвана рекурсивно: вызов функции win_gotoid вызвал autocmd. Так что это испортило все размеры

  • Минимальный размер окна по умолчанию (minwinwidth) и размер окна по умолчанию (winwidth) мешали с размером, который вы применили

  • Вы изменили текущее окно как последнее, что уменьшило окно справа

  • При расчете размера основного окна не учитывались разделители окон


Отказ от ответственности

Эта функция прерывается, если в одном окне горизонтальное разделение!

...