在 MacVim 中重新映射 <Esc> 激怒了 Vim 本身

Clo*_*boy 5 remapping vim

我在我的以下行.vimrc

nnoremap <Esc> :noh<Cr>
Run Code Online (Sandbox Code Playgroud)

这在 MacVim 中运行良好。每当我打开 Vim 本身时,它的“命令栏”开始于:

.2c
Run Code Online (Sandbox Code Playgroud)

值得一提的是,当输入执行命令时,Vim 用E16: Invalid range.

这是一个小烦恼,但我该如何解决这个问题?

pet*_*eth 3

映射Esc总是有点棘手,并且通常会引发这种麻烦,尽管它不应该发生。

\n\n

映射的“规范”方法是:

\n\n
nnoremap <silent> <C-l> :nohlsearch<CR><C-l>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样Ctrl+L(通常会重新绘制屏幕)将停止突出显示重新绘制屏幕。

\n\n
\n\n

我想我已经知道发生了什么,但我仍然没有解决办法。我假设 Vim 收到一个包含 an 和“2c”的字符串<ESC>,因此我使用以下映射使其可见:

\n\n
nnoremap <Esc> :"\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果启动时出现以下提示:

\n\n
:"[>0;261;0c\n
Run Code Online (Sandbox Code Playgroud)\n\n

这意味着<ESC>[>0;261;0c启动时发送的内容。现在查找原始xterm控制序列,我们发现:

\n\n
ESC [         Control Sequence Introducer (CSI is 0x9b)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
\n

CSI > P s c

\n\n

发送设备属性(辅助 DA)。

\n\n

P s = 0 或省略\xe2\x86\x92 请求终端\xe2\x80\x99s 识别码。响应取决于decTerminalID资源设置。它应该仅适用于 VT220 及更高版本,但xterm将其扩展到 VT100。

\n\n

\xe2\x86\x92 CSI > P pP v ; 个人电脑

\n\n

其中P p表示终端类型

\n\n

P p = 0 \xe2\x86\x92 \xe2\x80\x98\xe2\x80\x98VT100\xe2\x80\x99\xe2\x80\x99。
\n P p = 1 \xe2\x86\x92 \xe2\x80\x98\xe2\x80\x98VT220\xe2\x80\x99\xe2\x80\x99。

\n\n

P v是固件版本(对于xterm来说,这最初是 XFree86 补丁号,以 95 开头)。在 DEC 终端中, P c表示 ROM 盒的注册号,并且始终为零。

\n
\n\n

因此,在我的情况下,发送的内容CSI >P p = 0(\xe2\x86\x92 终端类型 VT100)、P v = 261(\xe2\x86\x92 我的xterm版本)和P c = 0。

\n\n

我仍然不知道它从哪里来,也不知道如何阻止它。我最好的猜测是终端和 Vim 之间的某些信息交换失败并且出现了问题。

\n