vim 中插入模式下的箭头键

Arrow keys in insert mode in vim

当我在 vim 中处于插入模式并使用箭头键时,它发送的内容看起来像是一个字母和一个回车符 return。例如,按 它发送:

A

它看起来像 A\n,但我不确定 characters/codes 它发送的到底是什么。为什么会发生这种情况,有没有办法禁用它?

您可能处于 vi 兼容模式。尝试 :set nocompatible

如果这使它如您所愿地运行,请将 set nocompatible 放在您的 vimrc 文件的顶部,以使其默认为此行为。

终端为向上箭头发送的通常序列是<Esc>OA^[OA^[序列代表<Esc>键,也相当于Ctrl+[.)

如果您的 Vim 无法将此序列识别为向上箭头,它将最终执行此序列:<Esc> 这将离开插入模式并进入正常模式,然后 O 在当前行上方插入一个新行并进入插入模式,然后插入文字 A 因为您将再次处于插入模式。

您可以确认这确实是您的终端发送 Vim 的序列,方法是在插入模式下键入 Ctrl+V,然后按向上箭头。 (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 显示 none,则表示它来自 shell.

中的 $TERM 变量

所以看看 $TERM 设置在 Vim 之外的内容,看看它是否正确。你是在某处明确设置的吗?它是 shell 的初始化文件之一还是来自您的终端仿真器本身?

也可能与您使用的是 tmux 还是屏幕有关,在这种情况下,您应该仔细检查 $TERM 是否也正确设置 inside tmux 或屏幕,而且它之外。

希望所有这些提示都能引导您朝着正确的方向解决这个问题。如果你不明白,post 你的发现作为对此答案的评论,我会用更具体的修复来更新它,你可以尝试。