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

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

$ ls 1 2 $ man ls enter q 

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

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

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

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

Функция, похоже, называется «альтернативным экраном» или переключением между обычным и альтернативным экраном.

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

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

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

Что происходит при запуске 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 - $ 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 db между пользователями, вы укажете его путь через переменную окружения TERMINFO .

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

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

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

 XTerm*titeInhibit: true 

Специфичные для программы конфигурации

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

 $ LESS=X less foo 

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

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

 set t_ti= t_te= 

в вас ~/.vimrc .

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