I don't think it is, because the first character at the top of a Vim
window is either the first character of a (file) line, or some
character in a line which is too long for the window. So unless the
current line is too long for the window, Ctrl-Y will show one more
full file line at the top of the window, and Ctrl-E will make one full
file line disappear at the top of the window. Similarly, scrolling by
mouse will always make an integer number of file lines appear or
disappear at the top (again unless the current line is too long for
the window). I believe that this is as much part of the philosophy of
Vim as the fact that all displayable Latin, Greek, Cyrillic, Hebrew,
etc. characters (other than tabs) always occupy exactly the same
amount of height and width no matter the character in all the windows
of a single instance of Vim, including gvim and macvim, and that a
single fullwidth CJK character (no matter which one) always takes up
exactly twice as much space as two "narrow" characters (e.g. Latin,
etc. characters), except that if there is only one character-width
left at the end of a screen line (with 'wrap' on) it will be thrown
off to the next screen line.
AFAIK, to make sure than Vim always scrolls only a single screen line
at a time you would need to set 'nowrap' but of course any line longer
than 'columns' would then be only partly displayed. Me too, I prefer
'wrap' being on except in (g)vimdiff, and sometimes I am surprised
when going to the next line at bottom makes the display jump up by
several lines because a long line has disappeared at top, but I
believe that "Vim is like that".
Oh, there _is_ a possibility (of sorts): by setting 'lines' to 1 (plus
1 for the status line plus 'cmdheight' for the command-line area) you
could always wrap by screen lines, but OTOH it would nullify the
advantage of ":set wrap" so I don't think you would like it. :-P
Best regards,
Tony.