yeniden boyutlandırılabilir seri konsol penceresi?


25

Sistemimin seri konsolunu kullanırken her zaman ve ile $COLUMNS=80bitirdim $LINES=24.

Bu değişkenleri manuel olarak değiştirebildiğim halde, istemci tarafı terminal penceresi yeniden boyutlandırıldığında, bunu yapmak biraz can sıkıcıdır.

Genellikle konsolu kullanarak bağlanıyorum screen /dev/mytty baudrate.

Değişen $TERM"ekran" veya "xterm" çevre değişkeni yardım etmez.

gettyVt100 yerine bunlardan bazılarını aramam gerekir mi?

Ssh kullanarak aynı makineye bağlandığımda tüm bunların iyi sonuç verdiğini söylemeye gerek yok.

Yanıtlar:


26

Benden önce gelen yorumcular gibi, resizeher komuttan sonra çağrı yapmanın bir alternatifi yoktur , bu komuta sahip değilseniz ve ( xterm) içine bir paket yüklemek istemiyorsanız , işte aynı şeyi yapan iki POSIX kabuk betiği var. ANSI terminali kaçış kodlarını kullanarak:

res() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '\0337\033[r\033[999;999H\033[6n\0338' > /dev/tty
  IFS='[;R' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}

res2() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '\033[18t' > /dev/tty
  IFS=';t' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}

