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,
- 删除所有 ^M 字符:
:%s/<C-V><cr>//ge<cr>
。您可以将其合并到函数或自动命令中。
- 将缓冲区标记为仅使用 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
有时我必须在 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,
- 删除所有 ^M 字符:
:%s/<C-V><cr>//ge<cr>
。您可以将其合并到函数或自动命令中。 - 将缓冲区标记为仅使用 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