【发布时间】:2020-04-27 21:54:26
【问题描述】:
当我在 vim 中处于插入模式并使用箭头键时,它会发送看起来像字母和回车的内容。例如,按下 ↑ 它发送:
A
它看起来像 A\n,但我不确定它发送的确切字符/代码。为什么会发生这种情况,有没有办法禁用它?
【问题讨论】:
当我在 vim 中处于插入模式并使用箭头键时,它会发送看起来像字母和回车的内容。例如,按下 ↑ 它发送:
A
它看起来像 A\n,但我不确定它发送的确切字符/代码。为什么会发生这种情况,有没有办法禁用它?
【问题讨论】:
终端发送的向上箭头的通常序列是<Esc>OA或^[OA(^[序列代表<Esc>键,也相当于Ctrl+[。)
如果您的 Vim 无法将此序列识别为向上箭头,它将最终执行此序列:<Esc> 将离开插入模式并进入正常模式,然后O 在当前行上方插入新行一并进入插入模式,然后插入文字A,因为您将再次处于插入模式。
您可以通过在插入模式下输入Ctrl+V 后跟向上箭头来确认这确实是您的终端发送 Vim 的顺序。 (插入模式下的Ctrl+V 按字面意思插入下一个字符。)我希望您会看到插入的^[OA 序列。
然后你可以用:set <Up> 命令检查你的Vim 认为向上箭头的顺序是什么。我希望您会看到类似的内容:
t_ku <Up> ^[OA
(t_ku 是与此向上箭头键对应的设置的内部名称。您也可以使用:set termcap 查看与终端相关的所有 Vim 设置,包括特殊键码。)
如果其中任何一个不符合预期,这可以解释为什么您的 Vim 无法识别向上箭头键。 (另一种解释是 'ttimeoutlen' 设置得太短,但我认为这不太可能。)
这些设置通常由'term' 设置管理。默认情况下,它是根据你在 Vim 之外的 shell 上的 $TERM 设置的。
你可以先看看 Vim 认为 'term' 是什么,以及它是从哪里设置的:
:verbose set term?
term=screen-256color
Last set from ~/.vimrc line 100
:verbose 部分要求 Vim 告诉你它是从哪里设置的,所以你会看到你的 vimrc 或你的插件之一是否覆盖了它。如果 Vim 没有显示这些,则意味着它来自 shell 中的 $TERM 变量。
所以看看$TERM 在 Vim 之外的设置,看看这是否正确。您是否在某处明确设置?它是 shell 的初始化文件之一,还是来自您的终端模拟器本身?
无论您使用的是 tmux 还是 screen,也可能相关,在这种情况下,您应该仔细检查 $TERM 是否在 inside tmux 或 screen 以及 outside 它。
希望所有这些提示都能引导您朝着正确的方向解决这个问题。如果您无法弄清楚,请将您的发现作为 cmets 发布在此答案上,我将使用您可以尝试的更具体的修复程序对其进行更新。
【讨论】:
t_kd <Down> ^[OB t_kl <Left> ^[OD t_kr <Right> ^[OC t_ku <Up> ^[OA 和 term 我得到:term=screen-256color
您可能处于 vi 兼容模式。试试:set nocompatible
如果这使它按您的意愿运行,请将set nocompatible 放在您的 vimrc 文件的顶部以使其默认为该行为。
【讨论】:
:set compatible,那么它会表现出您描述的行为。我相信几年前我有个同事也有同样的问题。我认为这发生在他身上,因为他会使用 vi 别名运行它,这会导致它以 vi 模式打开。