Those are not empty lines, but lines that are too long to fit on the screen, even after wrapping.
$ perl -e 'print "foo\n", "bar " x 4096' >/tmp/file
$ vim /tmp/file
This is what the standard says:
In visual mode, if a line from the edit buffer (other than the
current line) does not entirely fit into the lines at the bottom of
the display that are available for its presentation, the editor may
choose not to display any portion of the line. The lines of the
display that do not contain text from the edit buffer for this
reason shall each consist of a single '@' character.
Also look at the
vim's documentation about the
When neither "lastline" nor "truncate" is included, a last line that
doesn't fit is replaced with "@" lines.
Do not confuse them with null bytes, which are usually shown as
^@ (notice the caret). Also, this behavior is not universal (it doesn't seem to be implemented in