我在具有vt52终端仿真器和unicode功能的系统上的Linux上默认安装了vim。
直到今天,一切正常为止,当我将vt52 terminfo文件从临时本地用户目录移至永久系统目录时……起初看起来还不错,但是突然之间,当我尝试通过按Enter执行冒号命令时(CTRL-J
或键本身==十进制10),vim只会闪烁屏幕,但不执行命令或退出命令输入模式。
但是,如果按CTRL-M
来获取回车符(十进制13),则vim会接受该命令。
我尝试再次将文件复制回~/.terminfo
,但无法解决问题...
我以为这可能是tty问题或损坏的vimrc文件,所以...
首先,我尝试删除.viminfo
和.vimrc
文件,并在启动vim之前执行stty sane
,但均无济于事。我只是注意到enter在插入模式下也不起作用,但是CTRL-M可以。
然后,我使用CTRL-V
从bash shell中进行了检查,当我按CTRL-M时,它显示^M
,而当我按CTRL-J
时,它只是输入而什么也不显示。所以-要仔细检查-我做了一个stty raw
和cat - | hexdumpx
,并确信按下Enter键仅返回0x0a
,而按下CTRL-M
仅返回0x0d
;因此,键盘驱动程序在原始模式下返回了正确的字符,而我在理智的模式下进行了重新测试,这显然将它们都映射到了0x0A
。
我使用tic重新编译了termcap文件,并将其复制到~/.terminfo/v/vt52u
之前可以正常工作的位置,然后复制到/usr/share/terminfo/v/vt52u
。
但是我在termcap文件中没有看到任何可能引起此问题的信息。
vt52u|vt52 with UTF-8:\
:am:eo:rs=\Ee\Eb0\Eco:is=\EE\Ee:\
:nl=^j:sr=\EI:bl=^g:ta=^i:\
:ho=\EH:cr=^m:le=\ED:nd=\EC:do=\EB:up=\EA:ta=^i:nw=^j^m:xn:\
:cm=\EY%+ %+ :it#8:co#75:li#24:\
:sc=\Ej:rc=\Ek:\
:vi=\Ef:ve=\Ee:\
:so=\Eb0\Ec3:se=\Eb0\Eco:mh=\Eb8\Eco:mr=\Ebo\Ec0:me=\Eb0\Eco:\
:cl=\EH\EJ:cb=\Eo:cd=\EJ:ce=\EK:\
:km:kb=^h:
编辑:
我已通过下面列出的实验5隔离了该问题,这是由于上述termcap文件中的某些内容丢失或由tic编译器将其转换为terminfo引起的。
那么-缺少哪个termcap条目或哪个现有的capcap引起了该问题?
----------------------我尝试找出其他实验-------------------
1:在vim中执行
:set term
会显示term=vt52u
....这是正确的。所以VIM应该使用上面的termcap文件,但是我不知道从哪里来(例如:缓存版本,或者没有-或已损坏。),:version仅显示+ termcap,这表明vim应该使用tic编译的termcap文件。这就是我一直试图给予的。2:我重新编译了ncurses-5.9,并重新安装了它,以确保绝对没有损坏的文件存在。甚至没有改变:
./configure --prefix=/usr --without-cxx --without-cxx-binding --without-ada --without-manpages --without-progs --without-tests --with-build-cc=gcc --with-shared --without-debug --without-profile --without-gpm --without-dlsym --without-sysmouse --enable-sigwinch --enable-hashmap --enable-scroll-hints --build=i686-linux --host=arm-linux-gnueabi --without-pthread --enable-widec --with-fallbacks=vt52u --disable-big-core --enable-termcap --enable-getcap-cache
3:执行
:set termcap
会显示比termcap文件更多的已定义键,这很糟糕... termcap仅定义了一个键...而且该键应为^ H而不是^ ?,因此VIM的值不匹配,但是其他termcap值都匹配,因为^ [与termcap文件中的转义\E相同。因此,我有证据表明vim肯定会加载正确的termcap文件,因为t_so的值是vt52u唯一的。所以-这不是一个损坏的termcap .... :(很奇怪。t_kb <BS> ^? <DecMouse> ^[[
t_kd <Down> ^@ <NetMouse> ^[}
t_sr=^[I t_bc=^[D t_le=^[D t_cd=^[J t_ce=^[K t_cl=^[H^[J
t_me=^[b0^[co t_mr=^[b0^[co t_ve=^[e t_vi=^[f t_nd=^[C t_se=^[b0^[c0
t_ZH=^[bo^[c0 t_ZR=^[b0^[co t_so=^b0^[c3 t_cm=^[Y%p1%' '%+%c%p2%' '%+%c
4:重新编译了vim 7.4,以删除所有内置终端,并确保没有损坏的文件。没有效果;未修复退格键的默认值错误。
echo "Please Edit feature.h so that NO_BUILTIN_TERMCAPS is always #defined."
sleep 5
vim /src/feature.h
./configure --prefix=/usr/ --build=i686-linux --host=arm-linux-gnueabi --with-features=big --disable-darwin --disable-selinux --disable-xsmp --disable-xsmp-interact --disable-mzschemeinterp --disable-tclinterp --disable-netbeans --disable-sniff --disable-gui --disable-cscope --disable-workshop --enable-multibyte --disable-gtktest --disable-gpm --disable-sysmouse --disable-xim --enable-pythoninterp=dynamic --without-x --with-tlib=ncursesw vim_cv_toupper_broken="yes" vim_cv_terminfo="yes" vim_cv_tty_group="world" vim_cv_tty_mode="0620" vim_cv_getcwd_broken="yes" vim_cv_stat_ignores_slash="yes" vim_cv_memmove_handles_overlap="yes"
echo "Please Edit src/Makefile such that STRIP=arm-linux-gnueabi-strip"
sleep 5
vim src/Makefile
make
make install
5:在bash中,我将终端类型更改为通用的“export TERM = VT52”,而不是unicode版本,并使用tic进行了颜色支持。 **换行符已经解决了颜色命令和VT52U的其他功能的问题** 我需要这些功能,但是显然我上面列出的termcap文件有些缺陷。
最佳答案
这是一个丑陋的错误,可以通过反复试验来跟踪。
Vim似乎需要定义keydown,如果未定义,则假定默认值为^ @;。由于未知的原因,它然后将回车键视为按下键,而不是换行键。逻辑上,^ @是字符代码0的值,为null;这是唯一会在写有vim的“C”中的空字符串中找到的字符,并且似乎触发了问题/功能/错误。
但是无论如何,在开篇文章中显示的termcap中,都不会定义kd符号;这就是导致问题的原因。
在vim中,可以通过将termcap keydown变量设置为与通常退出插入模式相同的转义序列,然后执行字母j(向下)来解决该问题:
:set t_kd =\Ej
相同的默认值也总是可以添加到termcap条目中;
由于这是输入转义序列,而不是终端输出转义序列,因此它与termcap中定义的VT52的“保存光标”转义序列没有冲突;例如:VT52将永远不会看到它,因为在行输入模式下Linux tty不会回显从键盘返回到终端输出的转义序列。
如果终端没有真正的箭头键-将箭头键定义为vim的h,j,k和l键的转义版本,只要它不与其他可能想要的程序冲突,则可能是一个合理兼容的解决方案。将这些输入转义序列用于其他用途。我不使用emacs和其他流行的程序,这些程序可能需要这些转义序列来处理某些内容,因此,如果其他人知道哪个(如果有)程序在该解决方案上会遇到问题,则应添加注释。
在ncurses 5.9中,terminfo编译器中似乎存在一个错误,因此在许多安装中(例如:slackware 14),“tic”将不能编译terminfo源文件,而只能编译termcap源文件。如果要使用任意终端的termcap源代码,则可以运行“infocmp -C fooTerminalName> fooTerminalName.tcap”,使系统为您生成一个termcap源文件,可以使用tic成功对其进行编辑和重新编译。