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 你的发现作为对此答案的评论,我会用更具体的修复来更新它,你可以尝试。
当我在 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.
$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 你的发现作为对此答案的评论,我会用更具体的修复来更新它,你可以尝试。