aboutsummaryrefslogtreecommitdiff
path: root/vim.dot.link/plugin/session_workarounds.vim
blob: 31dec9f2dcc479d08073d6341850208fde7b273e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
" session_workarounds.vim - Session restoration workarounds
"
" Author: Silvio Rhatto <rhatto@riseup.net>
"

" Fix NERDTree width {{{
"
" Useful after restoring sessions between screen size changes (such
" as when you share sessions between different computers).
function FixWindowWidths()
  " Make sure NERDTree is focused
  execute ":NERDTreeFocus"

  " Set a fixed width
  execute ":vertical resize 30"

  " Move to the left pane
  wincmd l
endfunction

" In case you want to invoke FixWindowWidths explicitly
command! -bang FixWindowWidths :call FixWindowWidths()
" }}}

" Fix window widths on all tabs {{{
function FixAllWindowWidths()
  " Make sure to run this only once
  if exists("did_fixed_window_widths")
    return
  endif

  " Save the last active window
  let l:current_win = win_getid()

  tabdo :call FixWindowWidths()

  " Restore the active window
  call win_gotoid(l:current_win)

  " An additional, last move to the left pane
  wincmd l

  let did_fixed_window_widths=1
endfunction
" }}}

" Ensure the window has maximized height {{{
"
" This helps restoring the window size after reopening sessions after
" switching monitors (like from laptop screen to external HDMI monitor).
"
" We just want to quickly maximize the window and then restore it to
" it's original size, to ensure all windows are refreshed.
"
" Maybe this is not a NERDTree workaround itself, but more like a
" session workaround.
"
" https://superuser.com/questions/140419/how-to-start-gvim-maximized
" https://vim.fandom.com/wiki/Maximize_or_set_initial_window_size
" https://vi.stackexchange.com/questions/8926/is-it-possible-to-obtain-the-displayable-area-width-and-height-of-current-buffe
"let lines_initial=&l:lines
function FixWindowHeights()
  " Set the maximum available height
  set lines=999

  " Set the lines depending on the LINES environment variable
  " or through tput.
  "
  " This is not always inherited by vim:
  " https://github.com/vim/vim/issues/12160
  if $LINES != ""
    execute ':set lines=' . $LINES
  else
    let available_lines = system('tput lines')
    execute ':set lines=' . available_lines
    " Old, and not working approach that tries to reuse the initial height
    "else
    "    execute ':set lines=' . lines_initial
    "    set lines=999
    "    execute ':set lines=' . winheight(0) - 3
  endif
endfunction
" }}}

" Restore all window sizes {{{
function RestoreWindowSizes()
  call FixWindowHeights()
  call FixAllWindowWidths()
endfunction
" }}}

" Fix all window sizes {{{
augroup workaround
  autocmd!
  " This tends to fire for every buffer
  autocmd workaround SessionLoadPost * call RestoreWindowSizes()

  " This seems to fire only once, but even when there's no session to be
  " restored.
  "autocmd workaround VimEnter * call FixAllWindowWidths()
augroup END
" }}}