Исправление CTRL- * в vim под экраном GNU

10

Когда я запускаю vim под экраном GNU, я обнаружил, что комбинации клавиш CTRLсо стрелками и Pg * не работают должным образом.

Я использую vim-gnomeпакет Ubuntu 10.10 .

На другой машине, также работающей под управлением Ubuntu, это работало без проблем; к сожалению, сейчас у меня нет этой конфигурации.

Здесь есть связанный вопрос: Как исправить стрелки Ctrl + в Vim?

Однако предлагаемое решение заключается в переназначении сочетаний клавиш vim для работы с эмулятором терминала, в данном случае PuTTY. Я не припоминаю, чтобы что-то подобное делало, и подозреваю, что есть опция конфигурации экрана, которая решит эту проблему.

В списке рассылки gnu-screen также есть ветка, в которой говорится, что запуск vim via $ TERM=xterm vim- это подходящее исправление или обходной путь. Это работает, но я немного обеспокоен тем, что могут быть побочные эффекты. Это также не звучит достаточно знакомо, чтобы быть решением, которое я настроил на другом компьютере (если решение было необходимо).

созерцаемое
источник
+1 - у меня была такая же проблема и - как вы предложили - добавление term xtermв мой ~/.screenrcфайл исправило это для меня. Еще раз спасибо!
Джастин Этье

Ответы:

4

Как интуитивно сказано в его обновлении, добавление term xtermв ~/.screenrcфайл, похоже, решает эту проблему.

Джастин этир
источник
Ну ... да, но я пытаюсь найти какое-то объяснение, почему screenбы просто не распространять $TERMпеременную среды, а не переопределять ее "screen". Предположительно есть некоторые обстоятельства, где это важно иметь $TERM == screen.
интуитивно
3
@intuited: Причина, по которой Screen устанавливает, TERM=screenзаключается в том, что приложения, работающие внутри, обмениваются данными внутри терминала Screen: управляющие последовательности, которые они отправляют и получают, являются теми, что у Screen, а не теми терминалами, которые отображаются на самом терминале. Поскольку вы можете отсоединить сеанс Screen и подключить его к терминалу другого типа, этот уровень косвенности необходим.
Жиль "ТАК - перестань быть злым"
@ Жиль: Спасибо, я подозревал, что-то подобное. Какие проблемы могут возникнуть при его сбросе xterm?
интуитивно
1
Немного, потому что xterm и screen в основном совместимы. Но у каждого есть несколько возможностей, которых нет у другого, и если вы лжете приложениям, они могут использовать возможность, которая на самом деле не работает. Сравните вывод infocmp screenи infocmp xterm, и управляющие последовательности экрана с Xterm управляющими последовательностями . У меня нет срыва, чтобы предложить; большинство приложений не будут возражать, но некоторые могут вести себя раздражающе.
Жиль "ТАК - перестань быть злым"
2

Есть несколько других способов установить терминал, который работает в запущенных процессах:

  • В экземпляре рабочего экрана нажатие ^A- :и ввод команды term xtermприведут к тому, что вновь открытые экраны в этом экземпляре начнут работать с $TERMпеременной среды, установленной в xterm; это в свою очередь будет распространяться на вызываемые vimэкземпляры. Эти экземпляры vim будут отображать правильное поведение в отношении комбинаций CTRL; Я еще не обнаружил никаких побочных эффектов этой стратегии. Эта команда не влияет на существующие экраны. Эту команду, конечно, можно использовать в ~/.screenrcфайле, поэтому возможно, что этот метод использовался на другом компьютере.

  • В работающем экземпляре vim команда set term=xtermзаставит сочетания CTRL работать в этом экземпляре vim. У этого есть побочный эффект отключения X буфера обмена (то есть @*и @+) по причинам, которые я еще не понимаю. Интересно, что побочный эффект буфера обмена также возникает, когда команда :set term=screenвыполняется в экземпляре vim, с которого начинается $TERM=xterm.

phunehehe
источник
Этот ответ был взят из обновлений ОП. Все, что я сделал, это немного переформатировал и перефразировал.
phunehehe
2

Основная проблема заключается в том, что отображение, выполненное screenмежду фактическим терминалом (идентифицированным TERMпеременной окружения снаружи screen) и эмуляцией внутри, screenявляется неполным.

Если вам случится проверить его (используя vttest или tack ), вы можете заметить недостатки для

  • цвета
  • специальные клавиши

Попытка решить эти проблемы путем установки termв .screenrcимеет недостаток , заключающийся в том , что он работает только для данного фактического терминала, и не подходит для других терминалов реализации. В документации примечания

Использование термина команда не рекомендуется для целей не по умолчанию.

Существует другое решение (с другим недостатком), использующее эту функцию из screen документации :

Когда screen пытается определить имя терминала для себя, он сначала ищет запись с именем screen. термин , где термин является содержанием вашей $TERMпеременной. Если такой записи не существует, экран пытается screen(или screen-w, если терминал широкий (132 столбца или более)). Если даже эта запись не может быть найдена, vt100используется в качестве замены.

ncurses предоставляет несколько полезных альтернативных описаний терминалов для этого случая, например, screen.xterm-new , для устранения проблем в отображении экрана. На практике я использую TERM=xterm-new, а при запуске экрана получаю удобное отображение функциональных клавиш.

Возвращаясь к termнастройкам экрана , при тестировании вы можете заметить, что с отображением все еще остаются проблемы, которые решаются в этих альтернативах. Если бы можно было получить точное описание терминала, используя termэти альтернативы, были бы простые псевдонимы screen. Они не.

ncurses не предоставляет screen.xterm(sic), потому что:

  • TERM=xtermшироко используется для эмуляторов терминала, которые отличаются от xterm; добавление этого отображения только усугубит эту ситуацию (см., например, почему бы просто не использовать TERM со значением "xterm"? в FAQ по ncurses)
  • альтернативное имя с screen.xtermменьшей вероятностью будет установлено в удаленных системах (см. комментарий об изменении с июня 2015 г. в базе данных терминала).

В целом, однако, использование альтернативных имен лучше, чем использование termв вашем .screenrc: оно решает больше проблем, чем создает. Обратное верно для termнастройки.

Томас Дики
источник