Vim не будет принимать новую строку Как enter
у меня есть установка vim по умолчанию в linux, в системе с эмулятором терминала vt52 и возможностью unicode.
все работает нормально до сегодняшнего дня, когда я переместил свой файл vt52 terminfo из временного локального каталога пользователей в постоянный системный каталог ... сначала это казалось прекрасным, но внезапно, когда я пытаюсь выполнить команду двоеточия, нажав enter (либо CTRL-J
, или сам ключ = = decimal 10), vim просто мигает на экране, но не выполните команду или оставьте режим ввода команды.
Однако, если я нажму CTRL-M
чтобы получить символ возврата каретки (десятичный 13), vim принимает команду.
я попытался скопировать файл обратно в ~/.terminfo
снова, но это не решило проблему...
я думал, что это может быть проблема tty или поврежденный файл vimrc, поэтому...
сначала я попытался удалить .viminfo
и .vimrc
файлы и делать stty sane
перед запуском vim, но ни один из них не помогает. Я только что заметил, что enter также не работает в режиме вставки, но CTRL-M работает.
затем я проверил из оболочки bash, используя CTRL-V
, что когда я нажимаю CTRL-M, он показывает ^M
и когда я нажимаю CTRL-J
, он просто заходит и ничего не показывает. Итак ... чтобы проверить ... я сделал stty raw
и cat - | hexdumpx
, и, конечно же, нажатие enter возвращает только 0x0a
и клавишей CTRL-M
возвращает только 0x0d
; таким образом, драйвер клавиатуры возвращает правильный символ в режиме raw, и я перепробовал в нормальном режиме, который очевидно, сопоставляет их обоих с 0x0A
.
файл termcap я повторно скомпилировал с tic и скопировал в оба ~/.terminfo/v/vt52u
где он работал нормально до ... и до /usr/share/terminfo/v/vt52u
.
но я не вижу ничего в файле termcap, что могло бы вызвать проблему.
vt52u|vt52 with UTF-8:
:am:eo:rs=EeEb0Eco:is=EEEe:
: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=Eb0Ec3:se=Eb0Eco:mh=Eb8Eco:mr=EboEc0:me=Eb0Eco:
:cl=EHEJ:cb=Eo:cd=EJ:ce=EK:
:km:kb=^h:
изменить: Я изолировал проблему экспериментом 5, перечисленным ниже, как вызванную чем-то или отсутствующим в вышеуказанном файле termcap, или в преобразовании компилятора tic об этом в terminfo.
Итак...какая запись termcap отсутствует или какая существующая вызывает проблему?
---------------------- дополнительные эксперименты, как я пытаюсь понять это -------------------
1: Делаем :set term
в vim показывает term=vt52u
.... и это правильно. Таким образом, VIM должен использовать вышеупомянутый файл termcap, но я не знаю, откуда (например: кэшированная версия или нет-или повреждена.) и: версия только показывает + termcap в котором говорится, что vim должен использовать скомпилированный файл termcap tic, который я пытался ему дать.
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, что плохо... предусмотренные определен только один ключ ... и это должно быть ^H не ^?, поэтому значение VIM не совпадает, но другие значения termcap все совпадение, так как ^[ совпадает с escape E в файле termcap. Итак, у меня есть доказательство того, что 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, чтобы удалить все встроенные терминалы и обеспечить отсутствие поврежденных файлов. Не имел никакого эффекта; не исправил значение по умолчанию ключа backspace неправильно.
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, который я перечислил выше, неисправно.
1 ответов
Это была уродливая ошибка для отслеживания методом проб и ошибок...
Vim, по-видимому, требует определения keydown, и если он не определен, он принимает значение по умолчанию ^@ ; по неизвестной причине он затем обрабатывает ключ ввода, как если бы это был ключ вниз, а не новая строка. ^@ логически является значением для символьного кода 0, null; который является единственным символом, который будет найден в пустой строке в "C" , в которой Vim записан и, похоже, запускает проблема / функция / ошибка.
но в любом случае в termcap, показанном в открывающем сообщении, символ kd не определен; и это то, что вызывает проблему.
в vim проблема может быть решена путем установки переменной keydown termcap в качестве той же escape-последовательности, которая обычно выходит из режима вставки, а затем делает букву j (вниз): : установить t_kd=\Ej
то же самое значение по умолчанию всегда можно добавить в записи termcap, тоже; Так как это вход escape-последовательность, а не выходная escape-последовательность терминала, она не конфликтует с escape-последовательностью "сохранить курсор" VT52, определенной в termcap; например: VT52 никогда не увидит ее, так как Linux tty, когда в режиме ввода строки не Эхо escape-последовательности, которые поступают с клавиатуры обратно на выход терминала.
Если терминал не имеет истинных клавиш со стрелками -- определение клавиш со стрелками как экранированных версий клавиш h,j,k и l vim может быть разумно совместимым решением, если он не конфликтует с другими программами, которые могут захотеть использовать эти входные escape-последовательности для других вещей. Я не использую emacs и другие популярные программы, которые могут хотеть эти escape-последовательности для чего-то, поэтому, если кто-то еще знает, какие (если есть) программы будут иметь проблемы с этим решением, комментарий будет уместен.
в ncurses 5.9 появляется ошибка в компиляторе terminfo, так что на многих установках (например: slackware 14) "tic" не сможет компилировать исходные файлы terminfo -- но только исходные файлы termcap. Если вам нужен исходный код termcap для произвольного терминала, вы можете запустить "infocmp-c fooTerminalName > fooTerminalName.tcap", чтобы система генерировала исходный файл termcap для вас, который можно редактировать и перекомпилировать с помощью Tic успешно.