Bagaimana cara mengkonfigurasi pemulihan layar di terminal?

9

Tergantung pada terminal / lingkungan urutan berikut memiliki efek yang berbeda:

$ ls
1
2
$ man ls
enter q

Entah saya melihat layar halaman manual terakhir ditampilkan di atas prompt saat ini atau output ls dan output shell sebelumnya dikembalikan. Efek yang sama diamati misalnya ketika menggunakan vimdan kemudian menangguhkannya untuk melakukan sesuatu pada shell.

Pada Fedora 19 - layar default tampaknya tidak-restore, gnome-terminal / xterm menggunakan do-restore secara default.

Pada Solaris tergantung pada terminal / terminfo db tampaknya.

Saya ingin mengkonfigurasi perilaku pemulihan secara konsisten antara berbagai sistem / terminal.

maxschlepzig
sumber
Jika Anda selalu menjalankan layar GNU, Anda akan mendapatkan perilaku yang konsisten.
jordanm

Jawaban:

13

Fitur ini sepertinya disebut 'layar alternatif' atau beralih antara layar normal dan layar alternatif.

Anda dapat menjelajahinya menggunakan xterm. Misalnya, ketik man manan xtermdan keluar man. Sekarang Anda dapat beralih ke layar alternatif melalui Ctrl+ Mouse2 (klik tengah) -> 'Tampilkan layar alternatif'. Atau Anda dapat langsung memasukkan urutan kontrol xterm , misalnya:

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

Dua perintah terakhir juga bekerja di gnome-terminal (mungkin juga yang lain).

Apa yang terjadi ketika man/ vi/ lessdll. Startup pada dasarnya mereka mengirim perintah layar-jelas abstrak. Saat keluar (atau menangguhkan) mereka mengirim perintah layar pengembalian abstrak. Bagaimana perintah diterjemahkan ke urutan kontrol terminal beton didefinisikan dalam database terminfo .

Nonaktifkan pergantian layar alternatif

Apa yang harus bekerja untuk semua terminal adalah menyesuaikan entri terminfo lokal, yaitu menghapus pemetaan perintah layar clear / restore abstrak.

Anda dapat melakukannya seperti ini - untuk $TERMentri saat ini (untuk gnome-terminal di Fedora 19 misalnya):

$ 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

Sekarang Anda dapat mengujinya melalui:

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

Anda dapat mengulangi langkah-langkah di atas untuk terminal lain jika Anda menggunakan banyak terminal. Jika semuanya berfungsi seperti yang diharapkan, Anda dapat mengatur TERMmelalui file-shell shell Anda.

Anda juga dapat secara langsung menentukan nama terminal sebagai parameter untuk infocmp, misalnya:

$ infocmp -1 screen > screen

Aktifkan pergantian layar alternatif

Beberapa terminal mendukung fitur penggantian layar alternatif (mis. Layar ), tetapi nonaktifkan pada pengaturan standar .

Untuk screenAnda dapat mengaktifkannya melalui ~/.screenrc:

$ cat ~/.screenrc
altscreen

Jika Anda melakukan login jarak jauh melalui ssh ke - katakan - sistem Solaris mungkin basis-basis-data sistem-konfigurasi yang dikonfigurasikan dari jarak jauh adalah jenis yang bersejarah, rusak atau menyertakan beberapa standar khusus / tidak-spesifik Solaris yang tidak cocok dengan terminal 'edge edge' Anda menjalankan ssh.

Dengan demikian, ini adalah opsi untuk hanya menyalin basis data terminfo lokal dari / usr / share / info (pada klien) ke host:~/.terminfo(pada server).

Jika format terminfo yang dikompilasi tidak kompatibel, Anda juga dapat mengekspor / mengimpor entri seperti pada paragraf sebelumnya.

Saya sudah mencoba menggunakan terminfo-db dari instalasi Cygwin dan menyalinnya langsung ke sistem Solaris 10.

Jika Anda ingin membagikan terminfo db alternatif antara pengguna, Anda menentukan jalurnya melalui TERMINFOvariabel lingkungan.

Abaikan Urutan Kontrol

Beberapa terminal mendukung penonaktifan urutan kontrol untuk pergantian layar alternatif. Misalnya xterm memiliki opsi, gnome-terminal belum.

Untuk xterm itu adalah X-ressource , mis

XTerm*titeInhibit: true

Konfigurasi khusus program

Beberapa program memiliki file konfigurasi untuk mengkonfigurasi perintah kontrol urutan / terminfo apa yang mereka kirim. Sebagai contoh

$ LESS=X less foo

mengkonfigurasi lessuntuk tidak menghapus / mengembalikan layar.

Untuk vimAnda dapat memasukkan sesuatu seperti

set t_ti= t_te=

di dalam kamu ~/.vimrc.

Saya belum menemukan opsi bagaimana mengkonfigurasi perilaku itu untuk top - secara default tidak mengirim layar pemulihan.

maxschlepzig
sumber
Sed cmd sebenarnya menghapus seluruh baris yang berisi smcupatau rmcup. Dalam kasus saya, ada barang-barang lain yang sejalan dengan mereka. Barang-barang lainnya juga terhapus. Jadi mungkin sesuatu seperti s/[sr]mcup=[^,]*,//'itu lebih baik.
Mingliang