当我在vim中处于插入模式并使用箭头键时,它会发送一个看起来像字母和回车的信息。例如,按↑它发送:
A
它看起来像An
,但我不确定它到底发送了什么字符/代码。为什么会发生这种情况,有没有办法禁用这种情况?
终端为向上箭头发送的通常序列是<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
是否在tmux或screen内部以及外部都设置正确。
希望所有这些提示都能引导你朝着正确的方向解决这个问题。如果你不能弄清楚,请将你的发现作为对此答案的评论发布,我会用你可以尝试的更具体的修复方法更新它。
您可能处于vi兼容模式。尝试:set nocompatible
如果这使它按您想要的方式运行,请将set nocompatible
放在vimrc文件的顶部,使其默认为这种行为。