Конфиг less и LESS_TERMCAP (как их подружить?)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Конфиг less и LESS_TERMCAP

Сообщение Hephaestus » 06.11.2015 08:37

Имею вот такую переменную
LESS_TERMCAP_md=$'\E[01;31m'
и хочу её загнать в конфиг less.

Вроде бы это возможно, ибо здесь, например, человек утверждает, что
The LESS_TERMCAP_* variables can be set in the environment or in the .lesskey file. It provides Less with alternative values for Terminal capabilities.

У меня не получилось. В конфиг она попадает, но не действует.
Догадываюсь, что причина в ESC-последовательности. То есть, вероятно, надо что-то экранировать.
Пробовал по-всякому.

Подскажите, как сделать.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Конфиг less и LESS_TERMCAP

Сообщение Bizdelnick » 06.11.2015 10:14

Hephaestus писал(а):
06.11.2015 08:37
LESS_TERMCAP_md=$'\E[01;31m'

А как это должно работать? Я про конструкцию вида $'...', первый раз такую вижу.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Конфиг less и LESS_TERMCAP

Сообщение Hephaestus » 06.11.2015 10:43

Bizdelnick писал(а):
06.11.2015 10:14
А как это должно работать?
Если эту переменную экспортировать, то при просмотре man-страниц будет изменена цветовая схема.
При условии, что less является пейджером для man.
Там таких переменных вообще-то много, но мне хватает одной.
Вот, например.
Как оно работает, я сам толком не знаю. В подробностях termcap не разобрался.
Вроде бы он устарел, и ему на смену давно пришёл terminfo, но для "раскраски манов" при просмотре в less по-прежнему используется termcap.
И я ни одного примера с terminfo+less для этой задачи не видел.
Разумеется, можно найти много других решений. От "экспортировать как обычно" до "попробовать другой пейджер".
Но мне просто стало интересно, можно ли это запихнуть в конфиг less так, чтобы это работало.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Конфиг less и LESS_TERMCAP

Сообщение Bizdelnick » 06.11.2015 12:04

А, вон оно что. Это bash-специфичная конструкция, вполне логично, что в .lesskey она не работает. А если просто то, что внутри, задать, не прокатит?
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 32
ОС: debian, fedora (i3-wm)

Re: Конфиг less и LESS_TERMCAP

Сообщение olecya » 06.11.2015 12:17

Я как то пользовалась вот таким, но не впечатлило, в конце файла .bashrc
alias man="env PAGER=less \
LESS_TERMCAP_md=$'\E[1;36m' \
LESS_TERMCAP_me=$'\E[22;39m' \
LESS_TERMCAP_so=$'\E[44;37m' \
LESS_TERMCAP_se=$'\E[49;39m' \
LESS_TERMCAP_us=$'\E[4;33m' \
LESS_TERMCAP_ue=$'\E[24;39m' \
man"
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Конфиг less и LESS_TERMCAP

Сообщение Bizdelnick » 06.11.2015 12:27

Занятно. Взял пример из мана lesskey:

Shell

% cat ~/.less #env LESS = -i LESSCHARSET = latin1 % man lesskey Cannot use lesskey file "/home/user/.less" - (press RETURN)

Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Конфиг less и LESS_TERMCAP

Сообщение Hephaestus » 06.11.2015 12:37

