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>"