Vim 为什么可以';t grep显示找到的行是否包含^M(必须是unix新行)字符?
我的vimrc文件中有宏行,如:Vim 为什么可以';t grep显示找到的行是否包含^M(必须是unix新行)字符?,vim,terminal,grep,newline,ansi-escape,Vim,Terminal,Grep,Newline,Ansi Escape,我的vimrc文件中有宏行,如: let @i = "oif (^[a) {^[a^M}^[k0f)" 其中“^[”和“^M”是在插入模式下通过“Ctrl-V”输入的字符,因此它们必须是转义和换行符(我使用的是Linux,Vim配置为使用“\n”换行符,但我不知道这个字符在vimrc文件中到底是什么) 当我用grep-b2'I=“”~/.vimrc搜索这样一行时,我看到一个完全中断的输出: hi Comment cterm=none ctermbg=226 ctermfg=009 guibg=
let @i = "oif (^[a) {^[a^M}^[k0f)"
其中“^[”和“^M”是在插入模式下通过“Ctrl-V”输入的字符,因此它们必须是转义和换行符(我使用的是Linux,Vim配置为使用“\n”换行符,但我不知道这个字符在vimrc文件中到底是什么)
当我用grep-b2'I=“”~/.vimrc
搜索这样一行时,我看到一个完全中断的输出:
hi Comment cterm=none ctermbg=226 ctermfg=009 guibg=#ffff00 guifg=#ff0000
}0f)"i = "oif () {
虽然我想:
hi Comment cterm=none ctermbg=226 ctermfg=009 guibg=#ffff00 guifg=#ff0000
let @i = "oif (^[a) {^[a^M}^[k0f)"
或者至少是类似的,第三行以let@i
开头。但是我看到}0f)“i=”oif(){
并且没有let@i
的迹象
我试着进行了一些调查,发现在该行包含“^M”字符之前,它都能正常工作。
有谁能告诉我如何修复它,或者至少解释一下发生了什么吗?
grep
正在发送
(例如^[a
和^[k
;请参阅)
和
(^M
)到终端时,他们正在干扰输出,这是
被其他命令过滤时显示,如:
grep -B 2 'i = "' ~/.vimrc | cat -v
或
这就是关于-v
-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
以下是相关的剪报:
这些控制序列通常用于发送不可打印的字符
到终端,允许用户通过添加
(前景和背景)颜色,移动光标等
无效的转义序列,如^[a
和^[k
被忽略,因此您将获得
如果宏的定义如下,则会出现相同的问题:
let @i = "oif () {^M}0f)"
被调用并通知终端
在打印该行的其余部分之前,将光标移动到行的开头
输出(将覆盖以前的输出)。这类似于键入0
在正常模式下,按R
,然后输入
}0f)"
你自己在:
let @i = "oif () {^M}0f)"
我希望这个答案是有帮助的。挑剔:
^[a
和^[k
被称为转义序列,因为^[
是转义。^M
不是转义序列:没有转义……从技术上讲,它只是一个序列(因为它是一个字符).这是一个控制字符。我想你们可以统称它们为控制序列。
}0f)"
let @i = "oif () {^M}0f)"