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

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

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

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

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

操作系统:Kubuntu 13.04(全新安装)

答案1

我想我知道发生了什么事。

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

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

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

例如,密钥在 kx 模式下Up发送,在非 kx 模式下发送。\eOA\e[A

smkx要将终端设置为 kx 模式,它会在 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=,

smkx条目中没有定义linux

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

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

\e[A, \e(ESC) 离开插入模式,[A是一个未知组合(在vim,中[是一个前缀,并且后面总是跟着另一个字符),因此不执行任何操作。

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

答案2

解决这个问题的快速方法是:

echo "set nocp" > ~/.vimrc

这应该可以解决它:)

相关内容