Подтвердить что ты не робот

Почему Vim добавит новую строку в конец файла?

Я много работаю с WordPress, и иногда я временно менял основные файлы WordPress, чтобы понять, что происходит, особенно при отладке. Сегодня я получил небольшой сюрприз. Когда я был готов зафиксировать свои изменения в своем git-репозитории, я заметил, что git status помечал один из файлов wordpress как не подготовленный для фиксации. Я помню, что отменил все изменения, внесенные в этот файл, прежде чем закрывать его, поэтому я решил использовать diff чтобы увидеть, что изменилось. Я сравнил файл моего проекта с файлом в WordPress, который я храню в своем каталоге загрузок. Оказывается, файлы отличаются в самом конце. diff указывает, что в конце исходного файла отсутствует новая строка:

1724c1724
< }
\ No newline at end of file
---
> }

Я никогда даже не касался этой линии. Изменения, которые я сделал, где-то в середине большого файла. Это заставляет меня думать, что vim добавил символ новой строки в конце файла. Почему это случилось?

4b9b3361

Ответ 1

Все ответы, которые я видел здесь, касаются вопроса "как я могу помешать Vim добавлять символ новой строки в конце файла?", в то время как вопрос был "Почему Vim добавит новую строку в конце файл?". Моя поисковая машина браузера привела меня сюда, и я не нашел ответа на этот вопрос.

Это связано с тем, как стандарт POSIX определяет строку (см. Почему файлы должны заканчиваться новой строкой?). Итак, в основном, строка:

<Дл >    3.206 Линия   Последовательность нуля или более не-ltline; символы плюс завершающая < новая строка > характер.дд > Дл >

И поэтому все они должны заканчиваться символом новой строки. Вот почему Vim всегда добавляет новую строку по умолчанию (потому что, согласно POSIX, она всегда должна быть там).

Это не единственный редактор, который это делает. Gedit, текстовый редактор по умолчанию в GNOME, делает то же самое.


Изменить

Многие другие инструменты также ожидают, что символ новой строки. См. Например:

Кроме того, вас может заинтересовать: Vim show newline в конце файла.

Ответ 2

Поскольку vim является текстовым редактором, он иногда может "очистить" файлы для вас. См. Http://vimhelp.appspot.com/vim_faq.txt.html#faq-5.4 для получения подробной информации о том, как писать без завершающей строки, перефразируя ниже:

Как мне написать файл без перевода строки (EOL) в конце файла?

Вы можете отключить опцию eol и включить binary опцию, чтобы записать файл без EOL в конце файла:
:set binary
:set noeol
:w

В качестве альтернативы вы можете использовать:
:set noeol
:w ++bin

Ответ 4

Вы можете поместить следующую строку в свой .vimrc

autocmd FileType php setlocal noeol binary

Что должно делать трюк, но на самом деле ваш подход несколько неправильный. Прежде всего, php не будет возражать против этого окончания, а во-вторых, если вы не хотите сохранять свои изменения, не нажимайте u или, что еще хуже, попробуйте воссоздать состояние файла, но просто выходите без сохранения q!. Если вы оставили редактор и сохранили по какой-либо причине, попробуйте git checkout <file>

Ответ 5

3.206 Линия Последовательность из нуля или более символов без символа.

Интересно, что vim позволит вам открыть новый файл, записать файл, а файл будет равен нулю. Если вы откроете новый файл и добавьте строку, используя "o", тогда напишите файл длиной два символа. Если вы откроете указанный файл и удалите вторую строку 'dd' и напишите файл, он будет длинным. Откройте резервную копию файла и удалите оставшуюся строку и напишите файл, это будет нулевой байт. Таким образом, vim позволит вам писать файл с нулевым байтом только до тех пор, пока он полностью пуст. Кажется, это не соответствует определению posix выше. Я думаю...