Консоль FreeBSD. Доводка консоли

После смены разрешения экрана по умолчанию в консоли могут начаться мелкие (говорят, что и не очень мелкие) безобразия, исправление коих потребует ещё некоторых деяний.

Каких? -- спросите вы меня. Попробую ответить -- настало время вспомнить о файле /etc/ttys, а именно том третьем поле в описании консолей, толкующем о значении cons25r. Это -- имя типа терминала, приписанного данной виртуальной консоли. Обсуждение вопроса, что такое тип терминала, далеко выходит за пределы моих задач. И потому, в меру своего разумения, замечу, что слово это понимается, как минимум, в двух смыслах -- как синоним (более или менее) консоли, и как программа, эмулирующая некий
конкретный (т.е. "железный") терминал (что в режиме графическом, что в текстовом).

Впрочем, простой пользователь (вроде меня, скажем) понимать это и не обязан. Достаточно знать, что существует некий файл /etc/termcap, представляющий собой описание всех возможных и невозможных (относительно невозможных, вернее, вышедших из употребления, -- это точно, а вот что касается возможных -- тайна сия велика есть) терминалов. В том числе и тех, что не застали ни деды, ни отцы всемирной (чуть не написал -- всесоюзной) информатизации. Правда,
это -- не сам файл, а лишь символическая ссылка на /usr/share/misc/termcap. Однако объем последнего (а это просто перечисление в обычном текстовом формате, или, как задумчиво говорят, база данных) -- впечатляет: почти 200 Кбайт.

Так вот, в нем среди всяких Sun'ов, DEC'ов, pcvtXXXX и протчая (правда,
почти все они претендуют на воспроизведение некоего легендарного
ANSI-терминала, являющегося стандартным), нашлось место и для терминала
consXX, и его вариаций на тему consXXr. Легко догадаться, что цифры в названии указывают на число строк его видеорежима, а буква r -- на русификацию терминала (конкретно -- поддержку кодировки KOI8-R):

cons25w|ansiw|ansi80x25-raw:	:al=E[L:am:bs:NP:cd=E[J:ce=E[K:cl=E[HE[J:cm=E[%i%d;%dH:co#80:	:dc=E[P:dl=E[M:do=E[B:bt=E[Z:ho=E[H:ic=E[@:li#25:cb=E[1K:	:ms:nd=E[C:pt:rs=Ec:so=E[7m:se=E[27m:up=E[A:	:pa#64:Co#8:AF=E[3%dm:AB=E[4%dm:op=E[39;49m:AX:sc=E7:rc=E8:	:k1=E[M:k2=E[N:k3=E[O:k4=E[P:k5=E[Q:k6=E[R:k7=E[S:k8=E[T:	:k9=E[U:k;=E[V:F1=E[W:F2=E[X:K2=E[E:nw=E[E:ec=E[%dX:	:kb=^H:kh=E[H:ku=E[A:kd=E[B:kl=E[D:kr=E[C:le=^H:eo:sf=E[S:sr=E[T:	:kN=E[G:kP=E[I:@7=E[F:kI=E[L:kD=177:kB=E[Z:	:IC=E[%d@:DC=E[%dP:SF=E[%dS:SR=E[%dT:AL=E[%dL:DL=E[%dM:	:DO=E[%dB:LE=E[%dD:RI=E[%dC:UP=E[%dA:cv=E[%i%dd:ch=E[%i%d:bw:	:mb=E[5m:md=E[1m:mr=E[7m:me=E[m:bl=^G:ut:it#8:km:cons25|ansis|ansi80x25:	:ac=l332m300k277j331u264t303v301w302q304x263n305Da260f370g361~371.^Y-^Xh261i^U0333y363z362:	:tc=cons25w:...cons60-m|ansi80x60-mono:	:li#60:tc=cons25-m:# KOI8-R FreeBSD console with ACS supportcons25r|pc3r|ibmpc3r|cons25-koi8-r:	:ac=q200x201m204v211j205t206n212u207l202w210k203y230z231f234~225a220h221D.^Y-^Xi^U0215:	:tc=cons25w:

Вообще-то в termcap'е описаны все свойства
терминала, начиная от разрешения и кончая кодами функциональных клавиш. Если это не так -- в конце описания имеется поле :tc=имя_рек, указывающее, что отсутствующие свойства берутся из описания указанного терминала. Однако на данном этапе нас интересует только два свойства -- co (количество колонок) и li (количество линий). И если есть желание постоянно работать с нестандартным разрешением, нужно подобрать описание терминала с соответствующим их количеством. И во всех полях /etc/ttys заменить cons25r на, скажем, cons30r (при тридцатистрочной плотности символов по вертикали).

В отношении 80-колоночных режимов это сделать легко -- таковые среди терминалов consXX представлены в полном наборе. Однако попытки найти в семействе consXX типы терминала для 90- или 132-колоночного режима будут безуспешны. Хотя такие режимы обнаруживаются в иных семействах терминалов,
например, в pcvt. Однако не думаю, что использовать их -- здоровая идея. А от режима 800x600 вообще нет никаких следов. Что делать?

Иван Паскаль рекомендует создать описание собственного терминала в /etc/termcap. Которое в данном случае потребует только двух полей -- нового числа колонок (co) и ссылки на исходный тип (tc=имя_рек). Не забыв ограничить их разделителем полей -- двоеточием: все же это база данных, а не что иное. Однако по умолчанию файл /etc/termcap (вернее, то, на что он ссылается) закрыт для записи даже для root-оператора. Каковой, конечно, может присвоить себе такое право. Однако, видимо, разработчики полагали сие
нежелательным.

В итоге я, работая постоянно в режиме VGA_90x30, ограничиваюсь тем,
что указываю в etc/ttys свой тип терминала как cons30r -- и пока ни с какими сложностями не столкнулся. Не знаю, насколько это идеологически правильно. Но ведь нам, бывшим советским людям, всякие там идеологии по... (сами знаете, почему).

И ещё одно замечание, также имеющее отношение к идеологии. Считается правильным явным образом задать значение переменной TERM в стартовых файлах своей командной оболочки, т.н. dot-файлах. В Shell-совместимых средах (например, в ~/.profile для /bin/sh или в ~/.bash_profile для bash) это будет иметь вид

TERM=${TERM:-cons30r}export TERM

а в средах семейства C-Shell --

setenv    TERM      cons30r

Кроме того, при изменении видеорежима "на лету" (командой vidcontrol)
соответствующую переменную также, возможно, потребуется переопределить вручную, командой set. Иначе некоторые программы могут вести себя неправильно.


Содержание

. .