xterm 中的 TERM=(linux|xterm) vi 或 AAABBBBBBCCDDD 问题

jip*_*pie 3 vim xterm console key-mapping

通常当我想vim在桌面konsole会话中运行时,我确保将 TERM 变量设置linux为箭头键在插入模式下不起作用TERM=xterm。它们显示大写 A..D 而不是移动光标。

现在我认为这是错误的做事方式,konsole或者xterm实际上是类型xterm

有没有更好的方法让箭头键在vi/下工作vim

操作系统:Kubuntu 13.04(干净安装)

Sté*_*las 5

我想我知道发生了什么。

您尚未配置vim为禁用vi兼容模式。

在 中vi,您只能在命令模式下按方向键。在插入模式下,按箭头键发送的字符序列被视为单独输入的字符。

现在,在启动时,vi将终端设置为键盘传输模式(kx)。在这种模式下,终端通常在按下箭头键时发送与不按下时不同的字符序列。

例如,Up密钥\eOA以 kx 模式发送,\e[A何时不发送。

要将终端设置为 kx 模式,它会smkx在 terminfo 数据库中查找(设置模式键盘传输)功能以获取 的当前值$TERM

如果您查看,和的smkx功能,您会看到:xtermkonsolelinux

$ infocmp -1 linux | grep smkx
$ infocmp -1 xterm | grep smkx
    smkx=\E[?1h\E=,
$ infocmp -1 konsole | grep smkx
    smkx=\E[?1h\E=,
Run Code Online (Sandbox Code Playgroud)

smkxlinux条目中没有定义。

这意味着当您以 开头vimTERM=linux,vim 不会将终端设置为 kx 模式,这意味着它会发送,\e[A而不是\eOA在您按下Up键时发送。

现在,\eOA当您处于插入模式时,vim会做什么?\e(ESC),离开插入模式并返回命令模式。O打开一个新行并再次进入插入模式,A插入A字符。

虽然\e[A, \e(ESC) 离开插入模式,[A是一个未知的组合(in vim,[是一个前缀,后面总是跟另一个字符),所以什么都不做。

所以你需要做的是:保持$TERM原样,在vi兼容时不要在插入模式下使用箭头键,或者set nocp向你添加一个,~/.vimrc这样你就可以在插入模式下使用箭头键。