BTW, benim dosyamda .profileaşağıdakileri bulacaksınız: [ $(tty) = /dev/ttyS0 ] && res böylece terminal boyutu seri hat üzerindeki her oturum açmada (yönetim için kullandığım), örneğin cihazı yeniden başlattıktan sonra belirlenir.
Ayrıca, yeniden boyutlandırmanın her komuttan sonra çalışmasını sağlamak için çizginin orada olması için yorumlardaki açıklamalara bakın ( AFAIK'in[ $(tty) = /dev/ttyS0 ] && trap res2 DEBUG her zaman mümkün olmadığını veya her zaman mümkün olmadığını unutmayın busybox).


3
Not: Daha kalıcı hale getirmek [[ $(tty) == /dev/ttyS0 ]] && trap res2 DEBUGiçin, kabuk profili yapılandırmalarından birine ekleyin (örneğin /etc/profile, ~/.bash_profile). Bu, her komuttan sonra çalıştırılmasını sağlayacaktır (bu sadece eğer ekran / tmux / terminal-emulator ile pencereleri / panelleri yeniden boyutlandırıyorsanız iyi bir şey olacaktır).
rsaw

2
Birkaç dakika kullandıktan sonra, hızlı bir şekilde her ikisinin res& res2ilk giriş sırasında kullanmaktan başka bir şey için çok yavaş olduğunu fark ettim . Makinelerimde ikisinin de bitirmesi için 0,5 saniye alıyorlar ... bütün komutlarımı yavaş gösteriyor (DEBUG tuzağı ile birlikte kullanıldığında). Tüh! Buna sahip olamazsın. Sanırım yükleyeceğim xterm.
59'da

3
@ phk xterm's resizedaha hızlıdır - genellikle 0.002 saniye.
16'da

1
@ rsaw Ah, iyi bilmek, benzer davranacağını ve bu nedenle de benzer şekilde yavaş olacağını düşündüm. Bazılarında birinin busyboxbenim için yavaş göründüğünü hatırlıyorum .
phk

1
Bu bağımsız çözüm için teşekkürler. Yalnızca x11 veya xterm yüklü resizeolmayan ve yalnızca bir seçenek olmayan bir konsol dağıtımı kullanıyorum .
thom_nic

16

Sadece kayıt için, bu Sorunun cevabı: (Usenet kazandı):

Sanal terminal uygulamaları (iç çalışan Konsol Uygulamaları xterm, rxvtve arkadaşları) alacak SIGWINCHyeniden boyutlandırma işlemi gerçekleştikten sonra. Böylece uygulama, ilgili sinyal işleyicideki pencereyi vb. Yeniden çizebilecek.

Ne yazık ki seri konsol kullanırken, böyle bir mekanizma yoktur.

Bununla birlikte, uygulamanın aktif olarak mevcut konsolun Pencere boyutunu talep etmesi mümkündür . Bu yüzden ikinci en iyi şey, bunu her komut isteminde kabuk tarafından basıldığında yapmaktır.

Bu, önce özel bir yeniden boyutlandırma çalıştırılabilirini derleyerek ve sonra aşağıdakileri kullanarak gerçekleştirilebilir bashrc:

if [ $(tty) == '/dev/ttyS0' ]; then
  trap resize DEBUG
fi

Elbette bu, çalışma zamanı sırasında bir konsol uygulamasında konsol boyutu ayarlarını değiştirmez.


1
Tüm özellikleri sunan seri hat üzerinden bir protokol çalıştırmak mümkün olmuyor mu? Yani bir müşterimiz ve bir sunucumuz var. Hemen hemen her şeyi yapmak için bant içi kaçış dizilerini kullanabilirler ve hala düz bir metin seri konsolu ile çalışabilirler!
Evi1M4chine

1
Aslında, koddaki yorum, sürümünün resizesisteminizde yüklü olmadığını açıkça belirtir .
Thomas Dickey

9

Gibi "Yeniden" terminaller NAWS bir sonucudur ( Negotiate About Window Sizeadlı RFC 1073 Telnet Pencere Boyutu Seçeneği ).

Seri bağlantı noktası kullanarak doğrudan bilgisayara bağlıysanız, pazarlık yapılmaz ve bilgisayarın terminalinizin ekran boyutu hakkında doğrudan bir bilgisi olmaz.

Bir terminal boyutu pazarlayabilirse, bilgisayar SIGWINCH, terminalde çalışan uygulamalara gönderilir ve ekrana ilişkin görüşlerini güncellemelerini söyler.

Bilgisayar ekran boyutunu bilmediğinde, genellikle stty -a(satırlar ve sütunlar) ile gösterilen boyutu sıfıra ayarlar . Etkileşimli kullanım için, bu biraz dostça değildir ve bazı sistemler ortam değişkenlerini LINESve COLUMNSyardımcı olmak için kullanırlar. Atanan değerler olabilir uç açıklama elde edilebilir; daha sık onlar sadece kodlanmış. Bu değişkenler için yapılan sözleşme, örneğin curses uygulamaları use_envişlevinde açıkça baskılanmadıkça etkin olmalarını gerektirir . Olumlu tarafı, bu değişkenler güvenilir bilgi olmadığında faydalı olabilir. Negatif tarafta, bu değişkenleri değiştirmek için uygun bir yöntem yoktur.

resizeProgram (ile donatılmış bir yardımcı xterm) ekran boyutunun saptanması için VT100 tarzı imleç konumu rapor çıkış sırasını kullanabilir. Bu komut satırından çalıştırılabilir; (tekrar) otomatik olarak yapmak için uygun bir yol yoktur. Yan etki olarak, resizetarafından görülen satırlar / sütunlar hakkındaki bilgileri günceller stty. Güncellenmiş ortam değişkenleri sağlamada kullanımı, bunun gibi, nerede LINESve COLUMNS ne zaman olduğu gibi durumlar için yararlıdır ve güncellenmelidir.


3

İşte benim gömülü Linux sistemimde (Ostero Angstrom çalıştırıyor) benim için harika çalışan başka bir çözüm. Sadece .bashrc dosyamdan koştum. Yeniden boyutlandırma kullanmak istemedim çünkü bunun için bazı X paketleri kurmak gerekiyordu ve ben de istemedim.

Ahududu Pi'nize terminalinizin 24 hattan daha büyük olduğunu söylemek | Sığ Düşünceler Blog


3
Lütfen sadece bir bağlantı göndermeyin: ilgili ayrıntıyı burada ekleyin; böylece bilgiler burada da mevcut olacak ...
jasonwryan

1
Çok kötü Python'a ihtiyacı var.
Craig McQueen


1

Seri bir hat üzerinde bir kabuk oturumu çalıştırırken, resizeo oturuma ait komutu çağırmak yeterlidir - bağlantı kurduktan sonra ve her terminal geometrisi değiştikten sonra.

resizeKomut xterm'den bir parçasıdır ancak X11 bağlı değildir. Örneğin, Fedora'da ayrı olarak paketlenmiştir xterm-resize.

Nasıl çalışır: resize komutu, bazı imleç hareketleriyle yüksekliği / genişliği ölçer ve sonra bu değerleri kaçış dizileriyle terminale gönderir.

Zsh gibi bir kabuk ile bu, LINESve COLUMNSdeğişkenlerini de otomatik olarak günceller (alternatif olarak, komutların stdout'a yazdırdığı ihracat ifadelerini değerlendirebilir).

Bunun neden gerekli olduğu: yerel veya ssh oturumu ile terminal, geometri değişiklikleriyle ilgili oturumu işaret edebilir (bkz. SIGWINCH). Bu mekanizma seri bağlantı üzerinden çalışmaz.


0

İşte sadece bash için çalışan basit ve hızlı yeniden boyutlandırma işlevi. read -d delimZaman aşımının okumayı bitirmesine izin vermekten kaçınmak için bash'in kullanımıyla phk'nin res2'sinden değiştirilir .

resize() {
  old=$(stty -g)
  stty -echo
  printf '\033[18t'
  IFS=';' read -d t _ rows cols _
  stty "$old"
  stty cols "$cols" rows "$rows"
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.