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

Если я открываю 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 [email protected]
Compiled by [email protected]

Я также могу подтвердить то же самое поведение в этой системе:

$ 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 [email protected]
Compiled by [email protected]

Почему Vim добавляет новую строку? Это соглашение?

Вот некоторые пояснения к команде hd, установленной на сервере Ubuntu:

$ man hd | head -4
HEXDUMP(1)            BSD General Commands Manual            HEXDUMP(1)

NAME
     hexdump, hd — ASCII, decimal, hexadecimal, octal dump
16 голосов | спросил dotancohen 23 PMpWed, 23 Apr 2014 19:04:25 +040004Wednesday 2014, 19:04:25

4 ответа


26

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

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

:help 'fileformat'

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

:help 'binary'
:help edit-binary
ответил garyjohn 23 PMpWed, 23 Apr 2014 19:33:27 +040033Wednesday 2014, 19:33:27
2

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

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

  • в первом, файл содержит только одну строку, поэтому вы получаете один символ «новой строки»,
  • во втором, файл содержит две строки, поэтому вы получаете два символа «новой строки».
ответил romainl 23 PMpWed, 23 Apr 2014 19:46:19 +040046Wednesday 2014, 19:46:19
2

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

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

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

ответил Wumpus Q. Wumbley 23 PMpWed, 23 Apr 2014 23:00:44 +040000Wednesday 2014, 23:00:44
1

Используя команду «j», вы можете присоединить все строки к одному.

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

$ vi file
:set binary
:set noeol
:w!
:f          look for [noeol] on the status line
:q
ответил Robert 15 FebruaryEurope/MoscowbWed, 15 Feb 2017 17:46:32 +0300000000pmWed, 15 Feb 2017 17:46:32 +030017 2017, 17:46:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132