Если я открываю Vim и печатаю, itest<Esc>:wq
я получаю файл, в котором нет новых строк в Vim, но, похоже, в нем есть новая строка :
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a |test.|
00000005
Если я открываю Vim и печатаю, itest<Return><Esc>:wq
я получаю файл, в котором есть одна новая строка в Vim, но две строки в коде:
$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a 0a |test..|
00000006
Обратите внимание, что я открываю Vim с помощью -u NONE
локальной конфигурации, которая не используется. Обратите внимание, что это может быть связано с моим предыдущим вопросом .
Это моя системная информация:
$ uname -a
Linux awsAlpha 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May 4 2012 04:25:35)
Included patches: 1-429
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@
Я могу подтвердить точно такое же поведение в этой системе:
$ uname -a
Linux bruno 3.5.0-48-generic #72-Ubuntu SMP Mon Mar 10 23:18:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:45:33)
Included patches: 1-547
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@
Почему Vim добавляет новую строку? Это соглашение?
Вот некоторые пояснения по поводу hd
команды, установленной на Ubuntu Server:
$ man hd | head -4
HEXDUMP(1) BSD General Commands Manual HEXDUMP(1)
NAME
hexdump, hd — ASCII, decimal, hexadecimal, octal dump
Ответы:
Соглашение для текстовых файлов Unix заключается в том, что каждая строка заканчивается новой строкой, а новые строки являются разделителями строк, а не разделителями строк.
Когда Vim сохраняет буфер как файл, он заканчивает каждую строку последовательностью конца строки для этого формата файла, который для Unix является новой строкой. Видеть
Если вы используете инструменты обработки текста Unix, лучше придерживаться этого соглашения. Однако, если вам нужно не ставить символ новой строки в конце последней строки файла, вы можете сделать это. Vim считает такие файлы «двоичными». Видеть
источник
Vim не добавляет ничего, что ты сам не положил туда.
Символ «новой строки» не является «новой строкой», и оба примера совершенно нормальны:
источник
printf "\x41" > /tmp/test.txt
затем убедитесь, что он имеет только один символ «A» сxxd /tmp/test.txt
. Теперьvim /tmp/test.txt<ENTER>:wq
. Проверьте еще раз, чтобы увидеть файл, имеющий два байта: 'A \ n'.printf
здесь у меня не было хорошо сформированных «линий». После VIM у меня есть один. Таким образом, это добавляет то, что я не положил туда.printf
не линия, если вы не добавите\n
. Будучи текстовым редактором, Vim работает со строками по умолчанию, и любой текст, который вы вставляете в файл, находится , по крайней мере, на строке, если вы явно не скажете Vim не делать этого.Неопределенные текстовые файлы являются злыми по нескольким причинам; вот тот, который я еще не видел упомянутым:
В гипотетическом мире, где текстовые файлы без завершающей новой строки являются приемлемыми, не будет никакой разницы между файлом, содержащим 0 строк, и файлом, содержащим 1 пустую строку. Они оба будут представлены 0-байтовым файлом.
Неспособность решить, сколько строк в файле будет плохой.
источник
Vim 8.0 теперь обеспечивает это с помощью
fixeol
опции. В частности, если вы делаете:тогда Vim не добавит завершающий символ новой строки в конце последней строки, если у файла его еще нет.
Это может пойти в плагин типа файла, или, возможно, даже ваш
.vimrc
.(Это улучшение,
:set binary
потому что оно влияет только на последний символ переноса строки, в тоbinary
же время также меняет кучу других поведений, которые вы, вероятно, не хотите, если вы на самом деле не редактируете двоичный файл.)Вновь созданный файл по-прежнему будет иметь завершающий символ перевода строки по умолчанию. Вы можете изменить это (и переключить файл, в котором уже есть последний перевод строки на отсутствие такового), дополнительно выполнив:
Это должно быть установлено специально для каждого файла, который вы хотите изменить: загрузка файла в буфер всегда
eol
будет соответствовать текущему состоянию файла.источник
С помощью команды 'j' вы можете объединить все строки в одну.
Если вы также хотите удалить LF или CRLF в последней строке, выполните следующие действия в vi.
источник