less легко научить просматривать не только текстовые файлы, но и многие другие. Например, ей можно смотреть сжатые файлы или файлы PDF не задумываясь о вызове архиватора или нужного конвертера. Примерно так:$ less /usr/share/doc/less/changelog.gzСобственно, во многих дистрибутивах так уже настроено по умолчанию. В Debian эта возможность по умолчанию выключена. Чтобы она заработала нужно в ~/.bashrc (если пользуетесь bash) добавить eval $(lesspipe) или eval $(lessfile). Это установит переменные окружения LESSOPEN и LESSCLOSE, говорящие less пропускать файлы через указанный фильтр. Фильтр /usr/bin/lesspipe смотрит на расширение файла и запускает нужный конвертрер, если необходимо. Разница между lesspipe и lessfile в том, что первый конвертирует файлы на лету, сразу отдавая результат в less, а lessfile вначале полностью конвертирует файл, и только потом вызывает less.Понятно, что очень просто можно настроить пользовательские фильтры. Добавлять их нужно в пользовательский скрипт
~/.lessfilter. Например, чтобы просматривать с помощью less файлы OpenOffice, я добавляю фильтр, вызывающий antiodt, а чтобы просматривать файлы MSWord, фильтр, вызывающий antiword. Файл ~/.lessfilter выглядит при этом так:#!/bin/sh
(
case `echo "$1" | tr '[:upper:]' '[:lower:]'` in
*.odt)
if [ -x "`which antiodt`" ]; then antiodt "$1" ;
else cat "$1"; fi ;; # No antiodt available
*.doc)
if [ -x "`which antiword`" ]; then antiword "$1" ;
else cat "$1"; fi ;; # No antiword available
esac
) 2>/dev/nullP.S. Код раскрасил с помощью плагина toblog к vim, создающего цветной HTML согласно текущей цветовой схеме редактора.



Есть такая вещь как lesskey, а в ней есть возможность определять LESSOPEN и LESSCLOSE на лету, то есть не записывая их в переменные окружения.
ОтветитьУдалитьТо есть реальный пример:
- создаем файл ~/.lesskey
#env
LESSOPEN = |lesspipe %s
LESSCHARSET = koi8-r
LESSCHARDEF = 8bcccbcc18b95.b128.
LESSEDIT = %E ?lm+%lm. %f
Потом запускаем команду lesskey
после этого все работает
На самом деле через lesskey можно много чего в less настроить :-)
а не проще командой zless воспользоваться?
ОтветитьУдалить2chernomrdin:
ОтветитьУдалитьспасибо за подсказку, хотя по-моему для настройки LESSOPEN установка двух переменных окружения — прозрачнее
2antivan:
ну раньше и пользовался, пока не собрался man less прочитать :)
с zless неудобство, что буква z вначале, а *.gz — в конце; т.е. набираю less bla-bla<TAB> и вижу, что файл *.gz, значит надо вернуться в начало строчки, чтобы добавить z (в screen ^A + a + z, три лишних нажатия)
Пример файла ~/.lessfilter не совсем корректен. lessspipe определяет обработал ли пользовательский
ОтветитьУдалитьфильтр файл или нет по коду возврата. Поэтому на файлы тех форматов, что lessfilter не обрабатывет
он должен возвращать ненулевой код возврата. В противном случае стандартные правила
less-препроцессинга файлов (тот же *.gz) будут заслонены пользовательскими. То есть в конец case
следует добавить:
*)
exit 1
Из этого также следует, что громоздкие if-ы больше не нужны, — например, первая ветвь case
переписывается так:
[ -x "`which antiodt`" ] && antiodt "$1"
(Остальные, естественно, аналогично.)
2 Igor
ОтветитьУдалитьСпасибо, перечитал man lesspipe. Согласен. Заметку поправлю.
Присмотревшись, я понял, что, более того, проверка
ОтветитьУдалить[ -x "`which <нужная программа>`" ]
тоже не нужна: если нужная программа не будет найдена shell, скрипт lessfilter и так завершится с ненулевым кодом возврата. Всё сказанное делает lessfilter на удивленее компактнее и элегантнее! ;)