Bizdelnick писал(а):
06.11.2015 12:04
А если просто то, что внутри, задать, не прокатит?
Может и прокатит, если правильно задать.
Но напрямую LESS_TERMCAP_md=\E[01;31m не прокатывает. В частности, проглатывается бекслеш.
Пробовал экранировать LESS_TERMCAP_md=\\E[01;31m. Бекслеш сохраняется, но всё равно не работает.
Пробовал \E указывать как \x1B - не помогает.
Я так мыслю, там надо либо всю конструкцию в бинарном виде, либо это вообще невозможно.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Конфиг less и LESS_TERMCAP

Сообщение Bizdelnick » 06.11.2015 12:41

Hephaestus писал(а):
06.11.2015 12:37
Пробовал \E указывать как \x1B - не помогает.

Почему так? Тогда уж \x0E.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Конфиг less и LESS_TERMCAP

Сообщение Hephaestus » 06.11.2015 12:43

Bizdelnick писал(а):
06.11.2015 12:27
Занятно. Взял пример из мана lesskey:
Так работать не будет.
Вот это

$

#env LESS = -i LESSCHARSET = latin1

надо внутрь ~/.lesskey
Потом сделать lesskey -o .less .lesskey и он сформирует бинарный .less

Bizdelnick писал(а):
06.11.2015 12:41
Почему так?
Вычитал где-то в мане. То ли termcap, то ли lesskey, то ли less...
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Конфиг less и LESS_TERMCAP

Сообщение Bizdelnick » 06.11.2015 12:46

А, дошло, что я делаю не так. Прописывать-то надо в ~/.lesskey, а потом запускать lesskey, чтобы он сформировал ~/.less.
Upd. Не успел прочитать предыдущий пост. Всё правильно.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Конфиг less и LESS_TERMCAP

Сообщение Bizdelnick » 06.11.2015 13:02

Очень странно. Вот результат экспериментов:

Shell

% cat ~/.lesskey #env LESS = -R LESSOPEN = | /usr/share/source-highlight/src-hilite-lesspipe.sh %s LESS_TERMCAP_md = \e[01;31m % lesskey % hexdump -C ~/.less 00000000 00 4d 2b 47 63 00 00 65 00 00 76 25 01 4c 45 53 |.M+Gc..e..v%.LES| 00000010 53 00 81 2d 52 00 4c 45 53 53 4f 50 45 4e 00 81 |S..-R.LESSOPEN..| 00000020 7c 20 2f 75 73 72 2f 73 68 61 72 65 2f 73 6f 75 || /usr/share/sou| 00000030 72 63 65 2d 68 69 67 68 6c 69 67 68 74 2f 73 72 |rce-highlight/sr| 00000040 63 2d 68 69 6c 69 74 65 2d 6c 65 73 73 70 69 70 |c-hilite-lesspip| 00000050 65 2e 73 68 20 25 73 00 4c 45 53 53 5f 54 45 52 |e.sh %s.LESS_TER| 00000060 4d 43 41 50 5f 6d 64 00 81 1b 5b 30 31 3b 33 31 |MCAP_md...[01;31| 00000070 6d 00 78 45 6e 64 |m.xEnd| 00000076 %

То есть значение преобразуется корректно, но подсветка в man не работает. Остальные переменные ведут себя так, как и должны.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Конфиг less и LESS_TERMCAP

Сообщение /dev/random » 06.11.2015 13:46

Bizdelnick писал(а):
06.11.2015 13:02
То есть значение преобразуется корректно, но подсветка в man не работает. Остальные переменные ведут себя так, как и должны.

Подсветка в man и не должна работать. man (по крайней мере, в реализации man-db; ЕМНИП, другая реализация этого не делает) скармливает less страницу с уже подставленными escape-последовательностями. Тестировать нужно на чём-то вроде echo $'a\ba' | less. Кстати, в этом случае тоже есть кое-какие баги. Например, у меня less начинает отображение дефолтным способом и переходит на использование переменных из lesskey только после выполнения некоторых команд (например, "!"). Если использовать bashrc вместо lesskey, этот баг отсутствует.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Конфиг less и LESS_TERMCAP

Сообщение Bizdelnick » 06.11.2015 14:16

/dev/random писал(а):
06.11.2015 13:46
man (по крайней мере, в реализации man-db; ЕМНИП, другая реализация этого не делает) скармливает less страницу с уже подставленными escape-последовательностями.

Однако env LESS_TERMCAP_md=$'\e[01;31m' man less работает.

/dev/random писал(а):
06.11.2015 13:46
Тестировать нужно на чём-то вроде echo $'a\ba' | less.

Выделяется жирным, красным не красится. Так же, как и в man. echo $'a\ba' | env LESS_TERMCAP_md=$'\e[01;31m' less красит в красный.
man-db 2.7.0.2
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Конфиг less и LESS_TERMCAP

Сообщение /dev/random » 06.11.2015 14:20

Bizdelnick писал(а):
06.11.2015 14:16
Однако env LESS_TERMCAP_md=$'\e[01;31m' man less работает.

У меня нет.

Bizdelnick писал(а):
06.11.2015 14:16
Выделяется жирным, красным не красится.

Попробуй дать внутри less какую-нибудь команду вроде !ls.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Конфиг less и LESS_TERMCAP

Сообщение Bizdelnick » 06.11.2015 14:36

/dev/random писал(а):
06.11.2015 14:20
Попробуй дать внутри less какую-нибудь команду вроде !ls.

После этого покрасилось в красный. С man аналогично.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Конфиг less и LESS_TERMCAP

Сообщение /dev/random » 06.11.2015 14:46

Bizdelnick писал(а):
06.11.2015 14:36
После этого покрасилось в красный.

Похоже, less подхватывает переменные из lesskey только в определённые моменты, и запуск к этим моментам не относится. Придётся добавлять в окружение, а не конфиг.

Bizdelnick писал(а):
06.11.2015 14:36
С man аналогично.

Наверное, даже в пределах одной реализации разные версии man ведут себя по-разному.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Конфиг less и LESS_TERMCAP

Сообщение /dev/random » 06.11.2015 16:51

/dev/random писал(а):
06.11.2015 14:46
Bizdelnick писал(а):
06.11.2015 14:36
С man аналогично.

Наверное, даже в пределах одной реализации разные версии man ведут себя по-разному.

Выяснил причину. Дело не в man, а в groff. С некоторых пор его выходной формат изменился, но Debian принудительно задаёт старое поведение через /etc/groff/*.local. Старый формат: последовательности как на печатных машинках, т.е. "буква \b буква" - жирный, "_ \b буква" - подчёркивание, и т.д. Новый формат: escape-последовательности ansi-совместимых терминалов, т.е. "\e[1m" - жирный, "\e[4m" - подчёркивание, и т.д. Разумеется, в новом формате less не может управлять отображением, он просто выводит их на терминал как есть.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Конфиг less и LESS_TERMCAP

Сообщение Bizdelnick » 06.11.2015 17:08

/dev/random писал(а):
06.11.2015 16:51
Разумеется, в новом формате less не может управлять отображением

Почему — разумеется? Я разумею, что можно было бы запилить.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Конфиг less и LESS_TERMCAP

Сообщение Hephaestus » 06.11.2015 17:18

Bizdelnick писал(а):
06.11.2015 14:36
После этого покрасилось в красный. С man аналогично.
У меня то же самое.

И да, у меня вроде не man-db, хотя не знаю.

ls /var/log/packages/man*

man-1.6g-x86_64-1 man-pages-3.53-noarch-1

LANG=C man -v

man, version 1.6g

Последняя команда почему-то в utf-локали по-русски не отзывается нормально. Чего-то я со шрифтами, видать, недокрутил.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Конфиг less и LESS_TERMCAP

Сообщение /dev/random » 06.11.2015 17:23

Hephaestus писал(а):
06.11.2015 17:18
У меня то же самое.

Как я уже писал, единственное решение, которое я вижу - это вписать эти переменные в bashrc, а не lesskey.

Hephaestus писал(а):
06.11.2015 17:18

LANG=C man -v

man, version 1.6g

Последняя команда почему-то в utf-локали по-русски не отзывается нормально. Чего-то я со шрифтами, видать, недокрутил.

Нет, шрифты ни при чём. Это используемая в вашем дистрибутиве реализация man не до конца совместима с юникодом.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Конфиг less и LESS_TERMCAP

Сообщение Hephaestus » 06.11.2015 17:34

/dev/random писал(а):
06.11.2015 14:46
Придётся добавлять в окружение, а не конфиг.
Да я бы и не против, но...
Началось у меня с того, что git diff не показывал цвет, а показывал "сырой" текст с ESC-кодами.
Оказалось, это из-за LESS=-M(что именно делает эта опция, я так и не понял, кстати).
То есть, чтобы работала подсветка в git diff, нужно либо убирать -M, либо добавлять -R.
Я начал смотреть и обнаружил, что несколько переменных окружения для LESS прописаны в разных местах, причём порой одни и те же значения. Что-то осталось от старой системы из $HOME, что-то приехало с новой системой.
Ну вот, подумал, почему бы вместо кучи переменных не запихнуть всё это хозяйство в один конфиг куда-нибудь в /etc/sysless, тем более, что настройки эти, можно сказать, у всех моих пользователей одинаковые.
А тут вот такая незадача.

Зато нагуглился другой вариант

$

echo ‘xterm-mycolors, bold=\E[01;31m, sgr0=\E[0m, use=xterm,’ >myterm.ti tic myterm.ti export TERM=xterm-mycolors

Работает, как ни странно.

Есть ещё мысль и впрямь попробовать другой пейджер.
Посмотрел most, у него с подстветкой всё хорошо "из коробки", но он не vim-like. А я уже привык.
Присматриваюсь вот к vimpager. Но его в системе нет, собирать надо. В этом смысле less, конечно, выигрывает. Стандарт, можно сказать.


Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15809
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Конфиг less и LESS_TERMCAP

Сообщение Bizdelnick » 06.11.2015 17:36

Bizdelnick писал(а):
06.11.2015 17:08
Я разумею, что можно было бы запилить.

Собственно, разве опция -R не за это отвечает? Она у меня включена (см. .lesskey выше), и echo $'\e[01;31ma' | less показывает красную жирную букву 'a'.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Конфиг less и LESS_TERMCAP

Сообщение /dev/random » 06.11.2015 17:44

Bizdelnick писал(а):
06.11.2015 17:36
Bizdelnick писал(а):
06.11.2015 17:08
Я разумею, что можно было бы запилить.

Собственно, разве опция -R не за это отвечает? Она у меня включена (см. .lesskey выше), и echo $'\e[01;31ma' | less показывает красную жирную букву 'a'.

Она отвечает за то, что ты написал в этом сообщении, но не за то, что мы только что обсуждали. less без этой опции отображает escape-последовательности как текст. С этой опцией он выводит их на терминал, чтобы они сработали как положено. А мы обсуждали возможность замены их на то, что прописано в LESS_TERMCAP_*, как он заменяет последовательности "в стиле печатной машинки". Этого он не делает.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Конфиг less и LESS_TERMCAP

Сообщение Hephaestus » 06.11.2015 17:44

/dev/random писал(а):
06.11.2015 17:23
Нет, шрифты ни при чём. Это используемая в вашем дистрибутиве реализация man не до конца совместима с юникодом.
А сие из чего следует? Вообще-то "из коробки", русского языка в системе совсем нету.
Русифицируем по инструкции. И groff в том числе.
Поэтому, может статься, что я просто руссфикацию не до конца сделал.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Конфиг less и LESS_TERMCAP

Сообщение /dev/random » 06.11.2015 17:49

Hephaestus писал(а):
06.11.2015 17:44
А сие из чего следует? Вообще-то "из коробки", русского языка в системе совсем нету.
Русифицируем по инструкции. И groff в том числе.
Поэтому, может статься, что я просто руссфикацию не до конца сделал.

Это не groff виноват, а man. Это разные пакеты.

Hephaestus писал(а):
06.11.2015 17:34
Да я бы и не против, но...
Началось у меня с того, что git diff не показывал цвет, а показывал "сырой" текст с ESC-кодами.
Оказалось, это из-за LESS=-M(что именно делает эта опция, я так и не понял, кстати).
То есть, чтобы работала подсветка в git diff, нужно либо убирать -M, либо добавлять -R.

Вероятность 99.9999%, что это не из-за опции -M, а из-за того, что своим LESS=-M вы перекрываете ранее присвоенное значение, в котором была опция -R.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Конфиг less и LESS_TERMCAP

Сообщение Hephaestus » 06.11.2015 21:31

/dev/random писал(а):
06.11.2015 17:49
Это не groff виноват, а man. Это разные пакеты.
Понятно, что виноват не groff и что это разные пакеты.
Не понятно, как Вы определили, что это виноват именно man конкретной реализации,
а не мои кривые руки при русификации системы.

/dev/random писал(а):
06.11.2015 17:49
Вероятность 99.9999%, что это не из-за опции -M, а из-за того, что своим LESS=-M вы перекрываете ранее присвоенное значение, в котором была опция -R.
Во-первых, это не я перекрываю. ЕМНИП, она присутствовала изначально в /etc/profile.
Во-вторых, я полностью убирал из окружения переменные LESS. Подсветка работала. Стало быть, опция -R включена по умолчанию. Однако выяснить это не так просто: конфигов нет, маны на эту тему молчат, в слакбилде тоже ничего не обнаружилось.
В общем, мутная какая-то штука.

Мда. Чувствую, я почти созрел для испытаний vimpager.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4866
ОС: Gentoo

Re: Конфиг less и LESS_TERMCAP

Сообщение /dev/random » 06.11.2015 21:48

Hephaestus писал(а):
06.11.2015 21:31
Понятно, что виноват не groff и что это разные пакеты.
Не понятно, как Вы определили, что это виноват именно man конкретной реализации,
а не мои кривые руки при русификации системы.

Ну, я допускаю, конечно, что у маинтейнеров всех дистрибутивов, в которых я видел эту реализацию, одинаково кривые руки, но считаю это маловероятным.
Спасибо сказали: