Как заставить vim автоматически добавлять новую строку в конец файла?

16

Vim обычно пишет <EOL>для последней строки, только когда она была в исходном файле.

Как заставить vim писать новую строку в конце файла все время (когда файл не двоичный и его еще нет)?

Я опробовал eolвариант, но он не сработал, как ожидалось.

Смотрите также: Сохранить пропущенный конец строки в конце текстовых файлов , но напротив. И: Почему файлы должны заканчиваться символом новой строки?

kenorb
источник

Ответы:

17

Основная информация

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

Эксперимент 1

Вы можете сделать этот небольшой эксперимент, чтобы проверить это поведение. В терминале выполните:

$ vim test_test

Введите символ 1и сохраните файл :wq.

У вас есть только один символ в файле, верно? На самом деле нет :) Теперь у вас есть в вашем файле 1и LFсимволы. Давайте проверим это с помощью утилиты hexdump:

$ hexdump test_test
0000000 31 0a
0000002

31это ASCII-код для символа 1и 0aASCII-код для непечатаемого LFсимвола, который для UNIX, как вы, возможно, уже знаете код для конца строки.

Эксперимент 2

Но что, если мы откроем файл, у которого нет eolсимвола в конце файла. Давай проверим это тоже. Давайте создадим файл без eol в конце, например, так:

$ echo -n "1" > test_without_eol

Тогда снова давайте посмотрим внутрь с помощью hexdump:

$ hexdump test_without_eol
000000 31
0000001

Так что здесь нет никаких eolперсонажей. Давайте откроем этот файл в vim:

$ vim test_without_eol

Внизу редактора вы увидите:

"test_without_eol" [noeol] 1L, 1C

И если вы сохраните этот файл, eolперсонаж будет вставлен автоматически.

Что мы можем сделать по этому поводу?

Если вам действительно нужно увидеть конец файла. Попробуйте использовать эту команду:

:set listchars=eol:$

он покажет все eolсимволы в виде $знака.

Александр Мышов
источник
Отлично. После замешательства я пришел к такому же выводу, потому что Вим на самом деле не показывал мне эту новую строку, но она была там после сохранения.
Кенорб
1
@kenorb, кстати, вы можете показать все символы EOL, используя эту :set listchars=eol:$
команду
«на самом деле не показывал мне эту новую строку» - в Unix нет строки. Строка определяется как «количество не LF символов, оканчивающихся на LF символ». Если вы думаете о LF не как «перейти к следующей строке», а как «конец строки», то то, что делает Vim, внезапно приобретает гораздо больший смысл.
Амадан
8

Вим только опускает EOL , если файл открыт , как 'binary' и'endofline' параметр сбрасывается (если двоичный файл не имеет EOL при открытии, или вы явно отключить опцию). Другими словами, Vim только соблюдает отсутствующий EOL для двоичных файлов. Для текстовых файлов он всегда пишет с (добавленным) EOL. (Вот почему вам нужны такие решения, как мой плагин PreserveNoEOL для хранения текстовых файлов без EOL.) Все подробности можно найти по адресу :help 'endofline'.

Таким образом, вам нужно только открыть файл как недвоичный , чтобы Vim автоматически записывал EOL.

Инго Каркат
источник
5

Как упомянул Александр , Vim не показывает EOL на EOF, поэтому это так запутанно (особенно с пустой / пустой новой строкой, что является другой вещью), поэтому фактически записывает каждый раз при сохранении файла.

Вот простой тест, как проверить, работает ли это:

$ printf foo > foo.txt
$ cat foo.txt
foo$ wc foo.txt
0 1 3 foo.txt
$ vim -cwq foo.txt
$ cat foo.txt
foo
$ wc foo.txt
1 1 4 foo.txt

Обратите внимание на поведение командной строки при отсутствии EOL (оно смешивается со следующей строкой). При повторном сохранении файла с Vim, он добавляет его.

Используя wcмы можем считать строки, слова и символы перед сохранением и после, чтобы мы могли видеть, что это действительно изменяется.

Почему это так важно? Чтобы наши файлы были совместимы с POSIX .

kenorb
источник