Як зробити так, щоб vim автоматично додав новий рядок до кінця файлу?


16

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

Як змусити vim постійно писати новий рядок у кінці файлу (коли файл не є двійковим і його ще немає)?

Я тестував eolваріант, але він не працював так, як очікувалося.

Дивіться також: Збережіть пропущений кінець рядка в кінці текстових файлів , але навпаки. І: Чому файли повинні закінчуватися новим рядком?

Відповіді:


17

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

Vim не показує останній новий рядок у буфері, але насправді vim завжди розміщує EOL в кінці файлу, коли ви пишете його, оскільки він стандартний для текстових файлів в системах Unix. Ви можете знайти більше інформації про це тут . Якщо коротко, вам не доведеться турбуватися про відсутність нових рядків у кінці файлу in vim.

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

Ви можете зробити цей невеликий експеримент, щоб перевірити цю поведінку. У терміналі виконують:

$ vim test_test

Введіть символ 1і збережіть файл :wq.

У вас є лише один символ у файлі, правда? Насправді ні :) Зараз у вас є ваш файл 1та LFсимволи. Давайте перевіримо це за допомогою утиліти hexdump:

$ hexdump test_test
0000000 31 0a
0000002

31є кодом ASCII для символу 1, і 0aце ASCII код для недрукувального 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символи як $знак.


Чудово. Я дійшов такого ж висновку після своєї плутанини, бо Вім насправді не показував мені цю нову лінію, але вона була там після збереження.
kenorb

1
@kenorb, до речі, ви можете показати всі чари EOL, використовуючи цю команду:set listchars=eol:$
Олександр Мишов

"насправді не показував мені цей новий рядок" - в Unix немає рядка. Рядок визначається як "кількість символів, що не належать до 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 відповідали .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.