aboutsummaryrefslogtreecommitdiff
path: root/vim.dot.link/plugin/session_workarounds.vim
blob: ec891a8bbbf48e298787e69fc47398e5f55f7e1e (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
" 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
"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.
    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