我在Linux上安装了vim,在具有vt52终端仿真器和unicode功能的系统上。
直到今天,当我将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
,确定按下回车只返回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条目或哪个现有条目导致问题?
----------------------我试图解决的其他实验---------------- ---
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文件中的escape \ E相同。所以,我有证据表明vim肯定会加载正确的termcap文件,因为t_so的值对于vt52u是唯一的。所以 - 这不是一个腐败的术语...... :(很奇怪。
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编译的颜色支持。 ** NEWLINE问题出现了明显的颜色命令和VT52U的其他功能** 我需要这些功能,但显然我上面列出的termcap文件有些缺陷。
答案 0 :(得分:1)
这是一个难以捉摸的错误,可以通过反复试验来追踪......
Vim似乎需要定义keydown,如果没有定义,则假定默认值为^ @;由于未知原因,它然后将回车键视为关键,而不是换行符。 ^ @逻辑上是字符代码0的值,null;这是在&#34; C&#34;中的空字符串中找到的唯一字符。哪个vim被写入并且似乎触发了问题/功能/ bug。
但是无论如何在开幕式中显示的termcap中,kd符号都没有定义;这就是导致问题的原因。
在vim中,可以通过将termcap keydown变量设置为通常退出插入模式的相同转义序列,然后执行字母j(向下)来解决问题: :set t_kd = \ Ej
同样的默认值也可以随时添加到termcap条目中; 由于这是输入转义序列而不是终端输出转义序列,因此它不会与VT52&#34;保存游标&#34; termcap中定义的转义序列;例如:自从Linux tty进入线路输入模式后,VT52将永远不会看到它,它不会将从键盘返回的转义序列回显到终端的输出。
如果终端没有真正的箭头键 - 将箭头键定义为vim&#39; sh,j,k和l键的转义版本可能是一个合理兼容的解决方案,只要它没有&# 39;与可能想要将这些输入转义序列用于其他事物的其他程序冲突。我没有使用emacs和其他可能需要这些转义序列的流行程序,所以如果其他人知道哪个(如果有的话)程序会遇到问题,那么评论就是合适的。
在ncurses 5.9中,terminfo编译器中似乎存在一个错误,因此在许多安装中(例如:slackware 14),&#39; tic&#39;将无法编译terminfo源文件 - 但只能编译termcap源文件。如果你想要任意终端的termcap源代码,你可以运行&#34; infocmp -C fooTerminalName&gt; fooTerminalName.tcap&#34;让系统为您生成一个termcap源文件,可以使用tic成功编辑和重新编译。