Зачем мне нужен vim в двоичном режиме для работы noeol?

Этот вопрос является продолжением Work Around, который я использую для "сохранения файлов в vim без наличия новой строки в конце файла, насильно добавленного" досады.

В основном я не могу использовать set noeol в своем .vimrc, потому что ничего не делает!

Он делает то, что должен был делать, если бы я редактировал файл в двоичном режиме. (vim -b file вместо vim file)

Почему это?

В любом случае, чтобы иметь простой выбор в .vimrc, чтобы НЕ добавлять новые строки в каждый отдельный файл, который я редактирую?

Также, какие проблемы я буду сталкиваться, если я начну редактировать каждый файл в двоичном режиме? До сих пор я не видел никакой разницы.

Ответ 1

Что Vim "добавляет" в конец последней строки вашего файла, это символ "новой строки", который не следует путать с "новой строкой".

Символ "новой строки" или более точно символ "конец строки" (<EOL>) означает "все, что приходит после того, как эта точка должна считаться находящейся в другой строке". С этой интерпретацией - <EOL> - терминатор линии - последняя строка файла фактически является последней с <EOL>.

Проблема в том, что большинство редакторов и IDE имеют другую интерпретацию - <EOL> - разделитель строк - и, по логике, по умолчанию не добавлять <EOL> в конец последней строки нового файла и, когда они сталкиваются с <EOL>, добавляют лишнюю "новую строку" после текущей последней строки.

Короче говоря, Vim не добавляет "новую строку": другие редакторы интерпретируют (ошибочно) свою "новую строку" как "новую строку".

Но вы можете обойти эту проблему, выполнив следующие действия: прежде чем писать файл, сделайте :set binary noeol, если вы хотите, чтобы он оставался "<EOL> -бесплатным".

Однако :h 'binary' может многое сказать о опасностях :set binary, поэтому я бы сказал, что превращение его "on" все время звучит как плохая идея.

Чтобы проиллюстрировать различные типы поведения, это происходит, когда вы пытаетесь объединить два файла с помощью <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

и это происходит, когда вы пытаетесь объединить два файла без <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

Первое поведение - это как-то ожидаемое поведение и причина, по которой Vim и многие (если не большинство) UNIX-y программ по умолчанию используют интерпретацию терминатора и добавляют символ <EOL> в конце последней строки.

На следующем рисунке показан простой файл с <EOL>, созданный с помощью nano (он будет таким же с Vim) и будет открыт в Eclipse, TextMate, Sublime Text, Vim, XCode и TextEdit.

<EOL>

(изменить) В этом файле <строкa > нет строки 4, а единственным редактором группы, которая отображает файл, является Vim. Столбец с номером номера строки предназначен только для предоставления информации о буфере. Отображение 4 строк, где есть только 3, является грубой ошибкой. (EndEdit)

На этом рисунке показан еще один простой файл без <EOL>, созданный с помощью Sublime Text и открытый в тех же редакторах /IDE.

No <EOL>

Ответ 2

из версии 7.4.785 vim имеет настройку fixendofline. Вы можете избежать binary с некоторыми побочными эффектами и просто установить

set noendofline
set nofixendofline

Ответ 3

имеют простое предпочтение в .vimrc, чтобы НЕ добавлять строки новой строки в каждый отдельный файл, который я редактирую

Вы можете использовать мой плагин PreserveNoEOL. С этой простой настройкой вы закончили; альтернативно, вы также можете влиять на этот буфер:

:let g:PreserveNoEOL = 1

Ответ 4

В соответствии с vimdoc noeol ничего не делает, если не включен режим binary.

            *'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.