-o , -O e -p são mutuamente exclusivos. Você não pode combiná-los.
De main.c , command_line_scan() :
case 'p': /* "-p[N]" open N tab pages */
parmp->window_layout = WIN_TABS;
break;
case 'o': /* "-o[N]" open N horizontal split windows */
parmp->window_layout = WIN_HOR;
break;
case 'O': /* "-O[N]" open N vertical split windows */
parmp->window_layout = WIN_VER;
break;
e, em seguida, em create_windows() :
parmp->window_count = make_windows(parmp->window_count,
parmp->window_layout == WIN_VER);
E make_windows() de window.c :
/*
* Make "count" windows on the screen.
* Return actual number of windows on the screen.
* Must be called when there is just one window, filling the whole screen
* (excluding the command line).
*/
int
make_windows(count, vertical)
int count;
int vertical UNUSED; /* split windows vertically if TRUE */
{
int maxcount;
int todo;
Como você vê, não há nenhuma facilidade para dizer "dividir as poucas janelas na horizontal e as poucas na vertical".
A maneira mais fácil de fazer o que você quer é usar -c para enviar comandos "diretos" para o Vim:
vim main.c -c ':split gui.c' -c ':vsplit window.c'
Que pode ser abreviado para:
vim main.c -c 'sp gui.c | vs window.c'