Why is Vim adding a newline? Is this a convention?
Solution 1:
The convention for Unix text files is that every line is terminated by a newline, and that newlines are line terminators, not line separators.
When Vim saves a buffer as a file, it terminates every line with the end-of-line sequence for that file format, which for Unix is a newline. See
:help 'fileformat'
If you're using Unix text-processing tools, it's best to stick with this convention. However, if you have some need to not put a newline at the end of the last line of a file, you can do so. Vim considers such files to be "binary". See
:help 'binary'
:help edit-binary
Solution 2:
Vim 8.0 now provides for this with the fixeol
option. Specifically if you do:
:set nofixeol
then Vim won't add a trailing newline character at the end of the final line if the file didn't already have one.
That could go in a filetype plugin, or possibly even your .vimrc
.
(This is an improvement on :set binary
because it only affects the final line-break character, whereas binary
also changes a bunch of other behaviours, which you probably don't want unless you're actually editing a binary file.)
A newly created file will still have a trailing line-break character by default. You can change that (and switch a file that already has a final newline to not having one) by additionally doing:
:set noeol
That has to be set specifically for each file you wish to change: loading a file into a buffer will always set eol
to match the file's current state.
Solution 3:
Vim is not adding anything that you didn't put there yourself.
A "newline" character is not a "new line" and both examples are perfectly normal:
- in the first one, the file only contains one line so you get one "newline" character,
- in the second one, the file contains two lines so you get two "newline" characters.
Solution 4:
Unterminated text files are evil for multiple reasons; here's one that I haven't seen mentioned yet:
In a hypothetical world where text files without a trailing newline are acceptable, there would be no difference between a file containing 0 lines and a file containing 1 blank line. They'd both be represented by a 0-byte file.
Inability to decide how many lines are in a file would be bad.
Solution 5:
Using the 'j' command you can join all the lines into one.
If you also want to remove the LF or CRLF on the last line do the following in vi.
$ vi file
:set binary
:set noeol
:w!
:f look for [noeol] on the status line
:q