重新映射MacVim 激怒了 Vim 本身

重新映射MacVim 激怒了 Vim 本身

我的中有以下几行.vimrc

nnoremap <Esc> :noh<Cr>

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

.2c

不管怎样,当输入回车来执行命令时,Vim 会发出抱怨E16: Invalid range

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

答案1

绘图Esc总是有点棘手,而且通常会引起这种麻烦,尽管它不应该发生。

映射的“规范”方法是:

nnoremap <silent> <C-l> :nohlsearch<CR><C-l>

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


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

nnoremap <Esc> :"

启动时出现以下提示:

:"[>0;261;0c

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

ESC [         Control Sequence Introducer (CSI is 0x9b)

CSI >C

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

= 0 或省略 → 请求终端的识别码。响应取决于十进制终端ID 资源设置。它应该只适用于 VT220 及以上版本,但终端将其扩展至 VT100。

→ 犯罪现场调查 >磷灰石

在哪里表示终端类型

= 0 → “VT100”。
= 1 → “VT220”。

是固件版本(对于终端,这原本是 XFree86 补丁号,以 95 开头)。在 DEC 终端中, 个人电脑表示 ROM 卡带注册号,始终为零。

所以在我的例子CSI >= 0(→ 终端类型 VT100),= 261(→我的xterm版本),并且个人电脑= 0。

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

答案2

问题在于,对于某些终端,vim 以这种方式接收 [>0;261;0c。最后一个“c”使 vim 启动很麻烦,但我找到了在启动时跳过第一个“c”的简单技巧:

nnoremap c :nunmap c<Cr>

相关内容