1

When I try to execute my script I got ^M is an invalid character but in Vim, I see $ upon entering :set list

I tried :%s/^V^M//g but it says ^M pattern is not found

I guessed this occurred because I used some .vimrc I found here which converts the end of line characters to $

Without figuring this out, my only option would be retyping my script.

4

4 回答 4

3

看起来您的脚本始终具有^M行尾,因此被检测为fileformat=dos. :setlocal fileformat?会告诉你。

要将此文件转换为 Unix (LF) 行结尾,只需:setlocal fileformat=unixand:write或将其组合到:w ++ff=unix.

如果你不想让 Vim 检测到这些文件(并显示它们^M),请放入:set fileformats-=dos你的~/.vimrc(或编辑现有配置)。

于 2013-10-02T15:43:34.727 回答
2

se nolist美元符号将消失。

无论操作系统如何,您的文本中总是有行尾。

行尾是空格并且始终存在,但通常只是不显示。

于 2013-10-02T15:42:53.100 回答
0

如果打开文件后你没有看到^M行尾,但是当你尝试采购它时,vim 确实在各个地方显示抱怨^M,你唯一需要做的就是w ++ff=unix重新打开这个文件。

当你打开一个文件时,vim 会检测到行结束格式。因此尝试替换^M将不起作用:所有检测到的行结尾都转换为内部字符串结尾。例如,当文件格式与您的情况类似时,它看起来像

set nocompatible\r\nset ignorecase\r\n...

(其中\r是回车,有时表示为^M,并且\n是换行符,\r\nsequence 是 dos 行结束符)。当文件格式是 unix 时,它看起来像

set nocompatible\nset ignorecase\n...

. 对于 mac,它看起来像

set nocompatible\rset ignorecase\r...

. 但是如果 vim 正确检测到行结束所有这些文件转换为

"set nocompatible"
"set ignorecase"
"..."

C 内部结构中的字符串表示缓冲区,每个字符串代表一行。没有\r也没有\n

当您这样做时,:w文件将转换回字节序列。:w ++ff=unix强制行结束。需要重新打开,因为fileformat在这种情况下不会更改设置,因此 next wwithout++ff将再次以 dos 行结尾保存。当您重新打开行尾时,会重新检测并fileformat重新分配设置。您可以在:set fileformat=unix之后手动执行:w ++ff=unix,但:e输入速度要快得多。

于 2013-10-02T15:54:55.457 回答
0

您使用的是 Windows 还是 *nix?

在windows中,你可以替换^M作为ctlr-q ctrl-m输入^M。在 *nix 中,您可以只使用 dos2unix 将您的脚本文件转换为 unix 格式。

于 2013-10-02T15:34:39.357 回答