Просто чтобы уточнить, почему :set list
не будет отображать CR как ^M
без e ++ff=unix
и почему :set list
не имеет ничего общего с ^M
.
Внутренне, когда Vim читает файл в его буфер, он заменяет все символы конца строки своим собственным представлением (назовем его $
).Чтобы определить, какие символы следует удалить, он сначала определяет, в каком формате окончания строк хранятся в файле.Если есть только CRLF '\r\n'
или только CR '\r'
или только LF '\n'
символы конца строки, то 'fileformat'
устанавливается на dos
, mac
и unix
соответственно.
Когда установлена опция list
, Vim отображает символ $
, когда произошел разрыв строки, независимо от того, какая опция fileformat
была обнаружена.Он использует свое собственное внутреннее представление переносов строк, и именно это он отображает.
Теперь, когда вы записываете буфер на диск, Vim вставляет символы конца строки в соответствии с параметрами fileformat
был обнаружен, преобразовывая все эти внутренние $
с соответствующими символами.Если fileformat
оказалось unix
, то вместо внутреннего переноса строки он просто напишет \n
.
Хитрость заключается в том, чтобы заставить Vim читать закодированный файл dos
как unix
один.В результате он удалит все \n
, оставляя \r
нетронутыми, и отобразит их как ^M
в вашем буфере.Установка :set list
дополнительно покажет внутренние окончания строки как $
.В конце концов, вы видите ^M$
вместо закодированных dos
разрывов строк.
Также обратите внимание, что :set list
не имеет ничего общего с отображением ^M
.Вы можете проверить это самостоятельно (сначала убедитесь, что вы отключили опцию list
), вставив один CR, используя CTRL-V
, а затем Enter
в режиме вставки.После записи буфера на диск и его повторного открытия вы получите ses ^M
, несмотря на то, что для параметра list
установлено значение 0.
Подробнее о форматах файлов можно узнать по http://vim.wikia.com/wiki/File_format или набрав :help 'fileformat'
в Vim.