Birisi sanal konsol için farklı bir boyut ayarladığında less
, pencere çözünürlüğünü tanır (bunu varsayıyorum ...); buna göre, kaç satır metin görselleştirmesi gerektiğini değiştirir. Bu parametre nasıl hesaplanır?
Birisi sanal konsol için farklı bir boyut ayarladığında less
, pencere çözünürlüğünü tanır (bunu varsayıyorum ...); buna göre, kaç satır metin görselleştirmesi gerektiğini değiştirir. Bu parametre nasıl hesaplanır?
Yanıtlar:
Bir komut dosyasından kontrol etmenin bir yolunu arıyorsanız, aşağıdakilerden birini yapabilirsiniz:
tput cols
ve tput lines
insanlığın önerdiği gibiAncak ayrıntıları istiyorsanız, işte başlıyoruz:
Sanal terminaller (xterm, et al) ioctl()
için pencerenin ne büyüklükte olduğunu söyleyen bir sistem çağrısı vardır. Mümkünse, less
bu çağrıyı kullanır. Ayrıca, pencerenin boyutunu değiştirdiğinizde, o pencerede çalışan her ne olursa olsun, yeni bir pencere boyutunu kontrol etmesi gerektiğini bildiren bir SIGWINCH
sinyal alır less
. Örneğin, çalışmayı başlattım less
(işlem kimliği 16663 olarak), ona bağlandım strace
ve pencereyi yeniden boyutlandırdım. Ben de öyle gördüm:
$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
Bu aynı zamanda ne tput cols
ve tput lines
onlar yapabilirsen, perde arkasındaki ilişki. Bu yöntem hakkında daha fazla bilgi için, bkz man tty-ioctl
. TIOCGWINSZ.
Bununla birlikte, seri bağlantı noktalarına bağlı olanlar gibi diğer terminaller için bu bilgiyi doğrudan almanın bir yolu yoktur. Bu durumda, less
ortam değişkenlerinde ipuçları aramaya başlar.
LINES
ve COLUMNS
genellikle terminal boyutlarına ayarlanır. Aslında, terminal boyutlarını bulursa bash
veya zsh
bulabilirse, o kadar akıllı olmayan programların terminal boyutunu görmesini kolaylaştırmak için bu değişkenleri otomatik olarak ayarlar. Bununla birlikte, dash
ve dahil olmak üzere diğer kabukların çoğu tcsh
bu değişkenleri ayarlamaz.TERM
genellikle terminal tipine ayarlanır, bu durumda terminfo veri tabanı terminalin beklenen boyutunu içerebilir. Eğer tput rows
IOCTL kullanamaz (örneğin bir seri bağlantı noktası üzerinden bağlıysa,), burada kaydedilen değerlere geri düşecek. Boyutu değişebilen bir terminal için bu sadece bir tahmindir ve muhtemelen yanlıştır.Daha fazla bilgi man tput
için, terminali kontrol etme komutuna bakın man terminfo
ve terminalin yapmasını söyleyebileceğiniz şeylerin listesi için.
Kaynak koduna bakarsanız, Linux'ta pencere boyutunu almak için less
çağrıları bilirsiniz ioctl()
.
#ifdef TIOCGWINSZ
{
struct winsize w;
if (ioctl(2, TIOCGWINSZ, &w) == 0)
{
if (w.ws_row > 0)
sys_height = w.ws_row;
if (w.ws_col > 0)
sys_width = w.ws_col;
}
}
#else
#ifdef WIOCGETD
{
struct uwdata w;
if (ioctl(2, WIOCGETD, &w) == 0)
{
if (w.uw_height > 0)
sys_height = w.uw_height / w.uw_vs;
if (w.uw_width > 0)
sys_width = w.uw_width / w.uw_hs;
}
}
#endif
Aradığınız bilginin bu olup olmadığından emin değilim. Sanırım less
için bir sinyal işleyici kaydeder SIGWINCH
. Terminalin boyutu değiştiğinde, bir SIGWINCH
sinyal alır ve terminalin mevcut boyutu için tty bilgisini inceler.
http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html