我在Linux上有一个默认的vim安装,在一个带有vt52终端仿真器和unicode功能的系统上.
一切都工作正常,直到今天我将我的vt52 terminfo文件从临时本地用户目录移动到永久系统目录...起初看起来很好,但突然间,当我尝试通过按Enter键执行冒号命令(要么CTRL-J
,或者键本身==十进制10),vim只是闪烁屏幕但不执行命令或离开命令输入模式.但是,如果我按下CTRL-M
以获得回车符(十进制13),vim会接受该命令.
我尝试重新复制文件~/.terminfo
,但它没有解决问题...
我认为这可能是一个tty问题或损坏的vimrc文件,所以...首先我尝试删除.viminfo
和.vimrc
文件,并stty sane
在启动vim之前做一个但没有帮助.我只是注意到输入在插入模式下也不起作用,但CTRL-M确实如此.
然后我从bash shell中检查,使用CTRL-V
,当我按下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:
Run Code Online (Sandbox Code Playgroud)
编辑:我已经通过下面列出的实验5解决了这个问题,因为上面的termcap文件中有或者没有,或者是tic编译器将它转换为terminfo.
那么 - 什么termcap条目丢失或哪个现有条目导致问题?
----------------------我试图弄明白的其他实验-------------------
1::set term
在vim中做一个揭示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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
5:在bash中,我将终端类型更改为通用"export TERM = VT52"而不是unicode版本,并使用我用tic编译的颜色支持. **NEWLINE问题出现了明显的颜色命令和VT52U的其他功能** 我需要这些功能,但显然我上面列出的termcap文件有些缺陷.
这是一个丑陋的错误,需要通过反复试验来追踪......
Vim 似乎需要定义 keydown,如果未定义,则假定默认值为 ^@ ;由于未知原因,它会将 Enter 键视为按下键,而不是换行符。^@ 逻辑上是字符代码 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 成功编辑和重新编译该文件。