Za każdym razem, gdy ktoś ustawia inny rozmiar wirtualnej konsoli, lessrozpoznaje rozdzielczość okna (zakładam, że ...); zgodnie z tym zmienia liczbę wierszy tekstu, które powinien wizualizować. Jak obliczany jest ten parametr?
Uhm ... ok, ale gdzie mogę znaleźć tę wykonaną procedurę?
Giuseppe Crinò
Odpowiedzi:
22
Jeśli szukasz sposobu na sprawdzenie ze skryptu, możesz wykonać jedną z następujących czynności:
Uruchom tput colsi tput lines, jak sugeruje manatwork
sprawdź wartości $ LINES i $ COLUMNS
Ale jeśli chcesz poznać szczegóły, zaczynamy:
W przypadku wirtualnych terminali (xterm, i in.) Istnieje ioctl()wywołanie systemowe, które powie ci, jaki jest rozmiar okna. Jeśli to możliwe, lesswykorzystuje to połączenie. Ponadto, po zmianie rozmiaru okna, cokolwiek działa w tym oknie, odbiera SIGWINCHsygnał, który lessinformuje, że powinien sprawdzić nowy rozmiar okna. Na przykład rozpocząłem lessuruchamianie (jako identyfikator procesu 16663), połączyłem się z nim stracei zmieniłem rozmiar okna. Oto co zobaczyłem:
Jest to również co tput colsi tput lineszrobić za kulisami, jeśli to możliwe. Aby uzyskać więcej informacji na temat tej metody, zobacz man tty-ioctli wyszukaj TIOCGWINSZ.
Jednak w przypadku innych terminali, takich jak te podłączone do portów szeregowych, nie ma możliwości bezpośredniego uzyskania tych informacji. W takim przypadku lesszaczyna szukać wskazówek w zmiennych środowiskowych.
LINESi COLUMNSczęsto będą ustawione na wymiary terminala. W rzeczywistości, jeśli bashlub zshmoże znaleźć wymiary terminala, automatycznie ustawi te zmienne, aby ułatwić niezbyt sprytnym programom sprawdzenie rozmiaru terminala. Jednak większość innych powłok, w tym dashi tcsh, nie ustawia tych zmiennych.
TERMjest zwykle ustawiony na typ terminala, w którym to przypadku baza danych terminfo może zawierać oczekiwany rozmiar terminala. Jeśli tput rowsnie możesz użyć IOCTL (na przykład, jeśli jesteś podłączony przez port szeregowy), wróci do wartości tutaj zarejestrowanych. W przypadku terminala, którego rozmiar może się zmienić, jest to tylko przypuszczenie i prawdopodobnie będzie błędne.
Aby uzyskać więcej informacji, zobacz man tputkomendę sterującą terminalem oraz man terminfolistę rzeczy, które możesz powiedzieć terminalowi, aby zrobił.
Nie jestem pewien, czy jest to informacja, której szukasz. Chyba lessrejestruje moduł obsługi sygnału SIGWINCH. Kiedy zmienia się wymiar terminala, otrzymuje SIGWINCHsygnał i sprawdza informacje tty dla bieżącego wymiaru terminala.
http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html
Odpowiedzi:
Jeśli szukasz sposobu na sprawdzenie ze skryptu, możesz wykonać jedną z następujących czynności:
tput cols
itput lines
, jak sugeruje manatworkAle jeśli chcesz poznać szczegóły, zaczynamy:
W przypadku wirtualnych terminali (xterm, i in.) Istnieje
ioctl()
wywołanie systemowe, które powie ci, jaki jest rozmiar okna. Jeśli to możliwe,less
wykorzystuje to połączenie. Ponadto, po zmianie rozmiaru okna, cokolwiek działa w tym oknie, odbieraSIGWINCH
sygnał, któryless
informuje, że powinien sprawdzić nowy rozmiar okna. Na przykład rozpocząłemless
uruchamianie (jako identyfikator procesu 16663), połączyłem się z nimstrace
i zmieniłem rozmiar okna. Oto co zobaczyłem:Jest to również co
tput cols
itput lines
zrobić za kulisami, jeśli to możliwe. Aby uzyskać więcej informacji na temat tej metody, zobaczman tty-ioctl
i wyszukaj TIOCGWINSZ.Jednak w przypadku innych terminali, takich jak te podłączone do portów szeregowych, nie ma możliwości bezpośredniego uzyskania tych informacji. W takim przypadku
less
zaczyna szukać wskazówek w zmiennych środowiskowych.LINES
iCOLUMNS
często będą ustawione na wymiary terminala. W rzeczywistości, jeślibash
lubzsh
może znaleźć wymiary terminala, automatycznie ustawi te zmienne, aby ułatwić niezbyt sprytnym programom sprawdzenie rozmiaru terminala. Jednak większość innych powłok, w tymdash
itcsh
, nie ustawia tych zmiennych.TERM
jest zwykle ustawiony na typ terminala, w którym to przypadku baza danych terminfo może zawierać oczekiwany rozmiar terminala. Jeślitput rows
nie możesz użyć IOCTL (na przykład, jeśli jesteś podłączony przez port szeregowy), wróci do wartości tutaj zarejestrowanych. W przypadku terminala, którego rozmiar może się zmienić, jest to tylko przypuszczenie i prawdopodobnie będzie błędne.Aby uzyskać więcej informacji, zobacz
man tput
komendę sterującą terminalem orazman terminfo
listę rzeczy, które możesz powiedzieć terminalowi, aby zrobił.źródło
Jeśli spojrzysz na kod źródłowy, poznasz
less
wywołania wioctl()
celu pobrania rozmiaru okna w systemie Linux.źródło
Nie jestem pewien, czy jest to informacja, której szukasz. Chyba
less
rejestruje moduł obsługi sygnałuSIGWINCH
. Kiedy zmienia się wymiar terminala, otrzymujeSIGWINCH
sygnał i sprawdza informacje tty dla bieżącego wymiaru terminala. http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.htmlźródło