Vim不会接受换行作为输入

时间:2014-06-24 21:01:55

标签: linux vim

我在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 rawcat - | 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文件有些缺陷。

1 个答案:

答案 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成功编辑和重新编译。