Why do I need vim in binary mode for 'noeol' to work?

前端 未结 4 1074
梦如初夏
梦如初夏 2020-12-04 11:40

This question is a follow up to the Work Around I use for \"saving files in vim without having the newline at end of file forcibly added\" annoyance.

Basically I can

相关标签:
4条回答
  • 2020-12-04 11:52

    According to the vimdoc noeol does nothing unless binary mode is on.

                *'endofline'* *'eol'* *'noendofline'* *'noeol'*
    'endofline' 'eol'   boolean (default on)
                local to buffer
                {not in Vi}
        When writing a file and this option is off and the 'binary' option
        is on, no <EOL> will be written for the last line in the file.  This
        option is automatically set when starting to edit a new file, unless
        the file does not have an <EOL> for the last line in the file, in
        which case it is reset.  Normally you don't have to set or reset this
        voption.  When 'binary' is off the value is not used when writing the
        file.  When 'binary' is on it is used to remember the presence of a
        <EOL> for the last line in the file, so that when you write the file
        the situation from the original file can be kept.  But you can change
        it if you want to.
    
    0 讨论(0)
  • 2020-12-04 11:54

    have a simple preference in .vimrc to NOT add newlines at every single file i edit

    You can use my PreserveNoEOL plugin for that. With this simple setting, you're done; alternatively, you can also influence this per buffer:

    :let g:PreserveNoEOL = 1
    
    0 讨论(0)
  • 2020-12-04 11:58

    from version 7.4.785 vim has fixendofline setting. You can avoid binary (which has some side effects) and simply set

    set noendofline
    set nofixendofline
    
    0 讨论(0)
  • 2020-12-04 12:08

    What Vim "adds" to the end of the last line in your file is the "newline" character, which should not to be confused with a "new line".

    The "newline" character or more accurately "end of line" character (<EOL>) means "whatever comes after this point must be considered to be on another line". With this interpretation — <EOL> is a line terminator — the last line of the file is effectively the last one with an <EOL>.

    The problem is that most editors and IDEs have a different interpretation — <EOL> is a line separator — and, logically, default to not add an <EOL> at the end of the last line of a new file and, when they encounter an <EOL>, add a superfluous "new line" after the real last line.

    In short, Vim doesn't add a "new line": other editors interpret (wrongly) its "newline" as a "new line".

    But you can get around that issue by doing the following: before you write your file, do :set binary noeol if you want it to stay "<EOL>-free".

    However, :h 'binary' has a lot to say about the perils of :set binary so I'd say that turning it "on" all the time sounds like a bad idea.

    To illustrate the different behaviors, this is what happens when you try to concatenate two files with <EOL>:

    $ cat file1    $ cat file2         $ cat file1 file2
    
    lorem ipsum    Le tramway jaune    lorem ipsum
    dolor sit      avance lentement    dolor sit
    amet           dans le             amet
                                       Le tramway jaune
                                       avance lentement 
                                       dans le
    

    and this is what happens when you try to concatenate two files without <EOL>:

    $ cat file1    $ cat file2         $ cat file1 file2
    
    lorem ipsum    Le tramway jaune    lorem ipsum
    dolor sit      avance lentement    dolor sit
    amet           dans le             ametLe tramway jaune
                                       avance lentement 
                                       dans le
    

    The first behavior is somehow the expected behavior and the reason why Vim and many (if not most) UNIX-y programs default to the terminator interpretation and to adding an <EOL> character at the end of the last line.

    The picture below shows a simple file with <EOL> created with nano (it would be the same with Vim) and opened in Eclipse, TextMate, Sublime Text, Vim, Xcode and TextEdit.

    <EOL>

    (edit) There is no line 4 in this file and the only editor of the bunch that displays the file correctly is Vim. A line number column's only purpose is to provide information on the buffer. Showing 4 lines where there are only 3 is a gross mistake. (endedit)

    This picture shows another simple file without <EOL> created with Sublime Text and opened in the same editors/IDEs.

    No <EOL>

    0 讨论(0)
提交回复
热议问题