16

Если я открою 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

4 ответа4

26

Соглашение для текстовых файлов Unix заключается в том, что каждая строка заканчивается новой строкой, а новые строки являются разделителями строк, а не разделителями строк.

Когда Vim сохраняет буфер как файл, он завершает каждую строку последовательностью конца строки для этого формата файла, который для Unix является новой строкой. Увидеть

:help 'fileformat'

Если вы используете инструменты обработки текста Unix, лучше придерживаться этого соглашения. Однако, если вам нужно не ставить символ новой строки в конце последней строки файла, вы можете сделать это. Vim считает такие файлы "двоичными". Увидеть

:help 'binary'
:help edit-binary
2

Неопределенные текстовые файлы являются злыми по нескольким причинам; вот тот, который я еще не видел упомянутым:

В гипотетическом мире, где текстовые файлы без завершающей новой строки являются приемлемыми, не будет никакой разницы между файлом, содержащим 0 строк, и файлом, содержащим 1 пустую строку. Они оба будут представлены 0-байтовым файлом.

Неспособность решить, сколько строк в файле будет плохой.

2

Vim не добавляет ничего, что вы не добавили туда самостоятельно.

Символ "новой строки" не является "новой строкой", и оба примера совершенно нормальны:

  • в первом файл содержит только одну строку, поэтому вы получаете один символ "новой строки",
  • во втором файле содержит две строки, поэтому вы получаете два символа "новой строки".
1

С помощью команды 'j' вы можете объединить все строки в одну.

Если вы также хотите удалить LF или CRLF в последней строке, выполните следующие действия в vi.

$ vi file
:set binary
:set noeol
:w!
:f          look for [noeol] on the status line
:q

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .