The winheight
function will return the height of window n. From :h winheight()
:
winheight({nr}) *winheight()*
The result is a Number, which is the height of window {nr}.
{nr} can be the window number or the |window-ID|.
When {nr} is zero, the height of the current window is
returned. When window {nr} doesn't exist, -1 is returned.
An existing window always has a height of zero or more.
Examples: >
So winheight(0)
will give us the height of the current window. split
takes a numerical argument. From :h :split
:
:[N]sp[lit] [++opt] [+cmd] [file] *:sp* *:split*
Split current window in two. The result is two viewports on
the same file.
Make the new window N high (default is to use half the height
of the current window). Reduces the current window height to
create room (and others, if the 'equalalways' option is set,
'eadirection' isn't "hor", and one of them is higher than the
current or the new window).
So, combining these two commands, you could do this with
exec winheight(0)/3."split"
Or
exec winheight(0)/3."new"
if you want a new buffer, rather than a split on the same file. Since this isn't exactly easy to remember, you could wrap it in a function:
function! ThirdSplit()
exec winheight(0)/3."split"
endfunction
You could even make this function take an optional denominator:
function! Split(ratio)
exec winheight(0)/a:ratio."split"
endfunction
Or of course, you could make a mapping. For example, <leader>s
nnoremap <expr> <leader>s ":".winheight(0)/3."split\<CR>"