Linux 上是否有允许我查看换行符和回车符的文本编辑器? Vim 支持这个功能吗?
不同意官方回答:
:set list
将不显示 ^M 个字符 (CR)。为 vi/Vim 提供 -b 选项将起作用。或者,一旦 Vim 被加载,输入 :e ++ff=unix
。
假设你对 :set listchars=...
的 vim 设置设置为可视化你试图看到的字符,在这种情况下是回车符(用 CTL + V,CTRM + M 键入)——否则,正如对此答案的许多评论中所报告的那样,^M 字符将不会显示在 :set list
Vim 中的 :set list
将显示空格。行尾显示为“$
”,回车通常显示为“^M
”。
:set list
不会显示 ^M
个字符 (CR)。为 vi/vim 提供 -b
选项将起作用。或者,一旦加载 vim,输入::e ++ff=unix
:set nolist
fileformat
是 unix
时,Vim 才会显示 ^M 字符。这通常发生在一行或多行以 \n
unix 样式的换行符结尾,但其他行以 Windows 使用的 \r\n
CRLF 组合结尾时。然后以 CRLF 行结尾的行将显示 ^M 字符。
vi 通过在下一行显示后续文本来显示换行符(LF 字符,代码 x0A
)。
使用 -b
开关进行二进制模式。例如,vi -b filename
或 vim -b filename --
。
然后它将在 Unix 样式文件中通常不使用的 CR 字符 (x0D
) 显示为字符 ^M
。
Unix
环境中工作。但是,如果文件中有任何 Windows 类型行结尾,我想被警告。如果 vi -b filename
或 :set binary
是 windows 类型的文件并且没有其他行结尾,是否会只显示 ^M
?
只是为了澄清为什么 :set list
不会在没有 e ++ff=unix
的情况下将 CR 显示为 ^M
以及为什么 :set list
与 ^M
无关。
在内部,当 Vim 读取一个文件到它的缓冲区时,它会用它自己的表示替换所有行结束字符(我们称之为 $
)。为了确定应该删除哪些字符,它首先检测文件中存储的行尾格式。如果只有 CRLF '\r\n'
或只有 CR '\r'
或只有 LF '\n'
行结束字符,则 'fileformat'
分别设置为 dos
、mac
和 unix
。
当设置了 list
选项时,无论检测到什么 fileformat
选项,Vim 都会在出现换行时显示 $
字符。它使用自己的换行符的内部表示,这就是它所显示的内容。
现在,当您将缓冲区写入 到光盘时,Vim 会根据检测到的 fileformat
选项插入行尾字符,实质上将所有内部 $
转换为适当的字符。如果 fileformat
恰好是 unix
,那么它将简单地写入 \n
来代替其内部换行符。
诀窍是强制 Vim 将 dos
编码文件作为 unix
读取。最终效果是它将删除所有 \n
,而 \r
保持不变,并将它们显示为缓冲区中的 ^M
。设置 :set list
还会将内部行尾显示为 $
。毕竟,您会看到 ^M$
代替了 dos
编码的换行符。
另请注意,:set list
与显示 ^M
无关。您可以通过在插入模式下使用 CTRL-V
和 Enter
插入单个 CR 自行检查(确保您首先禁用了 list
选项)。将缓冲区写入光盘并再次打开后,您将看到 ^M
,尽管 list
选项设置为 0。
您可以在 http://vim.wikia.com/wiki/File_format 上或通过在 Vim 中输入:help 'fileformat'
找到有关文件格式的更多信息。
试试下面的命令。
:set binary
在 Vim 中,这应该与使用 "-b" 命令行选项做同样的事情。如果你把它放在你的启动文件(即.vimrc)中,它会一直为你准备好。
在许多 *nix 系统上,有一个“dos2unix”或“unix2dos”命令可以处理文件并纠正任何可疑的行结束问题。如果行尾没有任何问题,则不会更改文件。
set binary
与 vim -b filename.py
不同。知道为什么吗?我确实检查了help
,看来您所说的通常是正确的。我如何弄清楚为什么会这样?
:e ++ff=unix
确实正确显示了 ^M
,但在我使用 unix
类型文件时没有显示它。所以我想问题现在已经解决了...
我建议您编辑 .vimrc 文件,以运行命令列表。
编辑您的 .vimrc 文件,如下所示:
cat >> ~/.vimrc <<EOF
set ffs=unix
set encoding=utf-8
set fileencoding=utf-8
set listchars=eol:¶
set list
EOF
当你执行 Vim 时,会执行文件 .vimrc 中的命令,你可以看到这个例子:
My line with CRLF eol here ^M¶
您可以使用 gedit 编辑器查看折线。
首先,如果您没有安装它,对于基于 Debian/Ubuntu/Mint 的发行版:
sudo apt-get install gedit
对于基于 Fedora/CentOS/RedHat 的发行版:
sudo dnf install gedit
或者
sudo yum install gedit
现在,安装 gedit 插件:
sudo apt-get install gedit-plugins
或者
在 Gnome2 下,用户插件被放入 ~/.gnome2/gedit/plugins/
对于 Gnome3:~/.local/share/gedit/plugins/
从以下位置下载插件:https://help.gnome.org/users/gedit/stable/gedit-plugin-guide.html.en#gedit-additional-plugins
并选择 Draw Spaces 插件,进入 Preferences,然后选择 Draw new lines:
https://i.stack.imgur.com/2CbdF.png
https://i.stack.imgur.com/W9S74.png
使用 Visual Studio Code,您可以安装 行尾 扩展。
Sublime Text 3 有一个名为 RawLineEdit 的插件,它将显示行尾并允许插入任意行尾类型
Shift + Ctrl + P 并开始输入插件的名称,然后切换以显示行尾。
不定期副业成功案例分享
:help edit
显示e[dit]! [++opt] [+cmd]
。:help ++e
表示 [++opt] 参数可用于强制 'fileformat' [..] 的值。:set list
显示换行符 ($
),:e ++ff=unix
显示 CR (^M
);如果您想同时查看,:set list
然后:e ++ff=unix
:set ff=unix
告诉 Vim 将行尾更改为 unix 样式(作为设置文件格式的一部分),因此 ^M 字符不再存在(因此也不存在显示)。:e ++ff=unix
告诉它在不实际更改内容的情况下将文件格式强制设置为unix
。所以 vim 像 Unix 文件一样读取它,将 CR 字符视为额外字符并将它们显示为 ^M。vim
中两者都对我不起作用......我的意思既不是-b
选项,也不是:e ++ff=unix
内部:(