Почему я не вижу разницы между двумя разными файлами в режиме вставки в vim?

8

Давайте создадим два файла:

$ echo -n 'test' > test.txt
$ wc test.txt 
0 1 4 test.txt

Файл test.txtне содержит завершающий перевод строки.

$ echo 'test' > test_n.txt
$ wc test_n.txt 
1 1 5 test_n.txt

Файл test_n.txtсодержит завершающий перевод строки.

Эти два файла, очевидно , разные, но предварительный просмотр обоих файлов в vimв режиме вставки не содержат каких - либо различий:

$ vim test.txt

введите описание изображения здесь

$ vim test_n.txt

введите описание изображения здесь

Почему нет разницы (новая строка или какое-то особое различие)?

А что я могу сделать , чтобы добавить или удалить такой дополнительный символ в vimв режиме вставки ?

simhumileco
источник
4
«: set list» покажет разницу, и есть режим, который вы можете проверить. Оба находятся в справочных файлах.
Томас Дики
Спасибо @ThomasDickey, я не знал этот вариант раньше.
simhumileco
1
@ThomasDickey, если вы хотите добавить ответ, вероятно, это будет принятый ответ. Спасибо.
simhumileco
2
@filbranden, пожалуйста, не оставляйте ответы в комментариях. Сообщество не может голосовать за ответы в комментариях и не помечает вопрос как ответивший.
Terdon
2
@ThomasDickey смотри выше. Пожалуйста, опубликуйте это как ответ.
Terdon

Ответы:

12

vim имеет режим "eol" (для конца строки), чтобы указать, что делать, если в последней строке файла отсутствует символ новой строки . Вы можете увидеть все настройки режима в vim (или любой программе, например vi)

:set all

POSIX VI не имеет функций для этого: файлы либо нулевой длиной, или имеет косой символ новой строки. Это потому, что POSIX vi имеет дело только с текстовыми файлами, которые по определению являются строками, заканчивающимися символами новой строки. При быстрой проверке nvi и elvis не имеют режимов для этого. В своем комментарии я забыл подробности vim: в отличие от vile, ": set list" не всегда показывает отсутствующий символ новой строки. Вот что я вижу в vim:

ssss$
test$
~
~

пока в подлости

ssss^J
test
~
~

Для любого редактора вы можете прочитать файл в, изменить режим , например,

:set noeol

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

"foo" [noeol] 2L, 9C                                          1,1           All

Один из комментариев предлагает использовать «?» Модификатор в setкоманде, например,

:set eol?

который может показать что-то вроде этого:

noendofline                                                   2,1           All

но в режиме вставки это заменяется

-- INSERT --                                                  2,1           All

таким образом, строка состояния кажется правильным местом для сохранения этой информации.

Функции были там некоторое время:

  • Эта eolфункция впервые появилась в vim 2.4 (июль 1994 года), согласно комментарию в ее исходном коде.

  • мерзкий newlineрежим появился в июле 1993 года .

( nvi, elvis, vim и vile все обрабатывают двоичные файлы в дополнение к текстовым файлам POSIX vi ).

Томас Дики
источник
2
почти 20 лет пользуюсь vim, и я до сих пор узнаю что-то новое и я все еще боюсь emacs. : D
Тим Кеннеди
1
В vim вы также :set eol?можете увидеть, включен или выключен eol, поэтому вам не нужно просматривать весь вывод :set all.
Кевин
Менее запутанный способ сказать, что «файлы либо имеют нулевую длину, либо имеют завершающий символ новой строки», это «все строки заканчиваются символом новой строки, а текстовый файл представляет собой последовательность из нуля или более строк».
R .. GitHub ОСТАНОВИТЬСЯ ПОМОЩЬ ЛЬДУ