Vim 从 vimrc 执行 :e ++ff=dos

Vim execute :e ++ff=dos from vimrc

有时我必须在 Vim 中处理混合的 Unix/DOS 文件。该文件将在大多数行的末尾显示 ^M 。我无法将整个文件转换为 Unix 格式。

修复为 :e ++ff=dos

我尝试将它至少作为快捷方式(如果不是 autocmd)合并到我的 vimrc 中,但没有成功。

ga 对于 ^M 将显示:

<^M>  13,  Hex 0d,  Octal 15

这在 vimrc 中不起作用:

function! Fix_dos()
    execute "normal :e ++ff=dos<cr>"
endfunction

我试过一些带有隐藏功能的东西,但那不会隐藏所有 ^M 个字符。

:set conceallevel=2
:syntax match Todo /\r/ conceal

另外,有没有办法检测文件是否会显示 ^M 个字符?

感谢您的帮助。

以 DOS 文件格式打开缓冲区不会将文件转换为 UNIX 格式。仅当您希望以 DOS 方式编辑缓冲区并以 DOS 方式写入时才足够。隐藏 ^M 也不会转换 - 你的问题给我的印象是你认为它会转换。

如果你想转换为 LF-line-endings-only,

  1. 删除所有 ^M 字符::%s/<C-V><cr>//ge<cr>。您可以将其合并到函数或自动命令中。
  2. 将缓冲区标记为仅使用 LF 行结尾::setlocal ff=unix

如果你这样做:e +ff=dos,你将文件转换为DOS格式;即写入后,所有行尾将被转换为CR-LF。您已经提到您无法将整个文件转换为 Unix 格式,但如果转换为 DOS 没问题,那么这就是解决方案。

你的函数不需要经过:normal,因为:e命令是一个Ex命令,可以直接在函数中使用。对于像 dd 这样的正常模式命令,您只需要 :normal。因此,你可以改写:

function! Fix_dos()
    " This would be the correct syntax, but no need for :normal:
    "execute "normal :e ++ff=dos\<cr>"
    " Also, no need for execute:
    "execute "e ++ff=dos"
    edit ++ff=dos
endfunction

其实我会定义:

:command! FixDos edit ++ff=dos

如果您不能隐藏整个文件,您将不得不忍受 ^M;你能做的最好的就是试图隐藏它们,就像你尝试过隐藏一样。此变体可能会通过在其他语法组中应用来捕获 更多 ^M 实例:

:syntax match Todo /\r/ conceal containedin=ALL