Как настроить восстановление экрана в терминале?

10

В зависимости от терминала / среды следующая последовательность имеет разные эффекты:

$ ls
1
2
$ man ls
enter q

Либо я вижу последний отображенный экран man-страницы над текущим приглашением, либо вывод ls, и предыдущий вывод оболочки восстанавливается. Тот же эффект наблюдается, например, при использовании, vimа затем приостановке, чтобы сделать что-то на оболочке.

В Fedora 19 - экран по умолчанию выглядит как no-restore, gnome-терминал / xterm по умолчанию использует do-restore.

На Solaris это зависит от используемого терминала / terminfo db.

Я хочу настроить поведение восстановления последовательно между различными системами / терминалами.

maxschlepzig
источник
Если вы всегда запускаете экран GNU, вы получите последовательное поведение.
Иордания

Ответы:

16

Эта функция называется альтернативным экраном или переключением между обычным и альтернативным экраном.

Вы можете исследовать это, используя xterm. Например , тип man manВ одном xtermи выхода человека. Теперь вы можете переключиться на альтернативный экран с помощью Ctrl+ Mouse2 (средний щелчок) -> «Показать альтернативный экран». В качестве альтернативы вы можете напрямую ввести управляющие последовательности xterm , например:

$ echo -e '\033[?47h' # alternate screen
$ echo -e '\033[?47l' # normal screen

Последние две команды также работают в gnome-терминал (возможно, в других тоже).

То, что происходит, когда man/ vi/ lessи т.д. запускаются, в основном, они посылают абстрактную команду очистки экрана. При выходе (или приостановке) они отправляют абстрактную команду восстановления экрана. Как команда переводит в конкретные последовательности управления терминалом, определено в базе данных terminfo .

Отключить альтернативное переключение экрана

Что должно работать для всех терминалов, так это настроить локальные записи terminfo, то есть удалить отображение абстрактных экранных команд очистки / восстановления.

Вы можете сделать это так - для текущей $TERMзаписи (например, для gnome-терминала в Fedora 19):

$ echo $TERM
xterm-256color
$ infocmp -1 > xterm-256color
$ sed 's/^\(xterm-256color\)|/\1-na|/ ; /smcup\|rmcup/d ' \
    xterm-256color > xterm-256color-na
$ diff -u xterm-256color* 
--- xterm-256color  2013-08-04 16:33:52.041393461 +0200
+++ xterm-256color-na   2013-08-04 16:36:56.829930520 +0200
@@ -1,5 +1,5 @@
 #  Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm-256color
-xterm-256color|xterm with 256 colors,
+xterm-256color-na|xterm with 256 colors,
    am,
    bce,
    ccc,
@@ -155,7 +155,6 @@
    rin=\E[%p1%dT,
    rmacs=\E(B,
    rmam=\E[?7l,
-   rmcup=\E[?1049l,
    rmir=\E[4l,
    rmkx=\E[?1l\E>,
    rmm=\E[?1034l,
@@ -170,7 +169,6 @@
    sgr0=\E(B\E[m,
    smacs=\E(0,
    smam=\E[?7h,
-   smcup=\E[?1049h,
    smir=\E[4h,
    smkx=\E[?1h\E=,
    smm=\E[?1034h,
$ tic xterm-256color-na # loads the file to $HOME/.terminfo
$ find ~/.terminfo -type f
$ HOME/.terminfo/x/xterm-256color-na

Теперь вы можете проверить это с помощью:

$ TERM=xterm-256color-na man man # and then hit q

Вы можете повторить вышеуказанные шаги для других терминалов, если вы используете несколько. Если все работает как положено, вы можете установить его TERMчерез rc-файл оболочки.

Вы также можете напрямую указать имя терминала в качестве параметра infocmp, например:

$ infocmp -1 screen > screen

Включить альтернативное переключение экрана

Некоторые терминалы поддерживают альтернативную функцию переключения экрана (например, экран ), но отключают ее по умолчанию .

Поскольку screenвы можете включить его через ~/.screenrc:

$ cat ~/.screenrc
altscreen

Если вы осуществляете удаленный вход через ssh, скажем, в систему Solaris, возможно, удаленно настроенная общесистемная база данных terminfo является устаревшей, сломанной или содержит некоторые необычные / специфичные для Solaris значения по умолчанию, которые не соответствуют терминалам «переднего края» ты запускаешь ssh.

Таким образом, можно просто скопировать локальную базу данных terminfo из / usr / share / info (на клиенте) в host:~/.terminfo(на сервере).

Если скомпилированный формат terminfo не совместим, вы также можете экспортировать / импортировать записи, как в предыдущем абзаце.

Я пробовал использовать файл terminfo-db из установки Cygwin, и копирование его непосредственно в систему Solaris 10 сработало.

Если вы хотите разделить альтернативную базу данных terminfo между пользователями, вы указываете ее путь через TERMINFOпеременную окружения.

Игнорировать контрольную последовательность

Некоторые терминалы поддерживают отключение последовательности управления для альтернативного переключения экрана. Например, у xterm есть опция, у gnome-Terminal нет.

Для xterm это X-ресурс , например

XTerm*titeInhibit: true

Конфигурации, специфичные для программы

Некоторые программы имеют конфигурационные файлы для настройки команд последовательности / terminfo, которые они отправляют. Например

$ LESS=X less foo

настраивает lessне очищать / восстанавливать экран.

Для vimвас можно включить что-то вроде

set t_ti= t_te=

в тебе ~/.vimrc.

Я не нашел опцию, как настроить это поведение для top - по умолчанию он не отправляет экран восстановления.

maxschlepzig
источник
Sed cmd фактически удаляет всю строку, содержащую smcupили rmcup. В моем случае есть другие вещи, идущие на одной линии с ними. Эти другие вещи также были удалены. Так что, может быть, что-то вроде s/[sr]mcup=[^,]*,//'лучше.
Mingliang