通常,当我想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
的功能,您会看到:xterm
konsole
linux
$ 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
这应该可以解决它:)